我开发了一个Java类来使用SXSSF工作簿来克服Java Heap错误,这个错误总是在编写非常大的电子表格时由XSSF工作簿引起的。有关解决方案,请参阅http://poi.apache.org/spreadsheet/how-to.html#sxssf。
简而言之,我使用ModelA
代替workbook = new SXSSFWorkbook(SXSSFWorkbook.DEFAULT_WINDOW_SIZE);
这个解决方案就像魔术一样,我现在能够编写非常大的xlsx电子表格,内存占用更少。
但是,我遇到了一个问题。使用SXSSF工作簿时,与Excel本身相比,它实际上会生成更大的xlsx文件大小。例如,33MB由SXSSF创建,而Excel使用相同的数据集创建25MB。为什么呢?
我调查并找到原因:
我将.xlsx扩展名更改为.zip,以便我可以打开它并查看 \ xl \ worksheets \ sheet1.xml 工作表文件。我发现使用workbook = new XSSFWorkbook();
的内联字符串由SXSSF生成,而共享字符串表使用t =" s" (v标签)由Excel生成。我检查过XSSF也创建了共享字符串表。有t =" inlineStr"在巨大的电子表格中的每个单元格中,可以更快地炸毁文件大小。
我的问题是,是否可以强制SXSSF工作簿根据共享字符串表生成t="inlineStr"
文件(使用v标签 - t =" s")而不是内联字符串(T =" inlineStr&#34)?我希望这个解决方案能够大大减少最终的文件大小。有人知道吗?