我正在使用Apache POI为报告生成xlsx表 . 其中一个POI生成的报告我使用Microsoft Excel保存为另一个 . 比较原始文件和保存的文件时,有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]我插入了很多没有 Value 的空白单元格,即 . 报告的某些部分没有任何 Value . 所以我在那里放了一个空白单元格 . 我也为空白单元格设置样式 . 这可能是原因吗?
提前致谢 .
2 回答
根据你的“编辑1”...如果我理解你正确你创建没有 Value 的单元格 . 你不必这样做 . 如果你不想写东西,那么不要创建空单元格 . 在我的poi体验中,如果你想写点东西,你只需要创建行和单元格 .
从这个角度来看很明显,你的xlsx非常大(许多细胞对象) . 我认为MS Excel会删除手动保存的空单元格 .
added: 需要注意的是,您的细胞样式也存在问题 . 请尝试使用尽可能少的CellStyle实例 . 如果您具有相同样式的单元格,则不要创建具有相同属性的CellStyle的新实例 . 请应用CellStyle的相同实例 . 也不要为简单的文本单元格指定样式 . 在这种情况下,excel使用默认样式(background = 'white',textcolor = 'black',font = 'any default',size = 'any default',format = 'default') .
我有一个类似的问题,后来发现我在追加模式下打开FileOutputStream(append = true) . 每次更新工作表上的单个单元格时,文件大小呈指数级增长(例如从7KB到54KB) . 删除附加后,它工作得很好 .