1. 程式人生 > >通過oledb驅動讀取excel、csv資料丟失解決方案

通過oledb驅動讀取excel、csv資料丟失解決方案

1、問題出現

      在開發應用程式的過程中,比較常用一功能就是通過oledb驅動讀取excel、csv、text等檔案;而最近有客戶反映,在使用簡訊平臺(下載地址:http://www.sms1086.com/product/detail-150.html),發現出現以下問題:

image

    還有一種情況,excel只能匯入部分,而其他的匯入不進去。

    而其他excel或text檔案,不會出現此類問題。但是將有問題的excel貼上到新建的檔案中,還會出現類似問題。

2、網上解答

    查詢登錄檔,將TypeGuessRows=8 修改為 TypeGuessRows=0

    下圖是Win10 64位企業版的修改位置,作業系統不通,修改地方不通;建議查詢登錄檔,修改所有TypeGuessRows為0

QQ圖片20170218184340

    按照此方法,可解決Excel資料丟失問題。棒棒的~~~~~~~~

3、讀取Text檔案資料丟失

    Excel檔案問題解決了,但是在讀取csv、text檔案,仍然出現數據丟失的問題,是什麼原因引起的呢?與excel對比,不難發現,還是登錄檔配置的問題。

    通過查詢登錄檔,找到Text的驅動:

image

    修改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 提供程式通過對一列中的八行進行掃描來猜測

該欄位的資料型別。您可以通過為連線字串的擴充套件屬性中的 MAXSCANROWS 設定指定一個一 (1) 至十六 (16) 之間的值,來更改要掃描的行數。

    而登錄檔中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