【问题标题】:Saving Excel file of 50k rows using "ClosedXML" NuGet taking a very long time使用“ClosedXML”NuGet 保存 50k 行的 Excel 文件需要很长时间
【发布时间】:2020-09-04 11:08:42
【问题描述】:

我需要将数据保存到 Excel 文件 (.xlsx) 中。 在从不同的开发人员那里得到了几个关于这个 NuGet 的建议后,我决定使用“ClosedXML”NuGet (v0.95.3) (https://www.nuget.org/packages/ClosedXML/) 来实现它。

最近导出50k行时遇到问题:

  • 仅保存过程(在所有数据都已添加到文件之后)需要很长时间,大约 ~10 秒
  • 更不用说这些行的样式:字体、边框、调整列宽等大约需要 ~12 秒
  • 这更不用说我花了大约 20 来检索数据并将其写入文件的事实,所以在这种情况下,所有过程花费我 ~45 秒总计(太多了时间!!)。

我正在使用“SaveAs()”方法将数据保存到给定的流中,并且我已经使用了“XLEventTracking.Disabled”优化。

可能我不是第一个处理 Excel 文件的人,所以:

  1. 有没有人熟悉“ClosedXML”NuGet 并且过去遇到过这样的问题?
  2. 您是否使用不同的 NuGet for Excel 文件? (即使要花钱)。

提前致谢!

【问题讨论】:

  • xlsx 文件只是压缩的 xml。您可以创建一个两行 Excel 表,解压缩它,查看 xml,然后简单地生成一个包含 50,000 行的文本文件并压缩它。
  • ClosedXML 保留所有单元格的内存模型,并仅在您保存时将其写入文件。这样做的好处是可以使用非常有用的 API 来操作您的电子表格,但缺点是内存占用。如果您只想将数据转储到文件中,我会查看其他写入文件的工具。 (我是 ClosedXML 维护者)。

标签: c# .net excel nuget closedxml


【解决方案1】:

我已经使用ClosedXML 几年了,我不得不承认该库 - 从版本 0.95.1 开始 - 对于较大的 Excel 报表几乎无法使用。内存使用/足迹是一场灾难。一个非常大的报告可以轻松分配几 GB 的 RAM。

您看到的性能问题与GC(垃圾收集)有关。查看代码,您很快就会意识到修复此问题需要多次迭代改进。

我建议查看其他库。就个人而言,我更喜欢使用原生的libxlsxwriter 库。您可以使用DllImport interop 轻松与它集成。对于大型报告,请考虑Constant Memory 模式。在内存不变的情况下,它在 CPU 和 RAM 方面都优于 ClosedXML

【讨论】:

  • ClosedXML 维护者在这里。我真的很惊讶你说内存使用量是回归的。我们一直在努力,大约在 0.93 左右有一个重大改进。如果您有一个在 0.95.1 中出现倒退的特定用例,请将其记录在 repo 上。
  • 可以肯定的是,0.95.1 在很多方面都是一个改进。但还不够。只需创建一个包含 100 列和 100,000 多行的工作表。在我的测试中,我们轻松达到 6+ GB RAM 使用率。使用 libxlsxwriter,我们将 RAM 使用量保持在 20 MB 左右。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多