编写大型格式化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进行传输