【问题标题】:How to import million-row Excel file to datatable?如何将百万行 Excel 文件导入数据表?
【发布时间】:2019-05-30 11:08:14
【问题描述】:

我有一个包含一百万行和 25 列的 Excel 文件。

当我将 Excel 数据传输到 datatable 时,只有 8000 到 9000 行被传输到 datatable。但该文件有一百万行。

我尝试了以下代码:


<connectionStrings>  
    <!--Connect excel for bulk upload-->
    <add name="Excel03ConString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"/>
    <add name="Excel07+ConString" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"/>
  </connectionStrings>

connString = String.Format(connString, excelPath)
        Using excel_con As New OleDbConnection(connString)
            excel_con.Open()
            Dim sheet1 As String = excel_con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing).Rows(0)("TABLE_NAME").ToString()
            Dim dtExcelData As New DataTable()
            dtExcelData.Columns.AddRange(New DataColumn(3) {New DataColumn("Document Type", GetType(String)), _
                                                            New DataColumn("Posting period", GetType(Decimal)), _
                                                            New DataColumn("Profit Center", GetType(String))                      })
            Using oda As New OleDbDataAdapter("SELECT * FROM [" + sheet1 + "]", excel_con)
                oda.Fill(dtExcelData)
            End Using
            excel_con.Close()
        End Using

我该如何解决这个问题?

【问题讨论】:

  • 我注意到您似乎只想要源数据中的三列 - 如果您按名称选择它们而不是使用 * 的所有列,它会更好吗?
  • @AndrewMorton 不,它没有改善。但是如果我将 .xlsx 转换为 .xls 格式,那么整个 65536 xls 限制将被复制到 datatable,对于 xlsx 只有 8456。此外,如果我直接从 VisualStudio 运行构建,则整百万条记录都将复制到 datatable。但发布仅复制 8456。我是否必须在 IIS 中进行任何更改?
  • 如何将连接字符串中的扩展属性部分更改为Extended Properties=""Excel 12.0 Xml;HDR=YES""? (来自connectionstrings.com。)
  • 如果还是不行,你可以试试How to import large excel file to datatable?中提到的ACE的第三方替代品
  • @AndrewMorton Properties=""Excel 12.0 Xml;HDR=YES"" 没有改变结果

标签: excel vb.net datatable oledb


【解决方案1】:

不要使用Excel.Application对象,直接通过xml操作从excel文件中读取数据。为此,我使用免费且 MIT 许可的 .NET 库 SpreadsheetLight (spreadsheetlight.com)。与 Excel 对象相比,它的速度非常快。

【讨论】:

  • 如果 Microsoft.Jet.OLEDB.4.0 和 Microsoft.ACE.OLEDB.12.0 实现分离逻辑来读取 excel 文件,我会感到非常惊讶!我宁愿相信他们要求 Excel-Object 将数据返回给他们。以自己的速度...
  • @christoph 谢谢。我检查了您指定的 spreadsheetlight。它看起来像一个导出库,但我想将 excel 导入 sql 所以我使用以下过程 1. 将 excel 上传到服务器 2. 使用 oledb 将 excel 表数据复制到数据表 3. 使用 sqlbulkcopy 将数据表复制到 sql 表
  • Excel 文件由谁制作?它还可以产生其他东西吗?我不认为性能瓶颈在于向 SQLServer 批量添加数据,特别是如果这只是 INSERT 语句。我担心它正在读取速度很慢的 excel 文件。 --- 确实我只使用了电子表格来导出,但希望它具有完整的读取接口以及它还可以用于修改数据...
  • @Christoph 不,驱动程序是完全独立的,这就是为什么它自 2000 年代以来就在 SSIS 和 Web 应用程序中使用(好的,1990 年代也是如此)。这就是为什么它也是一个单独的下载。它也是快速,因为它是本机实现
  • @user2248733。那么问题是速度损失在哪里? DataTable 的速度也相当优化。它是否以某种方式数据绑定到用户界面?
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 2013-05-02
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多