恐怕使用apache poi 是不可能的。我怀疑其他图书馆是否有可能。甚至 Microsoft 应用程序本身也需要始终打开整个文件才能使用它。
所有 Microsoft Office 文件格式都具有类似于文件系统的复杂内部结构。该内部系统的各个部分可能相互关联。因此,不能像使用纯文本文件或 CSV 文件或单个 XML 文件那样简单地将数据流式传输到这些文件中并附加数据。人们总是需要考虑完整文件系统的有效性及其现实。所以总是需要知道完整的文件系统。不在内存中时应该在哪里知道?
现代 Microsoft Office 文件格式是 Office Open XML。这是包含内部文件系统的 ZIP 档案,其目录结构也包含 XML 文件和其他文件。因此,可以通过直接从该 ZIP 文件系统读取数据部分来减少内存占用,而不是通过解压缩 ZIP 文件系统将所有数据读取到内存中。这就是apache poi 对XSSF 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 文件格式相同。