Apache POI 生成的 xlsx 文件大小大于通过 Microsoft 手动创建的文件 Excel

Apache POI generated xlsx file size is larger than manually created via Microsoft Excel

我正在使用 Apache POI 为报告生成 xlsx sheet。我使用 Microsoft excel 另存为另一个 POI 生成的报告。比较原始文件和保存的文件时,有 12Mb 的差异。原始文件为 15Mb,而保存的文件仅为 2.5Mb。使用的工作簿是 XSSFWorkbook。

是否可以减小 Apache POI 创建的文件大小

这是我使用的代码片段:

XSSFWorkbook workbookTitle = new XSSFWorkbook(fileInputStream);
workbook = new SXSSFWorkbook(workbookTitle, maxRows);

font = workbook.createFont();
font.setFontHeightInPoints((short) 9);
font.setFontName(FONT_NAME);

cellTwoDecimal = workbook.createCellStyle();

DataFormat format = workbook.createDataFormat();

cellTwoDecimal.setDataFormat(format.getFormat("0.00"));
cellTwoDecimal.setFont(font);

cellCommon = workbook.createCellStyle();
cellCommon.setFont(font);

cellText = workbook.createCellStyle();
cellText.setDataFormat((short) BuiltinFormats.getBuiltinFormat("text"));
cellText.setFont(font);

cellWrpText = workbook.createCellStyle();
cellWrpText.setWrapText(true);
cellWrpText.setFont(font);


Row row;
Cell cell;

for (int i = 0; i < size; i++) {
    row = excelSheet.createRow(rowIndex++);
    cell = row.createCell(i);
    cell.setCellValue(rowHeader);
    cell.setCellStyle(cellCommon);

}

我已经从代码中删除了一些内部逻辑。请分享您的想法。

[编辑 1] 我在没有价值的地方插入了很多空白单元格,即。报告的某些部分将没有任何价值。所以我在那里放了一个空白单元格。我也在为空白单元格设置样式。会不会是这个原因?

提前致谢。

根据您的 "edit 1"... 如果我理解正确的话,您创建的单元格没有任何价值。 你不必这样做。如果你不想写东西,那就不要创建空单元格。 根据我的 poi 经验,如果你想写东西,你只需要创建行和单元格。

从这个角度来看,很明显,您的 xlsx 非常大(很多单元格对象)。我认为 MS Excel 删除了手动保存时的空单元格。

添加: 需要提及的是,还存在与单元格样式相关的问题。请尝试使用尽可能少的 CellStyle 实例。如果您有相同样式的单元格,请不要创建具有相同属性的 CellStyle 的新实例。请应用相同的 CellStyle 实例。也不要将样式分配给简单的文本单元格。在这种情况下 excel 使用默认样式 (background='white', textcolor='black', font='any default', size='any default', format='default').

我遇到了类似的问题,后来发现我是以追加模式(append=true)打开FileOutputStream。每次我更新 sheet 上的单个单元格时,文件大小呈指数增长(比如从 7KB 到 54KB)。 删除附加后,它工作得很好。