编写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。
这虽然不适用于xls格式的文件。
如何让您的应用程序使用更多的内存(如500 MB的-Xmx500m
)?
运行程序时为堆分配更多的内存:
$ java -Xms256m -Xmx1024m NameOfYourClass
我去过那里不止一次。
你是否正在运行在应用程序服务器之上?
Pablo提到我过去所做的是增加堆空间,但要确保正在运行的应用程序服务器的数量正在增加。
当我这样做的时候,我也必须真正地优化代码。
由于您输出到.xlsx
文件,所以XML需要相当多的内存。 不知道在这种情况下它是否适用于你,但是如果你可以创build一个普通的.xls
文件,那么最后把它转换成一个.xlsx
文件(当然是使用Apache POI)。