编写大型格式化Excel(.xlsx)时发生Zip-bombexception

我用JSF编写了一个简单的Web应用程序,用于下载Excel报告。 我可以在十秒钟内将至less五万行的六列写入五张不同的纸张。

当我尝试格式化Excel数据时出现问题。 格式化需要相当一段时间,重要的是当我尝试使用超过3000行的数据格式化Excel并通过JSF下载时,它会引发Zip Bomb IOexception。

由于这个原因,我无法计算格式化工作簿的大小(这需要写入字节输出stream)。

有人可以提供任何见解吗?

是否可以从服务器上下载一个完全格式化的Excel,其中有五个五行五行?

以下是我用来格式化Excel行的代码。

对于标题行:

public CellStyle formatHeaderRow(SXSSFWorkbook sxWorkBook){ CellStyle cellStyleHeader = sxWorkBook.createCellStyle(); Font font = sxWorkBook.createFont(); font.setFontHeightInPoints((short)10); font.setFontName("Arial"); font.setBoldweight(Font.BOLDWEIGHT_BOLD); cellStyleHeader.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); cellStyleHeader.setFillPattern(CellStyle.SOLID_FOREGROUND); cellStyleHeader.setBorderTop((short) 1); cellStyleHeader.setBorderLeft((short) 1); cellStyleHeader.setBorderRight((short) 1); cellStyleHeader.setBorderBottom((short) 1); cellStyleHeader.setAlignment((short) CellStyle.ALIGN_CENTER); cellStyleHeader.setFont(font); return cellStyleHeader; } 

对于数据行:

 public CellStyle formatBodyRows(SXSSFWorkbook sxWorkBook){ CellStyle cellStyleBody = sxWorkBook.createCellStyle(); Font bodyFont = sxWorkBook.createFont(); bodyFont.setFontHeightInPoints((short)10); bodyFont.setFontName("Arial"); cellStyleBody.setBorderTop((short) 1); cellStyleBody.setBorderLeft((short) 1); cellStyleBody.setBorderRight((short) 1); cellStyleBody.setBorderBottom((short) 1); cellStyleBody.setAlignment((short) CellStyle.ALIGN_LEFT); cellStyleBody.setFont(bodyFont); return cellStyleBody; } 

对于列/单元格间距:

 for(int cellCount=0;cellCount<row.getLastCellNum();cellCount++){ sheet.setColumnWidth(cellCount, width); row.getCell(cellCount).setCellStyle(cellStyleHeader); } 

Zip-Bomb检testing图防止您打开试图将应用程序从内存中移出的恶意文件。

它似乎在你的情况下踢,因为SXSSFWorkbook内部stream出数据到一个临时文件,然后再次读取它,以产生最终的.xlsx文件。

如果您确定文档是以安全的方式构build的,则可以使用错误消息中包含的说明增加甚至禁用这些检查。

一次做一件事,首先确保3000行被格式化。

然后努力获得大小

然后在jsf传输上工作,这是我的猜测,在将文件保存到文件系统或数据库中后,您将必须通过servlet进行传输