0
我正在將數據從Excel電子表格導入到VB.NET DataTable
。此Excel電子表格在前18行中包含大量垃圾數據,包括大量空單元格。我最終在後期處理中刪除這些行,但我需要按原樣訪問Excel文件,而無需手動修改它。如何在OLEDB/JET DataTable中手動定義列類型?
我意識到設置IMEX=1
指示Jet引擎假設所有列都是文本。但是,我將其設置爲另一個值時會遇到問題(下面會詳細介紹)。所以,默認的Jet引擎列類型掃描不能很好地工作。
我想要麼:
- 手動導入
- 強制Excel之前定義列類型掃描更多的行(我相信默認爲8),以確定列類型
但是,我確實有想法#2的問題。我沒有管理權限來打開regedit.exe
,所以我無法使用該方法修改註冊表。我之前通過導入密鑰避免了這種情況,但我不記得我是如何做到的。所以#1將是一個理想的解決方案,除非有人能幫助我實現想法#2。
這可能嗎?目前,我使用以下方法:
If _
SetDBConnect(_
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filepath & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""", True) Then
dtSchema = _dh.GetOleDbSchemaTable()
If _dh.Errors <> "" Then
Throw New Exception("::LoadFileToBuffer.GetOleDbSchemaTable::" & _dh.Errors())
End If
For Each sheetRow In dtSchema.Rows
If sheetRow("TABLE_NAME").ToString() = "TOTAL_DOLLARS$" Then
totalDollars = sheetRow("TABLE_NAME").ToString()
ElseIf sheetRow("TABLE_NAME").ToString() = "TOTAL_UNITS$" Then
totalUnits = sheetRow("TABLE_NAME").ToString()
End If
Next
'Get total dollars table
sql.Append("SELECT * FROM [" & totalDollars & "]")
dtDollars = _dh.GetTable(sql.ToString())
End If
謝謝!
哇。這使它簡單得多!謝謝。除了對單元名稱進行硬編碼之外,還有什麼辦法可以將sheetName $ A18從最後一行的第一列中刪除? – TimeBomb006
並非如此,但您應該可以從完整工作表的原始查詢或互操作中獲取最後一行/列。然後,您可以使用它來構建字符串:'&「$ A18:X」&last&「]」'AFAIR,您可以引用一個非常高的行/列,只會讀取使用的行/列。 – Fionnuala