编写大型格式化Excel(.xlsx)时发生拉链炸弹异常

时间:2015-11-25 13:57:24

标签: java excel apache-poi

我用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);
        }

2 个答案:

答案 0 :(得分:2)

Zip-Bomb检测试图保护您免受打开试图使您的应用程序内存不足的恶意文件。

它似乎在您的情况下开始,因为SXSSFWorkbook在内部将数据流出到临时文件,然后再次读取它以生成最终的.xlsx文件。

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

答案 1 :(得分:0)

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

然后努力获得大小

然后处理jsf传输,我猜你在将文件保存到文件系统或数据库中的高架中后必须通过servlet进行操作