我想用Java程序编写到一个Excel (.xls MS Excel 2003 格式) 文件中。Excel 输出文件可能包含 ~200,000 行数据,我计划将其分成多个工作表 (每个工作表 64k 行,由于 Excel 的限制)。
我尝试使用 Apache POI API,但由于 API 对象模型的缘故,它似乎是一个内存占用量很大的程序。我被迫将单元格/工作表添加到内存中的工作簿对象中,只有当所有数据都添加完毕后,才能将工作簿写入文件!以下是 Apache 建议使用他们的 API 编写 Excel 文件的示例:
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
//Create a row and put some cells in it
Row row = sheet.createRow((short)0);
// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
很明显,写入约20k行数据(每行有10-20列)会导致可怕的“java.lang.OutOfMemoryError:Java堆空间”。
我已经尝试使用Xms和Xmx参数将JVM初始堆大小和最大堆大小增加为Xms512m和Xmx1024。仍然无法将超过150k行的内容写入文件。
我正在寻找一种流式传输到Excel文件的方法,而不是在将其写入磁盘之前在内存中构建整个文件,这有望节省大量内存使用。任何替代API或解决方案都将不胜感激,但我受限于使用Java。谢谢! :)