我期待使用Java以编程方式写入excel(.xls MS Excel 2003格式)文件.excel输出文件可能包含~200,000行,我打算将其分成多张纸(由于excel限制,每张64k行).
我尝试过使用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参数将XVM初始堆大小和最大堆大小增加为Xms512m和Xmx1024.仍然无法向文件写入超过150k行.
我正在寻找一种流式传输到excel文件的方法,而不是在将其写入磁盘之前在内存中构建整个文件,这有望节省大量内存.任何替代API或解决方案都将受到赞赏,但我仅限于使用java.谢谢!:)
尝试使用SXSSF工作簿,这对于巨大的xls文档,它的构建文档很棒,并且根本不吃RAM,因为使用了nio
所有现有的Java API都尝试一次在RAM中构建整个文档.尝试编写符合新xslx文件格式的XML文件.为了帮助您入门,我建议您在Excel中以所需的形式构建一个小文件并保存.然后打开它并检查结构并更换所需的部件.
维基百科有一篇关于整体格式的好文章.