首页 文章

Visual Basic将Excel工作表导入DataTable

提问于
浏览
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给我以下错误:

err

有人知道提供商ACE.OLEDB.12.0的最大容量是多少?或者如何解决这个问题?

仅供参考,这是SQL选择句子:

SELECT * FROM [Workflow data$A1:AC70276]

重要的是,如果我将行限制为20000(SELECT * FROM [工作流数据$ A1:AC20000]),这个过程运行正常!

2 回答

  • 0

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

    EDIT 我已经一起引发一些可比的C#代码来测试这种情况下,只能提供该接近这一规模的查询创建不一致的错误,从"System resource exceeded"到挂起到"OutOfMemoryExceptions."虽然我可以't say I'见过你精确的错误,我要说的这一行为开始对进口过程征税,以便随后可能发生不希望的不可预测的行为 . 如果可能的话,我建议将数据分成更小的块 .

    祝好运 .

  • 0

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

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

    SELECT * FROM [Workflow data$A1:AC70276]
    

    我用下一句话替换了它:

    SELECT * FROM [Workflow data$]
    

相关问题