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

Java Apache POI生成的xlsx文件大小大于通过Microsoft Excel手动创建的文件大小,java,apache-poi,xlsx,Java,Apache Poi,Xlsx,我正在使用ApachePOI为报告生成xlsx表。我使用Microsoft excel将POI生成的一份报告另存为另一份。当比较原始文件和保存的文件时,有12Mb的差异。原始文件为15Mb,而保存的文件仅为2.5Mb。使用的工作簿是XSSF工作簿 有没有可能减少ApachePOI创建的文件大小 以下是我使用的代码片段: XSSFWorkbook workbookTitle = new XSSFWorkbook(fileInputStream); workbook = new SXSSFWorkb

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

有没有可能减少ApachePOI创建的文件大小

以下是我使用的代码片段:

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);

}
XSSFWorkbook workbookTitle=新XSSFWorkbook(fileInputStream);
工作簿=新的SXSSFWorkbook(workbookTitle,maxRows);
font=workbook.createFont();
font.setFontHeightInPoints((短)9);
font.setFontName(字体名称);
cellTwoDecimal=workbook.createCellStyle();
DataFormat=workbook.createDataFormat();
cellTwoDecimal.setDataFormat(format.getFormat(“0.00”);
cellTwoDecimal.setFont(字体);
cellCommon=workbook.createCellStyle();
cellCommon.setFont(字体);
cellText=workbook.createCellStyle();
setDataFormat((短)builtInfo.getBuiltInfo(“文本”);
cellText.setFont(字体);
cellWrpText=workbook.createCellStyle();
cellWrpText.SetWrpText(true);
cellWrpText.setFont(字体);
行行;
细胞;
对于(int i=0;i
我已经从代码中删除了一些内部逻辑。请分享你的想法

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

提前感谢。

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

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


添加:需要指出的是,单元格的样式也存在问题。请尝试使用尽可能少的CellStyle实例。如果有具有相同样式的单元格,请不要创建具有相同属性的新CellStyle实例。请应用相同的CellStyle实例。也不要将样式指定给简单的文本单元格。在本例中,excel使用默认样式(background='white',textcolor='black',font='any default',size='any default',format='default')。

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

根据给定的代码,我相信您遵守了中给出的标准[.请确保您在删除的代码中没有违反。excel文件实际上是存档文件-您可以解压缩它们!!您可以尝试比较这两个版本-在ms excel中打开之前和使用ms excel保存之后当然我试过了。解压缩后的表非常大。我的意思是原始文件是179mb,保存的文件是29mb。原始文件中有一些额外的数据。我需要知道一种通过代码删除它们的方法。我也尝试过这种方法。它将文件大小减少到12Mb。仍然有大约10Mb的差异。