编写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时,exception停止:

线程“Thread-3”中的exceptionjava.lang.OutOfMemoryError:java.lang.AbstractStringBuilder上的Java堆空间(java.lang.StringBuffer上的AbstractStringBuilder.java:45)(StringBuffer.java:79)

看来我内存不足了。

我该如何解决这个问题。

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

你会build议什么?

我有使用jxl相同的问题,并永远不会解决它( JAVA – 写入Excel单元格在jxl时内存不足错误 )

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

似乎有一种方法先创buildXML格式的数据文件,然后用现有的模板xlsx文件replace该XML。

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

这虽然不适用于xls格式的文件。

如何让您的应用程序使用更多的内存(如500 MB的-Xmx500m )?

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

 $ java -Xms256m -Xmx1024m NameOfYourClass 

我去过那里不止一次。

你是否正在运行在应用程序服务器之上?

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

当我这样做的时候,我也必须真正地优化代码。

由于您输出到.xlsx文件,所以XML需要相当多的内存。 不知道在这种情况下它是否适用于你,但是如果你可以创build一个普通的.xls文件,那么最后把它转换成一个.xlsx文件(当然是使用Apache POI)。