在不使用InputStream的情况下更新Java Apache POI中的现有Excel文件

高拉夫:

我正在尝试更新现有的Excel文件(xlsx)。

构造函数喜欢XSSFWorkbook(java.io.File file)XSSFWorkbook(OPCPackage pkg)以只读模式打开文件,并且不允许修改。因此,我必须使用XSSFWorkbook(java.io.InputStream is)并且内存占用量(JVM内存和Java Heap)太高。我不能使用VM args设置最大内存大小,因为我必须尊重并行运行的其他程序的内存要求。

使用SXSSFWorkbook是另一个解决方案,但本质上是一个包装XSSFWorkbook仍然存在相同的问题XSSFWorkbook

我去过SO的其他职位,找不到任何相关答案。有人可以帮我吗?我可以存储临时文件。

阿克塞尔·里希特(Axel Richter):

您的问题不清楚。实际上,它不是“如何XSSFWorkbook不使用就打开InputStream?” 但是“如何减少内存占用XSSFWorkbook?”。这个问题的答案是:不能像apache poi现在编程的那样减少它否则,apache poi开发人员一定会愚蠢到他们apache poi特别编程浪费内存。他们还没有。

但是使用了太多的抽象级别。

全部基于XML。但是,编程库的用户不希望被XML所困扰,至少不希望被那种在ZIP存档中分成多个文件(使用特殊关系XML文件链接在一起)的XML所困扰。因此,在XML之上有ooxml-schemas一个将单个文件的XML转换为可用java对象的库。并且有org.apache.poi.openxml4j.opc.*关系管理。

为了获得所有好处,所有可用的java对象(工作簿,工作表,行,单元格,工程图,表,数据透视表,图表等)以及它们之间的关系都必须存储在内存中以备使用。或者将临时文件从*.xlsxZIP存档中取出后,必须使用临时文件来临时存储它们我认为直接在ZIP文件系统中工作不是一种选择,因为这种文件系统类型发生了更改。

但是并未提供使用临时文件的功能apache poiSXSSF将临时文件用于工作表,仅用于写入新*.xlsx文件,而不用于读取和更新此类文件。

另外,为了尽可能与二进制BIFF *.xls文件格式兼容,添加了另一个级别。这是SSXSSF级别,提供的高级级别apache poi因此,除了内存中java的低级ooxml-schemas之外,现在还有用于工作簿,图纸,行,单元格,图形,表格,数据透视表,图表等的其他对象

因此...大*.xlsx文件的内存已满;-)

解决方案?

为了使内存尽可能友好,请解压缩*.xlsxZIP存档并直接使用其中的XML。当然,这非常费力,尤其是在创建新内容以及考虑到关系时。我在这里的答案中显示了一些简单的示例。例如:存在内存问题时如何修改大型Excel文件,以及如何使用java + poi在excel中设置单元格背景色

或者对apache poi使用临时文件而不是将其全部保存在内存中的扩展进行编程当然,这也是费力的并且对于不使用临时文件提供的系统具有缺点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

更新Java Apache POI中的现有Excel文件

如何使用 SXSSF Apache POI 向现有的大型 Excel 文件添加列?

是否可以在不使用Apache POI的情况下以指定格式将视图导出到Excel?

如何使用HSSF(Apache POI)在现有Excel中的两行之间插入一行

如何使用apache POI和PrimeFaces向现有的Excel工作簿中添加新工作表

在不使用 Hadoop 和 Apache 的情况下编写镶木地板文件

Apache-在不使用ModRewrite的情况下重定向所有流量

如果Apache Solr在不使用SSL的情况下运行,对安全性有何影响?

Java Spring apache POI,在没有指数的情况下在excel中存储长数

使用Apache POI更新Excel文件

使用Apache POI在Excel文件中获取列名称

使用Apache POI API从Excel文件中读取值

使用Apache POI从Excel文件中获取列?

使用 Java Apache POI 更新 Excel 文件中的单元格

无法使用Apache POI从Excel文件读取

Java Apache-POI空指针异常在现有行中创建单元格

在不使用String的情况下引用Java中的包

如何在不使用python的情况下使用Google表格更新Google驱动器中的现有csv

使用apache-poi更新excel文件时出现POIXMLException

使用Apache POI将数组列表中的数据插入Excel文件中的块中

使用Java Apache POI 3.9 Eclipse从Excel文件.xlsx中读取

使用Apache POI从Java中的xls和xlsx excel文件读取和写入

使用Apache POI在Java中读取/写入Excel文件时出现问题

使用Apache-POI从Excel文件搜索记录的有效方法

如何在不使用静态分析工具的情况下忽略InputStream中的所有数据?

使用Apache POI向Excel写入会损坏Excel文件

使用Apache poi从Java导出后,Excel中没有值

无法使用Java和Apache POI写入Excel文件

使用Apache POI将文件嵌入Excel中的XSSF工作表