java - 使用java编写大型excel文件的API

标签 java excel apache-poi

我希望使用 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。谢谢! :)

最佳答案

尝试使用SXSSF工作簿,这对巨大的 xls 文档来说是个好东西,它的构建文档根本不占用 RAM,因为使用 nio

关于java - 使用java编写大型excel文件的API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1486120/

相关文章:

java - 它是一种线程安全机制吗?

vba - 使用 VBA 将 Excel 工作表保存在当前目录中

java - 无法使用java替换excel文件中的日期

excel - 仅将单元格中的某些字符与另一个单元格中的某些字符进行比较

java - Apache poi : saving jtable to a file

java - 使用 Apache POI 设置 Excel 工作表散点图标记图标的颜色

java - 读取数字证书的友好名称

java - Gson 没有序列化值

java - Selenium Java - 检查 Weblist 元素是否存在

javascript - 在 ag-grid 上使用正确的单元格格式导出到 excel