首页 文章

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

提问于
浏览
1

我正在使用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 回答

  • 0

    根据你的“编辑1”...如果我理解你正确你创建没有 Value 的单元格 . 你不必这样做 . 如果你不想写东西,那么不要创建空单元格 . 在我的poi体验中,如果你想写点东西,你只需要创建行和单元格 .

    从这个角度来看很明显,你的xlsx非常大(许多细胞对象) . 我认为MS Excel会删除手动保存的空单元格 .

    added: 需要注意的是,您的细胞样式也存在问题 . 请尝试使用尽可能少的CellStyle实例 . 如果您具有相同样式的单元格,则不要创建具有相同属性的CellStyle的新实例 . 请应用CellStyle的相同实例 . 也不要为简单的文本单元格指定样式 . 在这种情况下,excel使用默认样式(background = 'white',textcolor = 'black',font = 'any default',size = 'any default',format = 'default') .

  • 2

    我有一个类似的问题,后来发现我在追加模式下打开FileOutputStream(append = true) . 每次更新工作表上的单个单元格时,文件大小呈指数级增长(例如从7KB到54KB) . 删除附加后,它工作得很好 .

相关问题