C#通过OleDb读写excel表格几个要点

1,OleDbConnection 的连接字符串:

0ffice 97-2003 :

strConnection = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR={1};IMEX={2:D}\";", ExcelFilePath, HDR, IMEX);
 //HDR=No 表示ADO将不把你Excel文件的第一行作为字段名(此时使用默认字段名:F1,F2。。)
 //IMEX= 0写入模式,1读取模式,2连接读写模式(效率不高),"IMEX=1;" 则始终将“互混”数据列作为文本读取

office2007:

strConnection = string.Format("Provider==Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR={1};IMEX={2:D}\";", ExcelFilePath, HDR, IMEX);
                   

2,建立连接并打开:

           try
            {   
                Connection = new OleDbConnection(strConnection);

        /*   特别说明: 在C++中建立连接后,连接就可以直接使用。  在C#中,连接可以使用 datatable 等操作,但是连接此时处于关闭状态。//*/

               Connection.Open();   

              /*  特别说明,如果没有这一句,连接处于关闭状态,执行sql语句会提示错误:连接关闭不可用。我用一天的时间才研究出来 

                   这个貌似 MSDN 和 网上都没有相关资料和说明,我一直奇怪,建立连接都没任何错误,datatable.fill()都没问题,为何执行sql语句连接处于关闭不可用呢?

                   大部分情况大量数据回写导出到EXCEL表格,都会是SQL数据库,可以用 SqlBulkCopy ,只是我的数据库却是 SqlCe,不支持SqlBulkCopy 

                   所以,只能自己做线程执行插入语句。

                   貌似在 C++ 中,建立连接后,从来没有自己手动去Open,,,,,,,,,,,,,

              //*/ 

            }

            catch (OleDbException ex )
            {
            }

3,执行sql语句:

         try
            {
                OleDbCommand comm = new OleDbCommand(sqlstr, Connection);

                result = comm.ExecuteNonQuery(); //返回受影响的数据行数量。

            }
            catch (OleDbException e)
            {
            }

4,excel表格sql语句书写

       string sqlstr="select  F1,F2  from [Sheet1$] ";//注意表名称[] 和 $ 都不能少了。

5,读取的时候,部分数据丢失,或者错误。

      excel默认扫描前8行数据,以便自动识别字段数据类型,故,后面如果字段类型不符合,或者字段超长度,就会出现丢失。

      1,IMEX=1 连接的时候设为读取模式,将数字和字符始终做字符处理。

      2,修改注册表,将行数改更大 0 - 16;0代表整个表格。

             TypeGuessRows 设置为 0,,注意表格如果较大,10000行,改成0,则需要考虑性能和效率问题。
             [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel] 
             Windows 7 的注册表项目
             HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel

       3,修改注册表脚本

           @echo off  reg add HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel /v TypeGuessRows /t REG_DWORD /d 0 /f 
           @echo off  reg add "HKLM\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel" /v TypeGuessRows /t REG_DWORD /d 0 /f 
           @echo off  reg add "HKLM\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel" /v TypeGuessRows /t REG_DWORD /d 0 /f 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。