将SXSSF保存为.xls文件

我正在使用Apache POI库将大量数据导入Excel文件。 我不能使用HSSF模型,因为它需要太多的内存和Java引发内存堆exception。 我发现的方式是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(); 

你不能。

正如在POI组件页面上所解释的 ,HSSF用于处理.xls文件(基于OLE2),而XSSF / SXSSF用于处理.xlsx文件(.xlsx)

如果你想生成一个.xls文件,你将不得不使用HSSF UserModel。 HSSF没有stream式写入支持,只有stream式读取 。

.xls文件格式不适合将stream写入为.xlsx(更多后退/前转引用,偏移等),因此HSSF中不支持stream式写入。 只是碰到你的Java堆大小,或切换到SXSSF的.xlsx,或者只是使用一些简单的CSV!

更新如果你需要testing你的系统应该给HSSF甚至XSSF写多less内存,我build议你尝试使用SSPerformanceTest例子 ,它可以在命令行上运行。 用所有的jar子和一个给定的堆大小火,看看它是否完成。 它需要参数的行数和列数,以及要创build的文件的types。 使用每晚构build并尝试一个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