Java Apache POI生成的xlsx文件大小大于通过Microsoft Excel手动创建的文件大小
我正在使用ApachePOI为报告生成xlsx表。我使用Microsoft excel将POI生成的一份报告另存为另一份。当比较原始文件和保存的文件时,有12Mb的差异。原始文件为15Mb,而保存的文件仅为2.5Mb。使用的工作簿是XSSF工作簿 有没有可能减少ApachePOI创建的文件大小 以下是我使用的代码片段: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
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的差异。