JAVA - 编写Excel文件时的Apache POI OutOfMemoryError

时间:2010-07-06 11:39:57

标签: excel memory memory-management excel-2007 apache-poi

我正在使用Apache POI编写Excel文件。

我想在其中写入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)         在java.lang.StringBuffer。(StringBuffer.java:79)

似乎我失去了记忆。

我该如何解决这个问题。

有没有办法将我的数据存储到每1000个临时文件中(例如)?

你会建议什么?

我使用jxl遇到了同样的问题,但从未解决过(JAVA - Out Of Memory Error while writing Excel Cells in jxl

现在我还需要xlsx文件,所以我必须使用POI。

5 个答案:

答案 0 :(得分:2)

似乎有一种方法首先以XML格式创建数据文件,然后用现有模板xlsx文件替换该XML。

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

这不适用于xls格式文件。

答案 1 :(得分:1)

如何允许您的应用使用更多内存(例如-Xmx500m 500 MB)?

答案 2 :(得分:1)

在运行程序时为堆分配更多内存:

$ java -Xms256m -Xmx1024m NameOfYourClass

答案 3 :(得分:1)

我不止一次去过那里。

您是否在应用程序服务器上运行此程序?

我过去所做的就像Pablo所提到的那样,是增加堆空间,但要确保它正在为你正在运行的应用服务器增加。

在执行此操作时,我还必须真正优化代码。

由于您输出的是.xlsx文件,因此XML需要相当多的内存。在这种情况下不确定它是否适合你,但如果你可以创建一个正常的.xls那么做,而不是将它最后转换为.xlsx文件(当然使用Apache POI)

答案 4 :(得分:0)

使用SXSSFWorkbook代替XSSFWorkbook,这用于流式用户模型Api

来源:https://coderanch.com/t/612234/Write-Huge-Excel-file-Xlsx

希望这会对你有帮助。