2013-01-14 54 views
0

我正在將數據從Excel電子表格導入到VB.NET DataTable。此Excel電子表格在前18行中包含大量垃圾數據,包括大量空單元格。我最終在後期處理中刪除這些行,但我需要按原樣訪問Excel文件,而無需手動修改它。如何在OLEDB/JET DataTable中手動定義列類型?

我意識到設置IMEX=1指示Jet引擎假設所有列都是文本。但是,我將其設置爲另一個值時會遇到問題(下面會詳細介紹)。所以,默認的Jet引擎列類型掃描不能很好地工作。

我想要麼:

  1. 手動導入
  2. 強制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 

謝謝!

回答

1

你應該能夠說:

sql.Append("SELECT * FROM [" & totalDollars & "$A18:X95]") 

凡totalDollars是一個表名和X95是最後一個有效行。除非第18行可用,否則將無法包含標題。

+0

哇。這使它簡單得多!謝謝。除了對單元名稱進行硬編碼之外,還有什麼辦法可以將sheetName $ A18從最後一行的第一列中刪除? – TimeBomb006

+1

並非如此,但您應該可以從完整工作表的原始查詢或互操作中獲取最後一行/列。然後,您可以使用它來構建字符串:'&「$ A18:X」&last&「]」'AFAIR,您可以引用一個非常高的行/列,只會讀取使用的行/列。 – Fionnuala

相關問題