【问题标题】:Reading large excel files in VB.NET is slow.在 VB.NET 中读取大型 excel 文件很慢。
【发布时间】:2012-08-14 13:09:08
【问题描述】:

我不知道标题是否正确 - 因此允许编辑使其正确。

问题 - 使用 Vb.net 代码,当我读取 100,000 条记录的 excel 文件时,使用连接字符串和 sql 查询,需要 3 分钟(对我来说太长 - 我想要一个解决方案,请)完成。

但是,当我提交另一个包含 300,000 条记录的 excel 文件时(我的要求是读取 5000 万条记录)- 花费的时间超过了 30 分钟(我无法容忍并杀死了该程序)

请帮助我理解这种差异以及为什么需要这么长时间才能阅读。

(我没有提供任何代码示例,因为网络上有成千上万的此类示例代码可用于了解如何建立与 Excel 文件(Office 2010)的连接以及如何运行查询以读取记录)

提前感谢您的帮助和时间。作为一种解决方案,我想将 300,000 条记录文件分割成每条 10,000 条记录的文件 - 但是,如何在不浪费打开和阅读时间的情况下做到这一点?

萨比亚

P.S - 在 Windows Server 2008 和 Windows 7 上使用 core 2 duo 和 8 GB RAM

【问题讨论】:

  • 你应该只使用vb.net来读取excel文件吗?
  • 您正在运行的查询是什么(查询可能很慢,而不是原始打开速度)
  • 我同意@soandos,但最好发布您用于查询和打开 Excel 文件的代码。根据此处的问题,它可能更适合 Stack Overflow。
  • 老实说,如果您正在处理这么大的东西,您需要考虑迁移到真正的数据库系统。 Excel 不是数据库。

标签: excel-2010 vb.net


【解决方案1】:



所以,我不使用 vb.net,但如果你熟悉 java,我可以建议你 Apache POI 库。 POI 将所有数据加载到内存中,对于我的情况,它运行良好,之后您可以将其存储到 mysql 或其他任何东西,我用 poi 读取了一百个文件,这对我很有帮助。 Here 我发现了一个与您的问题相似的问题。
here你可以找到POI性能讨论。

另一种解决方案是将excel文件导出到csv然后读取,我认为它也很快。

【讨论】:

    【解决方案2】:
    • 您可以在 Excel 加载后暂时禁用宏运行。
    • 内存限制是另一个原因,因为 excel 可能会使用大量内存。如果我运行这个大型电子表格 (100K) 单元格,我会将内存库耗尽到 16GB。
    • 确保对 excel 文件和硬盘进行碎片整理(您可以看到真正的影响)。
    • 如果从不关闭 PC,请尝试关闭并重新启动。这可以解放进程来卸载未使用的 dll。
    • 将 pagefile.sys 的大小至少增加到 RAM 的 2.5 倍,以便顺利进行数据事务。

    【讨论】:

      【解决方案3】:
      1. 石川问,vb.net 是否必不可少 - 我的回答是肯定的,因为它是用 VB.Net Framework 4.0 编写的应用程序的一部分。他还谈到了将 excel 导出到 csv 并尝试 - 但是,我担心,如果打开和阅读需要这么多小时,(花了 9 小时!!) - 转换将无济于事。用户将终止该进程 - 我敢肯定。

      2. Soandos 要求查询 - 它是 - “从 excel 文件中选择前 1*” - 我正在一一阅读。我认为,问题不在于这个查询,因为这个查询很好地读取了 100,000 条记录。

      3. KronoS 支持 Soandos,我已经在上面回答了。对于他/她的第二点,答案是 - 我必须拥有 excel 作为 - 这是用户提供的。我不能改变它。

      4. 我看不出是谁回答了这个问题——但禁用宏的想法——是一个很好的观点。我不应该禁用所有宏,所有过滤器并取消隐藏所有 - 以简单的方式读取所有数据吗?我会试试的。

      300,000 条记录的 excel 文件的总大小为 61 MB - 不是很大!造成内存问题?

      我发现在excel中单纯读取记录的速度并不是线性的。它在 4 秒内读取 10,000 条记录,但在 27 秒内读取 50,000 条,在 60 秒内读取 100,000 条等。我希望 - 如果有人能告诉我如何索引 Excel 文件以读取大文件。当我得到一个 5000 万行的 excel 文件时,我不知道问题的大小是多少?

      【讨论】:

      • 你能给我一个代码链接以这种速度读取数据吗?或者只是没有内存不足的例外情况
      【解决方案4】:

      我在更新大型 Excel 文件时遇到了类似的问题。我的解决方案 - 更新它的一部分,关闭,终止 excel 进程,重新打开,再次更新

              oexcel.DisplayAlerts = False
              obook.SaveAs(fnExcNew, 1)
              obook.Close()
              obook = Nothing
              KillExcel()
              oexcel = CreateObject("Excel.Application")
              oexcel.Workbooks.Open(fnExcNew)
              obook = oexcel.ActiveWorkbook
              osheet = oexcel.Worksheets(1)
      
      Private Sub KillExcel()
          ' Kill all excel processes 
          Dim pList() As Process
          Dim pExcelProcess As System.Diagnostics.Process
          pList = pExcelProcess.GetProcesses
          For Each pExcelProcess In pList
              If pExcelProcess.ProcessName.ToUpper = "EXCEL" Then
                  pExcelProcess.Kill()
              End If
          Next
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        • 2020-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多