Подтвердить что ты не робот

Производительность POI

Я использую POI в своем веб-приложении J2EE для создания рабочей книги. Тем не менее, я обнаружил, что POI занимает около 3 минут, чтобы создать книгу с 25-килобайтными рядами (по 15 столбцов каждая). Является ли это проблемой производительности POI, или это оправдано для того, чтобы потратить столько времени? Известны ли другие API-интерфейсы для повышения производительности?

4b9b3361

Ответ 1

Я был бы очень удивлен, увидев, что POI занимает много времени для создания такого файла. Я только что сгенерировал лист с 30000 строк x 10 ячеек примерно за 18 секунд (без форматирования, если быть справедливым). Причиной может быть одно из следующих:

  • Включение POI может быть включено, как описано здесь
  • вы работаете из swap-памяти
  • доступная куча VM может быть очень низкой.

Ответ 2

Производительность записи больших файлов с помощью POI может быть значительно уменьшена, если вы использовали "потоковый" API POI вместо стандартного. Действительно, по умолчанию POI будет хранить все ваши данные в памяти, прежде чем писать все за один раз в конце. Объем памяти в этом случае может быть смехотворным для больших файлов. Вместо использования потокового API вы можете контролировать, как используется память, и данные записываются на диск постепенно.

Чтобы создать потоковое учебное пособие, используйте что-то вроде:

  SXSSFWorkbook book = new SXSSFWorkbook(); 
  book.setCompressTempFiles(true);

  SXSSFSheet sheet = (SXSSFSheet) book.createSheet();
  sheet.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk
  // ...

Ответ 3

Если ни один из других ответов не выйдет, посмотрите, будет ли Энди Хан JExcel лучше. Я нашел, что он намного превосходит POI для работы с Excel на Java.

Ответ 4

Мы также используем POI в нашем веб-приложении и не имеем никаких проблем с производительностью, хотя наши сгенерированные документы намного меньше ваших. Сначала я должен проверить, действительно ли POI является настоящей проблемой. Попытайтесь сгенерировать эти документы без накладных расходов J2EE (Unit-Test) и измерьте производительность. Вы также можете отслеживать загрузку и использование памяти на вашем сервере J2EE, чтобы узнать, возникают ли проблемы из некоторых субоптимальных системных настроек.

Ответ 5

Я сравнил POI Apache с библиотекой JExcel. Кажется, что JExcel примерно до 4 раз быстрее, чем Apache POI, но потребление памяти кажется более или менее одинаковым:

@Test
public void createJExcelWorkbook() throws Exception {
        WritableWorkbook workbook = Workbook.createWorkbook(new File("jexcel_workbook.xls"));
        WritableSheet sheet = workbook.createSheet("sheet", 0); 
        for ( int i=0; i < 65535; i++) {
            for ( int j=0; j < 10; j++) {
                Label label = new Label(j, i, "some text " + i + " " + j);
                sheet.addCell(label);
            }
        }
        workbook.write();
        workbook.close();
}

@Test
public void createPoiWorkbook() throws Exception {
    Workbook wb = new HSSFWorkbook();
    Sheet sheet = wb.createSheet("sheet");  
    for ( int i=0; i < 65535; i++) {
        Row row = sheet.createRow(i);
        for ( int j=0; j < 10; j++) {
            Cell cell = row.createCell(j);
             cell.setCellValue("some text " + i + " " + j);
        }
    }   
    FileOutputStream fileOut = new FileOutputStream("poi_workbook.xls");
    wb.write(fileOut);
    fileOut.close();
}

Я тестировал его с помощью версии JExcel 2.6.12 и Apache POI версии 3.7. Вам необходимо загрузить самые последние версии библиотеки и выполнить простые тесты выше, чтобы получить более точные цифры.

<dependency org="org.apache.poi" name="poi" rev="3.7"/>
<dependency org="net.sourceforge.jexcelapi" name="jxl" rev="2.6.12"/>

Примечание. в Apache POI существует ограничение на 65535 строк на листе.