我用JSF编写了一个简单的Web应用程序,用于下载Excel报告。我能够在十秒钟内将至少50,000行,六列写入五张不同的纸张。
当我尝试格式化Excel数据时出现问题。格式化需要相当长的时间,重要的是当我尝试使用超过3,000行的数据格式化Excel并通过JSF下载时,它会抛出Zip Bomb IO异常。
由于这个原因,我也无法计算格式化工作簿的大小(这需要写入byteoutputstream)。
任何人都可以对此提供任何见解吗?
是否可以从服务器下载一个完全格式化的Excel,其中包含5张表中的50K行?
以下是我用于格式化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);
}
答案 0 :(得分:2)
Zip-Bomb检测试图保护您免受打开试图使您的应用程序内存不足的恶意文件。
它似乎在您的情况下开始,因为SXSSFWorkbook在内部将数据流出到临时文件,然后再次读取它以生成最终的.xlsx文件。
如果您确定文档是以安全的方式构建的,那么您可以使用错误消息中包含的说明来增加甚至禁用这些检查。
答案 1 :(得分:0)
一次做一件事,先确保3000行格式化。
然后努力获得大小
然后处理jsf传输,我猜你在将文件保存到文件系统或数据库中的高架中后必须通过servlet进行操作