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