Visual Basic将Excel工作表导入DataTable

时间:2012-09-17 00:26:00

标签: vb.net excel import datatable ole

我目前正在使用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 :(得分: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$]