0

我目前正在处理 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 [Workflow data$A1:AC20000]),则该过程可以正常工作!

4

2 回答 2

0

嗯..听说在某些情况下,ACE.OLEDB.12.0 驱动程序中可能存在一个旧的、工件样式的错误,这样对超过 60000 行的 Excel 电子表格的查询可能会产生类似这样的奇怪错误。 .虽然我自己无法证明这一点,但我不禁想知道如果您将范围大小修改为旧 Excel 中的 ol' 65536 行限制,或者 +/- 说 5%,如果错误会发生离开。它特别好奇你用 20000 行尝试它并且它显然有效。

编辑我已经汇总了一些可比较的 C# 代码来测试这个场景,并且只能提供接近这个大小的查询会产生不一致的错误,从“超出系统资源”到挂起到“OutOfMemoryExceptions”。虽然我不能说我已经看到了您的确切错误,但我会说这种行为开始对导入过程征税,因此可能会出现不受欢迎的行为,如果不是不可预测的行为。如果可能的话,我建议将数据分成更小的块。

祝你好运。

于 2012-09-17T01:09:29.873 回答
0

似乎我找到了问题的解决方案。

基本上我删除了范围。在我使用的当前选择的句子中:

SELECT * FROM [Workflow data$A1:AC70276]

我用下一句替换了它:

SELECT * FROM [Workflow data$]
于 2012-09-20T03:19:07.720 回答