通過oledb驅動讀取excel、csv資料丟失解決方案
1、問題出現
在開發應用程式的過程中,比較常用一功能就是通過oledb驅動讀取excel、csv、text等檔案;而最近有客戶反映,在使用簡訊平臺(下載地址:http://www.sms1086.com/product/detail-150.html),發現出現以下問題:
還有一種情況,excel只能匯入部分,而其他的匯入不進去。
而其他excel或text檔案,不會出現此類問題。但是將有問題的excel貼上到新建的檔案中,還會出現類似問題。
2、網上解答
查詢登錄檔,將TypeGuessRows=8 修改為 TypeGuessRows=0
下圖是Win10 64位企業版的修改位置,作業系統不通,修改地方不通;建議查詢登錄檔,修改所有TypeGuessRows為0
按照此方法,可解決Excel資料丟失問題。棒棒的~~~~~~~~
3、讀取Text檔案資料丟失
Excel檔案問題解決了,但是在讀取csv、text檔案,仍然出現數據丟失的問題,是什麼原因引起的呢?與excel對比,不難發現,還是登錄檔配置的問題。
通過查詢登錄檔,找到Text的驅動:
修改MaxScanRows=0即可解決問題。
4、TypeGuessRows詳解
要使用 Jet OLE DB 提供程式訪問 Excel 工作簿,請使用具有下列語法的連線字串:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\sms.xls;Extended Properties="Excel 8.0;HDR=YES;"
在連線字串中,用 Data Source 引數指定工作簿的完整路徑和檔名。Extended Properties 引數可包含兩種屬性:一個屬性用於 ISAM 版本,一個屬性用於指示表是否包括標題。
使用 Excel 工作簿時,預設情況下,區域中的第一行是標題行(或欄位名稱)。如果第一個區域不包含標題,您可以在連線字串的擴充套件屬性中指定 HDR=NO。如果您在連線字串中指定 HDR=NO,Jet OLE DB 提供程式將自動為您命名欄位(F1 表示第一個欄位,F2 表示第二個欄位,依此類推)。
與傳統的資料庫不同,在 Excel 表中沒有指定列的資料型別的直接方式。而是,OLE DB 提供程式通過對一列中的八行進行掃描來猜測
而登錄檔中TypeGuessRows=8,預設從前8行進行掃描來猜測該欄位的資料型別,設定TypeGuessRows=0表示不猜測資料型別。
5、MaxScanRows詳解
與Excel登錄檔引數雷同,MaxScanRows=19(16進位制)表示從前25行進行掃描猜測該欄位的資料型別。
在不修改登錄檔的情況下,可通過以下連線字串實現(VB程式碼):
strConn = "" strConn = strConn & "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFolder & ";" strConn = strConn & "Extended Properties=" strConn = strConn & Chr(34) strConn = strConn & "text;CharacterSet=UNICODE;HDR=Yes;FMT=Delimited;IMEX=1;MaxScanRows=0;" strConn = strConn & Chr(34) Set cn = New ADODB.Connection With cn .Provider = "Microsoft.Jet.OLEDB.4.0" ' this line is redundant, but it helps you read the code .ConnectionString = strConn .Properties("Jet OLEDB:Registry Path") = "SOFTWARE\TacticalApps\MyApp\1.0" .Mode = adModeRead .Open End With