我目前正在使用Excel中的大量数据,我希望上传到VB.Net中的DataTable(每30列70,000行),并使用混合数据类型。
我正在使用下一个代码导入信息:
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给了我以下错误:
有人知道提供商ACE.OLEDB.12.0的最大容量是多少? 或者如何解决这个问题?
仅供参考,这是SQL选择句子:
SELECT * FROM [Workflow data$A1:AC70276]
重要的是,如果我将行限制为20000(SELECT * FROM [工作流程数据$ A1:AC20000]),则该过程正常工作!
答案 0 :(得分:0)
嗯......听说在某些情况下,ACE.OLEDB.12.0驱动程序中可能存在旧的工件式错误,因此查询超过60000行的Excel电子表格会产生奇怪的错误,例如这......虽然我自己也无法证明这一点,但我不禁想知道如果你将范围大小修改为旧Excel中的'65536行限制,或者+/-比如5%,会发生什么情况,如果错误会消失。特别好奇的是你用20000行尝试过它,显然它很有用。
编辑我已经将一些类似的C#代码放在一起来测试这个场景,并且只能提供接近这个大小的查询会产生不一致的错误,范围从“超出系统资源”到挂起到“OutOfMemoryExceptions” “。虽然我不能说我已经看到了你的确切错误,但我会说这种行为开始对导入过程征税,这样就可能产生不希望的不可预测的行为。如果可能的话,我建议将数据分成更小的块。
祝你好运。答案 1 :(得分:0)
我似乎找到了问题的解决方案。
基本上我删除了范围。在我使用的当前选择的句子中:
SELECT * FROM [Workflow data$A1:AC70276]
我用下一句话替换了它:
SELECT * FROM [Workflow data$]