我需要在xlsx文件中写一个超过65000行的结果集。所以我想尝试使用Apache POI 3.7。但我收到OutOfMemoryError的错误:Java堆空间。除了增加似乎无法解决问题的JVM内存之外,我该如何解决这个问题。请帮忙。
简单示例代码:
public static void main(String[] args) throws IOException {
Workbook wb = new XSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
for (int i=0;i<65000;i++){
Row row = sheet.createRow((int) i);
// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);
// Or do it on one line.
row.createCell(1).setCellValue(1.2);
row.createCell(2).setCellValue(
createHelper.createRichTextString("This is a string"));
row.createCell(3).setCellValue(true);
}
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("test1.xls");
fileOut.flush();
wb.write(fileOut);
fileOut.close();
}
答案 0 :(得分:11)
您可能想要查看POI项目最近使用SXSSF API执行的操作。 How-To中还有一节 对于您提供的示例代码,这将非常适合您创建数据然后在创建后忘记它。使用SXSSF扩展,您可以立即开始将数据写入文件。这样可以减少内存占用。
请注意,此功能在Apache POI 3.7中不存在,但在Apache POI 3.8 beta 3中添加 目前正在对最终版本3.8进行投票。因此,如果您必须使用最终版本,那么在发布之前不应该太久。
答案 1 :(得分:1)
我遇到了同样的问题,这不是修复,但它有效,创建不同的excel文件,然后手动合并,我知道这不是一个好的解决方案,但因为它是紧迫的,我别无选择。
您可以通过两种不同的方式执行此操作:
1.-一旦yoi达到3000行,就创建一个新文件:
XSSFWorkbook wb = new XSSFWorkbook();
fileOut = new FileOutputStream("file1.xlsx");
fileOut = new FileOutputStream("file2.xlsx");...
你可以将它添加到for语句中以创建它们,一旦你到达前3000条记录保存文件并继续写下一个文件。
2.-分隔结果集或源记录以获得少于3000条记录,并再次运行整个程序,但每次都有不同的查询范围:
between recNum = 1 and recNum <=100
下一次运行将是:
between recNum > 100 and recNum <= 200
这只是一个例子,希望这对你有用。