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