【问题标题】:Optimize Apache POI .xls file append优化 Apache POI .xls 文件追加
【发布时间】:2022-01-06 06:45:07
【问题描述】:

如果有一种内存有效的方法可以附加到 .xls 文件,请告诉我。 (客户非常坚持报告的 .xls 文件,我做了所有可能的研究,但徒劳无功)我所能找到的是,要附加到现有的 .xls,我们首先必须将整个文件加载到内存中,附加数据,然后写回来。那是唯一的方法吗?我可以放弃按时优化内存消耗。

【问题讨论】:

  • 你说的文件有多大?
  • 报告的大小可能在 200 MB 到 2 GB 之间
  • 这里提到了关于大文件的限制poi.apache.org/components/spreadsheet/limitations.html,有一些关于使用流读写文件的建议,尽管我无法帮助你实现,因为我从未使用过这些.
  • 已经看过那个文档了。不幸的是,所有教程/指南都只处理优化读/写任务。在我的情况下,即使我有效地读取它,我仍然必须将所有这些数据保存在内存中。
  • 换成.xlsx.csv ?

标签: java excel apache-poi xls hssf


【解决方案1】:

恐怕使用apache poi 是不可能的。我怀疑其他图书馆是否有可能。甚至 Microsoft 应用程序本身也需要始终打开整个文件才能使用它。

所有 Microsoft Office 文件格式都具有类似于文件系统的复杂内部结构。该内部系统的各个部分可能相互关联。因此,不能像使用纯文本文件或 CSV 文件或单个 XML 文件那样简单地将数据流式传输到这些文件中并附加数据。人们总是需要考虑完整文件系统的有效性及其现实。所以总是需要知道完整的文件系统。不在内存中时应该在哪里知道?

现代 Microsoft Office 文件格式是 Office Open XML。这是包含内部文件系统的 ZIP 档案,其目录结构也包含 XML 文件和其他文件。因此,可以通过直接从该 ZIP 文件系统读取数据部分来减少内存占用,而不是通过解压缩 ZIP 文件系统将所有数据读取到内存中。这就是apache poiXSSF and SAX (Event API) 的尝试。但这仅供阅读。

对于写入方法,可以将部分数据(单个 XML 文件)写入临时文件以使它们远离内存。然后在所有写入完成后,将这些临时文件中的完整 ZIP 文件系统放在一起。这就是SXSSF (Streaming Usermodel API) 试图做的事情。但这只是为了写作。

在将数据附加到现有的 Microsoft Office 文件时,以上任何方法都不可用。因为,正如已经说过的,人们总是需要考虑完整文件系统及其现实的有效性。所以总是需要知道完整的文件系统。因此,始终需要可以访问整个文件系统以将数据部分附加到它并更新关系。可以考虑将所有数据部分(单个 XML 文件)和关系部分放在临时文件中,以使它们远离内存。但我不知道有任何图书馆(可能是像 Aspose 这样的闭源图书馆)这样做。我怀疑这是否会以一种高效的方式实现。所以你会花时间来减少内存占用。

较旧的 Microsoft Office 文件格式是二进制文件系统,但也包含复杂的内部结构。单个部分是二进制记录流,它们也可能相互关联。所以主要问题与 Office Open XML 相同。

Event API (HSSF Only) 尝试读取单记录流,类似于 Office Open XML 的事件 API。但是,当然,这只是为了阅读。

到目前为止,还没有用于编写 HSSF 的流式方法。原因是旧的二进制 Excel 工作表仅提供 65,536 行和 256 列。所以一张表的数据量不可能那么大。因此根本不应该出现 GB 大小的 *.xls 文件。不应使用 Excel 作为数据库数据的数据交换格式。这不是电子表格计算应用程序的用途。

但是,即使有人为编写HSSF 编写流式方法,这也无法解决您的问题。因为仍然无法将数据附加到现有的*.xls 文件。问题与 Office Open XML 文件格式相同。

【讨论】:

  • 非常感谢您花时间提供如此有见地的答案。您认为您提到的封闭源代码库 Aspose 会有所帮助吗?我们已经准备好使用付费图书馆了。
  • @HeXMaN:好吧,因为它是封闭源代码,所以无法查看代码。但是有一个免费试用版 (products.aspose.com/cells/java)。付款后,您应该联系可以回答此类问题的销售人员。
  • 明白谢谢!
猜你喜欢
  • 2014-02-23
  • 1970-01-01
  • 2014-09-26
  • 2013-07-10
  • 2015-11-25
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多