2012-09-17 128 views
0

我目前正在使用Excel中的大量數據,並且我想用混合數據類型將其上傳到VB.Net中的DataTable(每30列70,000行)。Visual Basic導入Excel表格到DataTable

我用下面的代碼導入的信息:

Public Function mc_ExcelTableToDataTable(ByRef ExcelApp As Excel.Application, _ 
              ByVal SheetName As String, _ 
              ByVal TableName As String, _ 
              Optional ByVal FilePath As String = "", _ 
              Optional ByVal SQLsentence As String = "") As DataTable 


     Dim vPath As String 
     Dim vCloseExcelWorkbook As Boolean = False 

     If ExcelApp.ActiveWorkbook IsNot Nothing Then 
      vPath = IIf(FilePath = "", ExcelApp.ActiveWorkbook.FullName, FilePath) 
     Else 
      vPath = FilePath 
     End If 

     If SQLsentence = "" And ExcelApp.ActiveWorkbook Is Nothing Then 
      vCloseExcelWorkbook = True 
      ExcelApp.Workbooks.Open(vPath) 
     End If 

     Dim vRange As String = ExcelApp.Sheets(SheetName).ListObjects(TableName).Range.AddressLocal 

     vRange = vRange.Replace("$", "") 

     Dim vCNNstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
            "Data Source= " & vPath & ";" & _ 
            "Extended Properties=""Excel 8.0;HDR=YES;IMEX=1""" 

     Dim ExcelCNN As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection(vCNNstring) 

     Dim vSQL As String = IIf(SQLsentence = "", _ 
           "SELECT * FROM [" + SheetName + "$" & vRange & "]", _ 
           SQLsentence) 

     Dim ExcelCMD As System.Data.OleDb.OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter(vSQL, ExcelCNN) 

     ExcelCNN.Open() 
     Dim ExcelDS As System.Data.DataSet = New DataSet 
     ExcelCMD.Fill(ExcelDS) 

     mc_ExcelTableToDataTable = ExcelDS.Tables(0).Copy 

     ExcelCMD = Nothing 
     ExcelCNN.Close() 

     ExcelDS.mc_Dispose() 

     If vCloseExcelWorkbook Then ExcelApp.ActiveWorkbook.Close(False) 

     GCcleaner() 
    End Function 

但是,VB.Net給我下面的錯誤:

err

有人知道什麼是最大容量ACE.OLEDB.12.0的提供者? 或者如何解決這個問題?

僅供參考,這是SQL選擇一句:

SELECT * FROM [Workflow data$A1:AC70276] 

是很重要的一提的是,如果我限制行20000(SELECT * FROM [工作流程數據$ A1:AC20000]),過程工作正常!

回答

0

似乎我找到了問題的解決方案。

基本上我刪除了範圍。在目前選擇句話我用:

SELECT * FROM [Workflow data$A1:AC70276] 

我更換了,由下句:

SELECT * FROM [Workflow data$] 
0

嗯....聽說在某些情況下,ACE.OLEDB.12.0驅動程序中可能存在一箇舊的工件樣式的錯誤,因此對超過60000行的Excel電子表格的查詢可能會產生奇怪的錯誤像這樣......雖然我無法證實這一點,但我不禁想知道如果您將範圍大小修改爲舊Excel中的行65536行限制,或者+/-說5%,則會發生什麼情況,如果錯誤會消失。它特別好奇你用20000行試過它,它顯然工作。

編輯我已經一起引發一些可比的C#代碼來測試這種情況下,只能提供該接近這一規模的查詢創建不一致的錯誤,從「系統資源超標」來掛到「OutOfMemoryExceptions。」雖然我不能說我已經看到了您的確切錯誤,但我會說這種行爲開始對導入過程徵稅,以致可能會出現不可取的(如果不可預測的)行爲。如果可能的話,我建議將數據分成更小的塊。

祝你好運。