使用java编写大型Excel文件的API

2022-09-03 05:19:38

我希望使用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 参数作为 Xms512m 和 Xmx1024 来增加 JVM 初始堆大小和最大堆大小。仍然无法向文件写入超过 150k 行。

我正在寻找一种流式传输到excel文件的方法,而不是在将整个文件写入磁盘之前在内存中构建整个文件,这有望节省大量内存使用量。任何替代的API或解决方案都将不胜感激,但我仅限于使用java。谢谢!:)


答案 1

尝试使用SXSSF工作簿,这对于大型xls文档,其构建文档并且根本不吃RAM是一件好事,使用nio


答案 2

所有现有的Java API都尝试一次在RAM中构建整个文档。尝试编写符合新的 xslx 文件格式的 XML 文件。为了帮助您入门,我建议在Excel中以所需的形式构建一个小文件并保存它。然后打开它并检查结构并更换所需的零件。

维基百科有一篇关于整体格式的好文章


推荐