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