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。
这不适用于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的主要内容,如果未能解决你的问题,请参考以下文章