我正在尝试更新现有的Excel文件(xlsx)。
构造函数喜欢XSSFWorkbook(java.io.File file)
并XSSFWorkbook(OPCPackage pkg)
以只读模式打开文件,并且不允许修改。因此,我必须使用XSSFWorkbook(java.io.InputStream is)
并且内存占用量(JVM内存和Java Heap)太高。我不能使用VM args设置最大内存大小,因为我必须尊重并行运行的其他程序的内存要求。
使用SXSSFWorkbook
是另一个解决方案,但本质上是一个包装XSSFWorkbook
。仍然存在相同的问题XSSFWorkbook
。
我去过SO的其他职位,找不到任何相关答案。有人可以帮我吗?我可以存储临时文件。
您的问题不清楚。实际上,它不是“如何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
对象(工作簿,工作表,行,单元格,工程图,表,数据透视表,图表等)以及它们之间的关系都必须存储在内存中以备使用。或者将临时文件从*.xlsx
ZIP存档中取出后,必须使用临时文件来临时存储它们。我认为直接在ZIP文件系统中工作不是一种选择,因为这种文件系统类型发生了更改。
但是并未提供使用临时文件的功能apache poi
。仅SXSSF
将临时文件用于工作表,仅用于写入新*.xlsx
文件,而不用于读取和更新此类文件。
另外,为了尽可能与二进制BIFF
*.xls
文件格式兼容,添加了另一个级别。这是SS
和XSSF
级别,提供的高级级别apache poi
。因此,除了内存中java
的低级ooxml-schemas
类之外,现在还有用于工作簿,图纸,行,单元格,图形,表格,数据透视表,图表等的其他对象。
因此...大*.xlsx
文件的内存已满。;-)
解决方案?
为了使内存尽可能友好,请解压缩*.xlsx
ZIP存档并直接使用其中的XML。当然,这非常费力,尤其是在创建新内容以及考虑到关系时。我在这里的答案中显示了一些简单的示例。例如:存在内存问题时如何修改大型Excel文件,以及如何使用java + poi在excel中设置单元格背景色。
或者对apache poi
使用临时文件而不是将其全部保存在内存中的扩展进行编程。当然,这也是费力的并且对于不使用临时文件提供的系统具有缺点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句