JAVA-编写Excel文件时发生Apache POI OutOfMemoryError

JAVA-编写Excel文件时发生Apache POI OutOfMemoryError,excel,memory,memory-management,excel-2007,apache-poi,Excel,Memory,Memory Management,Excel 2007,Apache Poi,我正在使用ApachePOI编写一个Excel文件 我想把myResultSet的所有数据都写进去 其中字段名(列)存储在字符串[]字段名中 我有70000行和27列 我的代码: String xlsFilename = "myXLSX.xlsx"; org.apache.poi.ss.usermodel.Workbook myWorkbook = new XSSFWorkbook(); org.apache.poi.ss.usermodel.Sheet mySheet = myWorkbook

我正在使用ApachePOI编写一个Excel文件

我想把myResultSet的所有数据都写进去

其中字段名(列)存储在字符串[]字段名中

我有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();
String xlsFilename=“myXLSX.xlsx”;
org.apache.poi.ss.usermodel.Workbook myWorkbook=新XSSFWorkbook();
org.apache.poi.ss.usermodel.Sheet mySheet=myWorkbook.createSheet(“myXLSX”);
Row currentRow=mySheet.createRow(0);
for(int k=0;k
我的问题是,当编写行时,程序变得越来越慢

当它到达第3500行时,它会停止,但有一个例外:

线程“thread-3”java.lang.OutOfMemoryError中出现异常:java堆空间 位于java.lang.AbstractStringBuilder。(AbstractStringBuilder.java:45) 位于java.lang.StringBuffer。(StringBuffer.java:79)

我好像没记性了

我怎样才能解决这个问题

是否有办法将我的数据每隔1000个存储到一个临时文件中(例如)

你有什么建议

我在使用jxl时遇到了同样的问题,但也从未解决过()


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

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

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

$ java -Xms256m -Xmx1024m NameOfYourClass

我去过那儿不止一次

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

正如Pablo所提到的,我在过去所做的是增加堆空间,但是要确保为您正在运行的应用服务器增加堆空间

在做这件事时,我还必须真正优化代码


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

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


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

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

资料来源:


希望这将对您有所帮助。

您最好使用较新的SXSSF,而不是大网格演示,因为前者比后者为您做的工作多得多。如果您想修改现有的电子表格,大网格演示非常有用。纯SXSSF是一种只写格式(从空白工作簿或打开的XSSFWorkbook对象开始。基于SAX事件的模型为只读。若要拥有一个可以编辑现有文件而无需将整个工作簿加载到内存中的类,您需要使用较低级别的API来编写XML文件并重新打包工作簿。您使用的是哪个应用程序服务器?