Генерация файла jxls вечно ведется, когда строки> 10 000

У меня есть отчет excel, который генерируется. В большинстве случаев он отлично работает, когда строки составляют около 2000.

Сегодня утром я попытался создать отчет, содержащий 11 000 строк, и не мог понять, почему он просто зависает, так как он следит за тем же неизменным кодом - см. ниже. Я все еще не могу понять это, кроме того, что XLSTransformer может быть очень медленным?

List<map<string, object="">> maps = new ArrayList<map<string, object="">>();
 Map<string, object=""> sheetData = null;
 for(EntityForecastWrapper wrapper : wrappers) {
 sheetName = Integer.toString(wrapper.getEntityId());
 sheetNames.add(sheetName);
 sheetData = new HashMap<string, object="">();
 sheetData.put("wrapper", wrapper);
 maps.add(sheetData);
 }
 Map<string, object=""> beansMap = new HashMap<string, object="">();
 Workbook workbook = null;
 XLSTransformer transformer = new XLSTransformer();
 try {
 Logger.getLogger(getClass()).error("generating excel");
 InputStream is = getClass().getResourceAsStream(getReportTemplate().getLabel());
 workbook = transformer.transformMultipleSheetsList(is, maps, sheetNames, "map", beansMap, 0);
 Logger.getLogger(getClass()).error("generated excel");
 /*FileOutputStream fos = new FileOutputStream(new File(fileName));
 workbook.write(fos);
 fos.flush();
 fos.close();*/
 } catch(Exception e) {
 Logger.getLogger(getClass()).error("Error writing excel data: ", e);
 }
</string,></string,></string,></string,></map<string,></map<string,>

Код в принципе никогда не возвращается из строки:

workbook = transformer.transformMultipleSheetsList(is, maps, sheetNames, "map", beansMap, 0);

Это очень быстро, когда количество строк не велико (например, от 500 до 1000 строк). Содержимое строки никогда не изменяется, то же количество столбцов...

Любые идеи?

Спасибо!

2 ответа

Jxls пытается сразу создать весь документ в ОЗУ. Я быстро перевернул code и увидел, что jxls использует внутреннюю среду POI HSSFWorkbook - нет потоков, чтобы помочь обрабатывать огромное количество данные.

Решением, которое может работать, является обработка данных в меньших частях (в моем случае ~ 1000 записей) и сохранение вывода jxls временного в файловой системе. После обработки всех данных объедините файлы с помощью poi. Не очень красивое решение...


В нашем случае это происходит, когда шаблон JXLS использует динамические столбцы или другие теги. Когда у нас есть простой шаблон только с ${name} доступом к ресурсу, он работает быстро. Мы перешли на прямой API POI для более сложных отчетов.

Обновление: также обработка шаблонов XLSX потребляет гораздо больше памяти, чем XLS-шаблоны.

licensed under cc by-sa 3.0 with attribution.