C# 读取Excel文件代码的几种片段收集

片段 1

using  System.Data.OleDb;

...


static   void  Main()
{
Application.Run(
new  Form1());
}

private   void  Form1_Load( object  sender, System.EventArgs e)
{
DataTable myT
= ExcelToDataTable( " D:/文件/新武昌站点资料.xls " , " sheet1 " );
String mystr
= myT.Rows[ 0 ][ 0 ].ToString();
this .textBox1.Text = mystr;
}

public   static  DataTable ExcelToDataTable( string  strExcelFileName,  string  strSheetName)
{
// 源的定义
string  strConn  =   " Provider=Microsoft.Jet.OLEDB.4.0; "   +   " Data Source= "   +  strExcelFileName  +   " ; "   +   " Extended Properties='Excel 8.0;HDR=NO;IMEX=1'; " ;

// Sql语句
// string strExcel = string.Format("select * from [{0}$]", strSheetName); 这是一种方法
string  strExcel  =   " select * from   [sheet1$] " ;

// 定义存放的数据表
DataSet ds  =   new  DataSet();

// 连接数据源
OleDbConnection conn  =   new  OleDbConnection(strConn);

conn.Open();

// 适配到数据源
OleDbDataAdapter adapter  =   new  OleDbDataAdapter(strExcel, strConn);
adapter.Fill(ds, strSheetName);

conn.Close();

return  ds.Tables[strSheetName];
}


很简单的代码,但是问题就出在连接字符串上面,后面一定要加上Extended Properties='Excel 8.0;HDR=NO;IMEX=1',HDR和IMEX也一定要配合使用,哈哈,老实说,我也不知道为什么,这样配合的效果最好,这是我艰苦调试的结果.IMEX=1应该是将所有的列全部视为文本,我也有点忘记了.至于HDR本来只是说是否要出现一行标题头而已,但是结果却会导致某些字段值丢失,所以其实我至今也搞不明白为什么,很可能是驱动的问题...

片段 2

提供两种方法:一个是直接打开excel文件,然后逐行读取,速度较慢;还有一种方法是通过OleDb连接,把excel文件作为数据源来读取
方法一:这种直接读取单元格的方法释放很重要。

  

Excel.Application excel  =   null ;
   Excel.Workbooks wbs 
=   null ;
   Excel.Workbook wb 
=   null ;
   Excel.Worksheet ws 
=   null ;
   Excel.Range range1 
=   null ;
   
object  Nothing  =  System.Reflection.Missing.Value;
    
   
try
   {
    excel 
=   new  Excel.Application();
    excel.UserControl 
=   true ;
    excel.DisplayAlerts 
=   false ;
                    
    excel.Application.Workbooks.Open(
this .FilePath,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing ) ;
    
    wbs 
=  excel.Workbooks;
    wb 
=  wbs[ 1 ];
    ws 
=  (Excel.Worksheet)wb.Worksheets[ " Sheet2 " ];
    
         
    
int  rowCount  =  ws.UsedRange.Rows.Count;
    
int  colCount  =  ws.UsedRange.Columns.Count;
    
if  (rowCount  <=   0 )
     
throw   new  InvalidFormatException( " 文件中没有数据记录 " );
    
if  (colCount  <   4  )
     
throw   new  InvalidFormatException( " 字段个数不对 " );
    
    
for  ( int  i  =   0 ;i    {

     
this .rowNo  =  i  +   1 ;
     
object [] row  =   new   object [ 4 ];
     
for  ( int  j  =   0 ;j < 4 ;j ++ )
     {
      range1 
=  ws.get_Range(ws.Cells[i + 2 ,j + 1 ],ws.Cells[i + 2 ,j + 1 ]);
      row[j] 
=  range1.Value;

      
if  (row[ 0 ==   null )
      {
       
this .isNullRecord ++ ;
       
break ;
      }
     }
                   
     
if  ( this .isNullRecord  >   0 )
      
continue ;

     DataRow dataRow 
=   this .readExcel(row);

     
if  ( this .isNullRecord  ==   1 )
      
continue ;
  
     
if  ( this .verifyData(dataRow)  ==   false )
      errFlag
++ ;
  
     
this .updateTableCurr(dataRow);
    }
    
   }
   
finally
   {
    
if  (excel  !=   null )
    {
     
if  (wbs  !=   null )
     {
      
if  (wb  !=   null )
      {
       
if  (ws  !=   null )
       {
        
if  (range1  !=   null )
        {
         System.Runtime.InteropServices.Marshal.ReleaseComObject(range1);
         range1 
=   null ;
        }
        System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
        ws 
=   null ;
       }
       wb.Close(
false ,Nothing,Nothing);
       System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
       wb 
=   null ;
      }
      wbs.Close();
      System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs);
      wbs 
=   null ;
     }
     excel.Application.Workbooks.Close();
     excel.Quit();
     System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
     excel 
=   null ;
     GC.Collect();
    }
   }

 

方法二:这里是fill进dataset,也可以返回OleDbDataReader来逐行读,数据较快
注:这种方法容易把混合型的字段作为null值读取进来,解决办法是改造连接字符串
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Erp1912.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
通过Imex=1来把混合型作为文本型读取,避免null值,详细请见http://www.connectionstrings.com

private  DataSet importExcelToDataSet( string  FilePath)
{
   
string  strConn;
   strConn 
=   " Provider=Microsoft.Jet.OLEDB.4.0; "   +   " Data Source= "   +  FilePath  +   " ;Extended Properties=Excel 8.0; " ;
   OleDbConnection conn 
=   new  OleDbConnection(strConn);
   OleDbDataAdapter myCommand 
=   new  OleDbDataAdapter( " SELECT * FROM [Sheet1$] " ,strConn);
   DataSet myDataSet 
=   new  DataSet();
   
try
   {
    myCommand.Fill(myDataSet);
   }
   
catch (Exception ex)
   {
    
throw   new  InvalidFormatException( " 该Excel文件的工作表的名字不正确, "   +  ex.Message);
   }
   
return  myDataSet;
}


片段 3

用c#读取excel文件,写到datagridview控件中

用c#读取excel文件,写到datagridview控件中


string  strconn  =   " Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties= "" Excel 8.0;HDR=Yes;IMEX=1'' "   "  ;

            OleDbConnection conn 
=   new  OleDbConnection(strconn);

            conn.Open();

            
if  (bo  ==   false )

            {

                comboBox1.Items.Clear();

                DataTable dt 
=  conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,  new   object [] {  null null null " TABLE "  });

                
foreach  (DataRow dr  in  dt.Rows)

                {

                    comboBox1.Items.Add((String)dr[
" TABLE_NAME " ]);

                    
// MessageBox.Show((String)dr["TABLE_NAME"]);

                }

                
// comboBox1.Text = comboBox1.Items[0].ToString();

            }

            
else

            {

                
string  sql  =   " select * from  "   +  comboBox1.Text;

                OleDbDataAdapter aper 
=   new  OleDbDataAdapter(sql, conn);

                DataSet myset 
=   new  DataSet();

                aper.Fill(myset, comboBox1.Text);

                dataGridView1.DataSource 
=  myset.Tables[comboBox1.Text];

            }

            conn.Close();

备注:

@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""

"HDR=Yes;" indicates that the first row contains columnnames, not data

"IMEX=1;" tells the driver to always read "intermixed" data columns as text

TIP! SQL syntax: "SELECT * FROM [sheet1$]" - i.e. worksheet name followed by a "$" and wrapped in "[" "]" brackets.

如果第一行是数据而不是标题的话, 应该写: "HDR=No;"

"IMEX=1;" tells the driver to always read "intermixed" data columns as text

片段 4

C#读取Excel文件数据    
相当简单,Excel就像数据库,每个Sheet就是一个Table. Microsoft.Jet.OLEDB驱动.
之后是DataReader循环,或DataSet处理都非常简单.

HTTP://BLOG.CSDN.NET/CRABO/
注意:数据类型的转换!!


#region  set connection
   
string  strConn  =   @" Provider=Microsoft.Jet.OLEDB.4.0;Data Source=  " + this .txtPath.Text + " ;Extended Properties=Excel 8.0; " ;
   myDataReader 
=   null ;
craboDbConnection 
=   new  OleDbConnection(strConn);
   OleDbCommand myOleDbCommand 
=   new  OleDbCommand( " SELECT * FROM [Sheet1$] " , myOleDbConnection);
   
#endregion

   
try
   {
    myOleDbConnection.Open();
    myDataReader 
=  myOleDbCommand.ExecuteReader();
    
while  (myDataReader.Read())
    {
       
this .txtSeq.Text = Convert.ToString(myDataReader.GetValue( 0 )); // 列1
        this .txtName.Text = Convert.ToString(myDataReader.GetValue( 1 )); // 列2
        this .txtPIN.Text = Convert.ToString(myDataReader.GetValue( 2 )); // 列3
    }
}
   
#region  Catch
   
catch (System.Threading.ThreadAbortException e)
   {
    System.Threading.Thread.ResetAbort();
    
this .lblResult.Text  =   " 线程被中断... " + e.Message;
   }
   
catch (Exception ex)
   {
    System.Windows.Forms.MessageBox.Show(ex.ToString());
   }
   
finally
   {
    
//  Always call Close when done reading.
     if  (myDataReader  !=   null )
     myDataReader.Close();

    
//  Close the connection when done with it.
     if  (craboDbConnection != null   &&  craboDbConnection.State  ==  ConnectionState.Open)
     craboDbConnection.Close();

    
if (webResponse != null )
     webResponse.Close();
   }
   
#endregion

你可能感兴趣的:(Excel)