将SXSSF保存为.xls文件

时间:2013-12-19 09:46:13

标签: java excel apache-poi

我正在使用Apache POI库将大量数据导入Excel文件。我不能使用HSSF模型,因为它需要太多内存而Java会抛出内存堆异常。我找到的方法是SXSSF工作簿模型,它将每N行写入文件,而不是将所有工作簿存储在内存中。但我找不到方法,如何将其保存为.xls(Excel 2003及更低格式)而不是.xlsx。

File f = new File("file.xlsx");
f.createNewFile();
SXSSFWorkbook wb = new SXSSFWorkbook(200);
//inputing values here
FileOutputStream fileOut = new FileOutputStream(f);
wb.write(fileOut);
fileOut.close();

1 个答案:

答案 0 :(得分:4)

你不能。

作为explained on the POI Components page,HSSF用于处理.xls文件(基于OLE2),而XSSF / SXSSF用于处理.xlsx文件(.xlsx)

如果要生成.xls文件,则必须使用HSSF UserModel。 HSSF没有流写入支持,只有streaming read

.xls文件格式不太适合流式写入.xlsx(更多后退/前向引用,偏移等),因此HSSF中没有流写入支持。只是提高你的Java堆大小,或者切换到.xlsx的SXSSF,或者只使用像CSV这样简单的东西!

<强>更新 如果你需要测试你应该给你的系统用HSSF,甚至XSSF写入多少内存,我建议你尝试使用SSPerformanceTest example,它可以在命令行上运行。用所有的罐子和给定的堆大小来解决它,看看它是否完成。它接受行数和列数以及要创建的文件类型的参数。使用每晚构建并尝试40k行/ 10列,我可以在90mb堆中快速完成它:

$ java -Xmx90m -classpath poi-3.10-beta3-20131219.jar:poi-examples-3.10-beta3-20131219.jar:poi-ooxml-3.10-beta3-20131219.jar \
     org.apache.poi.ss.examples.SSPerformanceTest HSSF 40000 10 1
Elapsed 1 seconds