【问题标题】:Apache POI generated xlsx file size is larger than manually created via Microsoft ExcelApache POI 生成的 xlsx 文件大小大于通过 Microsoft Excel 手动创建的大小
【发布时间】:2016-02-10 11:02:22
【问题描述】:

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

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

这是我用过的代码sn-p:

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] 我插入了很多没有价值的空白单元格,即。报告的某些部分将没有任何价值。所以我在那里放了一个空白单元格。我也在为空白单元格设置样式。会是这个原因吗?

提前致谢。

【问题讨论】:

  • 根据给出的代码,我相信您遵循 [poi.apache.org/faq.html#faq-N100EF] 中给出的标准。确保您在删除的代码中没有违反它。
  • excel 文件实际上是存档 - 您可以解压缩它们!!。您可以尝试比较两个版本 - 在 ms excel 中打开之前和使用 ms excel 保存之后
  • 当然我试过了。提取后的床单很大。我的意思是原始文件是 179mb,保存的文件是 29mb。原始文件中有一些额外的数据。我需要知道一种通过代码删除它们的方法。

标签: java apache-poi xlsx


【解决方案1】:

根据您的“编辑 1”...如果我理解正确,您将创建没有价值的单元格。 您不必这样做。如果您不想写东西,请不要创建空单元格。 根据我的经验,如果你想写点东西,你只需要创建行和单元格。

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

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

【讨论】:

  • 我也试过这个。它将文件大小减少到 12Mb。仍然有大约 10Mb 的差异。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2022-12-21
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多