几年前,我遇到了使用jXLS和POI XSSF创建大型excel文件的问题。如果我的内存是正确的,我认为XSSF会在磁盘上创建类似于1GB+临时文件的东西来创建10 memory文件。因此,我不再使用jXLS,而是使用SXSSF创建excel文件,但今天我有了使用jXLS或JETT的新理由。
jXLS和JETT的网站似乎都暗示,性能要好得多,但POI的XSSF网站仍然笼统地表示,XSSF需要更高的内存占用。我想知道,这种较高的内存占用是否相当于目前的10%开销,还是与几年前的10,000%的开销一样。
POI3.9 XSSF是否修复了严重的内存问题?我不应该担心与jXLS或JETT一起使用它吗?还是有一定的问题要避免?我非常小心地重复使用单元格样式。
发布于 2015-05-12 09:33:15
要回答您的问题,是的,POI在处理大型XLSX文件时总是使用非常大的内存,这比XLSX文件的大小要大得多。我认为这种情况不会很快改变,这是很明显的原因: XLSX基本上是一堆压缩的XML文件,而且XML很好地压缩(大约10倍)。将这个XML放在未压缩的内存中将增加10倍的内存消耗,因此如果您添加了所有数据结构的开销,您就不可能期望比XLSX文件大小增加10%的内存消耗。
现在,好消息是,正如注释中提到的,Apache引入了SXSSF,用于在电子表格中传输大量数据,具有非常好的性能和较低的内存使用率。以这种方式生成的XLSX文件仍然流在硬盘上,最终会占用相当大的空间,但至少在编写几十万行时不会冒OOME的风险。
问题是您无法让JETT直接使用SXSSF,因为它需要加载到内存中的整个文档来执行模板填充。杰特的作者很快讨论了这个话题,here。
我也遇到了同样的问题,最后做了一个两步的XLSX创建:
当然,这种方法也有局限性:-在插入行期间,不能在任何流行上使用JETT (但可以在插入之前,动态地选择$$tokens$$的顺序)--除非您自己使用POI来处理,否则不会复制单元格格式。我个人更喜欢格式化XLSX文件中的整个列,它将应用于流数据。
如果您想使用SXSSF插入的数据显示图表,也可以使用函数偏移和COUNTA定义一个命名的范围,然后创建一个数据透视表&数据透视图,当在Excel中打开XLSX时,它将被刷新。
https://stackoverflow.com/questions/21488738
复制相似问题