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