Исключение из Zip-бомбы при написании большого отформатированного Excel (.xlsx)

Я написал простое веб-приложение с JSF, которое используется для загрузки отчетов Excel. Я могу написать не менее 50 000 строк с шестью столбцами на пяти разных листах менее чем за десять секунд.

Проблема возникает, когда я пытаюсь отформатировать данные Excel. Форматирование занимает довольно много времени, и важно то, что когда я пытаюсь отформатировать Excel с данными более 3000 строк и загрузить через JSF, он вызывает исключение Zip Bomb IO.

Из-за этого я также не могу вычислить размер отформатированной рабочей книги (которая требует записи в byteoutputstream).

Кто-нибудь может дать какое-либо представление об этом?

Можно ли загрузить с сервера полностью отформатированный Excel, в котором 50 строк на пяти листах?

Ниже приведен код, который я использую для форматирования строк 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 ответа

Обнаружение Zip-Bomb пытается защитить вас от открытия вредоносных файлов, которые пытаются вывести ваше приложение из памяти.

Кажется, в вашем случае это срабатывает, потому что SXSSFWorkbook внутренне передает данные во временный файл, а затем снова считывает их для получения окончательного файла.xlsx.

Если вы уверены, что документ построен здесь безопасным образом, вы можете увеличить или даже отключить эти проверки с помощью инструкций, содержащихся в сообщении об ошибке.

Делайте вещи по одному, сначала убедитесь, что 3000 строк отформатированы.

затем работать над получением размера

затем поработайте над передачей jsf, что, я думаю, вам придется сделать через сервлет после сохранения файла в файловой системе или в лоте в базе данных.

Другие вопросы по тегам