c# - 使用“ClosedXML”NuGet 保存 50k 行的 Excel 文件需要很长时间
问题描述
我需要将数据保存到 Excel 文件 (.xlsx) 中。在从不同的开发人员那里获得了一些关于这个 NuGet 的建议后,我决定使用“ ClosedXML ”NuGet (v0.95.3) ( https://www.nuget.org/packages/ClosedXML/ ) 来实现它。
最近在导出50k 行时遇到问题:
- 仅保存过程(在所有数据都已添加到文件之后)需要很长时间,大约10 秒
- 更不用说这些行的样式:字体、边框、调整列宽等大约需要12 秒。
- 这没有提到我需要大约 20 分钟来检索数据并将数据写入文件的事实,所以在这种情况下,所有过程总共需要大约 45 秒(太多时间!!)。
我正在使用“SaveAs()”方法将数据保存到给定的流中,并且我已经使用了“ XLEventTracking.Disabled ”优化。
可能,我不是第一个处理 Excel 文件的人,所以:
- 有没有人熟悉“ ClosedXML ”NuGet 并在过去遇到过这样的问题?
- 您是否使用不同的 NuGet for Excel 文件?(即使花钱)。
提前致谢!
解决方案
我已经使用ClosedXML
了几年,我不得不承认该库 - 从版本开始0.95.1
- 对于较大的 Excel 报告几乎无法使用。内存使用/足迹是一场灾难。一个非常大的报告可以轻松分配几 GB 的 RAM。
您看到的性能问题与GC
(垃圾收集)有关。查看代码,您很快意识到修复此问题需要多次迭代改进。
我建议查看其他库。就个人而言,我更喜欢使用原生的libxlsxwriter库。您可以使用DllImport互操作轻松与其集成。对于大型报告,请考虑使用恒定内存模式。凭借恒定的内存,它ClosedXML
在 CPU 和 RAM 方面都表现出色。
推荐阅读
- java - 是否可以在没有 Firebase Cloud Messaging (FCM) 的情况下向所有安装了我的应用程序的设备发送推送通知?
- javascript - 将对象从 BoxBufferGeometry 更改为 BufferGeometry 时,弹药 js 中的 enableAngularMotor 似乎不起作用
- android - 使用 Gradle 的 Worker API 减少 gradle build 任务中的构建时间
- c# - 有什么方法可以模拟对 websocket 的请求
- assembly - 有没有办法在一条指令中比较 2 个压缩的 qwords?
- apache-spark - SPARK - 如何将列解析为时间戳?
- python - 使用 python 在所有区域中查找正在运行的 ec2 实例
- javascript - 如何在原版 Jekyll 页面上使用 Podlove 客户端?
- java - 如何使用 Android Studio 在 android 应用程序中可视化音频文件?
- sql - 基于sql server中第一行值的数据