在VB.NET中读取大型excel文件很慢。

时间:2012-08-14 13:09:08

标签: excel-2010 vb.net

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

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

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

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

(我没有提供任何代码示例,因为网上有数千个这样的示例代码可用于建立与excel文件的连接(Office 2010)以及如何运行查询来读取记录)

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

Sabya

P.S - 使用带有8 GB RAM的核心2 duo与Windows Server 2008和Windows 7

4 个答案:

答案 0 :(得分:0)

enter image description here


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

另一个解决方案是将excel文件导出到csv并在之后读取它,我认为它也会很快。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  1. Ishikawa问,如果vb.net是必不可少的 - 我的回答是肯定的,因为它是用VB.Net Framework 4.0编写的应用程序的一部分。他还谈到将excel导出到csv并尝试 - 但是,我担心,如果开放和阅读需要花费这么多时间,(花了9个小时!!) - 转换无济于事。用户将杀死这个过程 - 我相信。

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

  3. KronoS支持Soandos,我已在上面回答。对于他/她的第二点,答案是 - 我必须要擅长 - 这是用户提供的。我无法改变它。

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

  5. 300,000条记录excel文件的总大小为61 MB - 它不是很大!!创造记忆问题?

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

答案 3 :(得分:0)

我在更新大型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