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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA - 编写Excel文件时的Apache POI OutOfMemoryError相关的知识,希望对你有一定的参考价值。

我正在使用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.lang.AbstractStringBuilder中的Java堆空间。(AbstractStringBuilder.java:45),java.lang.StringBuffer。(StringBuffer.java:79)

我好像忘记了。

我该怎么解决这个问题。

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

你会建议什么?

我有同样的问题使用jxl,从来没有解决它(JAVA - Out Of Memory Error while writing Excel Cells in jxl

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

答案

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

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

这不适用于xls格式文件。

另一答案

允许你的应用程序使用更多内存(如-Xmx500m 500 MB)怎么样?

另一答案

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

$ java -Xms256m -Xmx1024m NameOfYourClass
另一答案

我不止一次去过那里。

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

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

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

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

另一答案

使用SXSSFWorkbook而不是XSSFWorkbook,这用于流式用户模型Api

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

希望这会对你有所帮助。

以上是关于JAVA - 编写Excel文件时的Apache POI OutOfMemoryError的主要内容,如果未能解决你的问题,请参考以下文章

Apache POI的简单使用记录

POI完成Excel文件的读和写

java读取excel报错

java 写excel 文件的问题,写完后 就把原来的内容清除了

Java中excel文件解析总结以及超大文件读写的分析报告

javaresultxl在哪个包下