我正在使用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。
答案 0 :(得分:2)
似乎有一种方法首先以XML格式创建数据文件,然后用现有模板xlsx文件替换该XML。
这不适用于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
希望这会对你有帮助。