我用 JSF 编写了一个简单的 Web 应用程序,用于下载 Excel 报告。我能够在 10 秒内将至少 50,000 行、六列写入到五张不同的纸张上。
当我尝试格式化 Excel 数据时出现问题。格式化需要相当长的时间,重要的是当我尝试格式化包含超过 3,000 行数据的 Excel 并通过 JSF 下载时,它会抛出 Zip Bomb IO 异常。
因此,我也无法计算格式化工作簿的大小(这需要写入字节输出流)。
有人可以对此提供任何见解吗?
是否可以从服务器下载一个完全格式化的 Excel(五张纸中有 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);
}
最佳答案
Zip-Bomb 检测会尝试保护您免于打开试图耗尽您的应用程序内存的恶意文件。
它似乎在您的情况下起作用,因为 SXSSFWorkbook 在内部将数据流式传输到临时文件,然后再次读取它以生成最终的 .xlsx 文件。
如果您确定此处的文档是以安全的方式构建的,那么您可以按照错误消息中包含的说明增加甚至禁用这些检查。
关于java - 写入大格式 Excel (.xlsx) 时出现 Zip-bomb 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33918382/