JAVA - Apache POI OutOfMemoryError при записи файла Excel - PullRequest
2 голосов
/ 06 июля 2010

Я пишу файл Excel, используя Apache POI.

Я хочу записать в него все данные myResultSet

, в которых имена полей (столбцы) хранятся в полях String [].

У меня 70000 строк и 27 столбцов

Мой код:

String xlsFilename = "myXLSX.xlsx";
org.apache.poi.ss.usermodel.Workbook myWorkbook = new XSSFWorkbook();
org.apache.poi.ss.usermodel.Sheet mySheet = myWorkbook.createSheet("myXLSX");
Row currentRow = mySheet.createRow(0);
for (int k = 0; k < fieldNames.length; k++) {
    // Add Cells Of Title Of ResultsTable In Excel File
    currentRow.createCell(k).setCellValue(fieldNames[k]);
}

for (int j = 0; j < countOfResultSetRows; j++) {
    myResultSet.next();
    currentRow = mySheet.createRow(j + 1);
    for (int k = 0; k < fieldNames.length; k++) {
        currentRow.createCell(k).setCellValue(myResultSet.getString(fieldNames[k]));
        System.out.println("Processing Row " + j);
    }
}

FileOutputStream myFileOutputStream = new FileOutputStream(xlsFilename);
myWorkbook.write(myFileOutputStream);
myFileOutputStream.close();

Моя проблема в том, что при записи строк программа становится все медленнее и медленнее.

Когда он достигает строки 3500, он останавливается с исключением:

Исключение в потоке "Thread-3" java.lang.OutOfMemoryError: пространство кучи Java в java.lang.AbstractStringBuilder. (AbstractStringBuilder.java:45) at java.lang.StringBuffer. (StringBuffer.java:79)

Кажется, мне не хватает памяти.

Как мне решить эту проблему.

Естьесть ли способ хранить мои данные во временном файле каждые 1000 (например)?

Что бы вы предложили?

У меня была такая же проблема с использованием jxl, и я никогда ее не решал ( JAVA - Ошибка нехватки памяти при записи ячеек Excel в jxl )

сейчасВ любом случае мне нужны файлы xlsx, поэтому я должен использовать POI.

Ответы [ 5 ]

2 голосов
/ 25 января 2012

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

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BigGridDemo.java

это не применимо для формата xlsфайлы, хотя.

1 голос
/ 06 июля 2010

Назначьте больше памяти кучи при запуске вашей программы:

$ java -Xms256m -Xmx1024m NameOfYourClass
1 голос
/ 12 января 2011

Я был там не раз.

Работаете ли вы на сервере приложений?

То, что я делал в прошлом, как упоминал Пабло, - это увеличение пространства кучи, но убедитесь, что оно увеличивается для сервера приложений, на котором вы работаете.

Мне также пришлось по-настоящему оптимизировать код при этом.

Поскольку вы выводите в файл .xlsx, XML занимает совсем немного памяти. Не уверен, будет ли это работать для вас в этой ситуации или нет, но если вы можете создать обычный .xls, сделайте это и затем конвертируйте его в конце в .xlsx файл (конечно, используя Apache POI).

1 голос
/ 06 июля 2010

Как насчет того, чтобы ваше приложение могло использовать больше памяти (например, -Xmx500m для 500 МБ)?

0 голосов
/ 19 декабря 2017

Используйте SXSSFWorkbook вместо XSSFWorkbook, это используется для потоковой передачи Модель пользователя Api

Источник: https://coderanch.com/t/612234/Write-Huge-Excel-file-Xlsx

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...