java - 写入大格式 Excel (.xlsx) 时出现 Zip-bomb 异常

标签 java excel apache-poi

我用 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/

相关文章:

java - 每当工作人员返回错误值时停止其他工作人员

java - Cassandra 每日数据清除?

excel - Excel 中背包的变化

java - Apache poi Excel折线图点

java - Akka-http Java API 示例代码/文档

java - 我如何使用正则表达式提取它

尝试从一系列单元格中删除按钮时 Excel VBA 错误 1004

python - 使用 python 将 csv 转换为 xls

java - 我想使用 java 库 Apache Poi 读取 excel .xlsx 文件,但无法修复错误,代码无法编译

java - 获取 "IllegalArguementException : Value for parameter ' id' 超出了 poi apache 库的范围?