Java 将SXSSF另存为.xls文件

Java 将SXSSF另存为.xls文件,java,excel,apache-poi,Java,Excel,Apache Poi,我正在使用ApachePOI库将大量数据导入Excel文件。我不能使用HSSF模型,因为它需要太多内存,并且Java抛出内存堆异常。我发现的方法是SXSSF工作簿模型,它将每N行写入文件,而不是将所有工作簿存储在内存中。但是我找不到方法,如何将它保存到.xls(Excel2003和更低的格式)而不是.xlsx File f = new File("file.xlsx"); f.createNewFile(); SXSSFWorkbook wb = new SXSSFWorkbook(200);

我正在使用ApachePOI库将大量数据导入Excel文件。我不能使用HSSF模型,因为它需要太多内存,并且Java抛出内存堆异常。我发现的方法是SXSSF工作簿模型,它将每N行写入文件,而不是将所有工作簿存储在内存中。但是我找不到方法,如何将它保存到.xls(Excel2003和更低的格式)而不是.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();
你不能

同样,HSSF用于处理.xls文件(基于OLE2),XSSF/SXSSF用于处理.xlsx文件(.xlsx)

如果要生成.xls文件,必须使用HSSF用户模型。仅HSSF不支持流式写入

.xls文件格式不如.xlsx(更多的向后/向前引用、偏移量等)适合流式写入,因此HSSF中不支持流式写入。只需增大Java堆的大小,或者切换到SXSSF for.xlsx,或者只需使用CSV之类的简单工具

更新 如果您需要测试应该为系统提供多少内存,以便使用HSSF甚至XSSF进行编写,我建议您尝试使用,它可以在命令行上运行。用所有的jar和给定的堆大小激发它,看看它是否完成。它接受行数、列数以及要创建的文件类型等参数。使用每晚构建并尝试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
你不能

同样,HSSF用于处理.xls文件(基于OLE2),XSSF/SXSSF用于处理.xlsx文件(.xlsx)

如果要生成.xls文件,必须使用HSSF用户模型。仅HSSF不支持流式写入

.xls文件格式不如.xlsx(更多的向后/向前引用、偏移量等)适合流式写入,因此HSSF中不支持流式写入。只需增大Java堆的大小,或者切换到SXSSF for.xlsx,或者只需使用CSV之类的简单工具

更新 如果您需要测试应该为系统提供多少内存,以便使用HSSF甚至XSSF进行编写,我建议您尝试使用,它可以在命令行上运行。用所有的jar和给定的堆大小激发它,看看它是否完成。它接受行数、列数以及要创建的文件类型等参数。使用每晚构建并尝试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

我为应用程序设置了2k内存堆,但这还不够。用户的pc上没有模式ram,所以我不能使堆的大小变大。那么唯一的方法就是使用.xlsx?如果您要导出大量数据,那么无论如何都需要使用.xlsx,因为.xls对行数和列数的限制非常小(按照现代标准)。如果您正设法使用2gb内存,那么几乎可以肯定您已经达到了这些极限!我有大约4万行和大约7-10列。据我所知,xls文件最多可以处理65536行,这对于meSee update来说可能已经足够了——40k行和10列可以在90mb的堆中轻松完成。如果您的程序不适合2gb堆,那么问题似乎在于代码,而不是POI…在大多数机器上它都可以工作,但很少有机器会因为这个问题崩溃。增加堆会增加导出的数据量,但不会太多。我为应用程序设置了2k ram堆,但这还不够。用户的pc上没有模式ram,所以我不能使堆的大小变大。那么唯一的方法就是使用.xlsx?如果您要导出大量数据,那么无论如何都需要使用.xlsx,因为.xls对行数和列数的限制非常小(按照现代标准)。如果您正设法使用2gb内存,那么几乎可以肯定您已经达到了这些极限!我有大约4万行和大约7-10列。据我所知,xls文件最多可以处理65536行,这对于meSee update来说可能已经足够了——40k行和10列可以在90mb的堆中轻松完成。如果您的程序不适合2gb堆,那么问题似乎在于代码,而不是POI…在大多数机器上它都可以工作,但很少有机器会因为这个问题崩溃。增加堆会增加导出的数据量,但不会增加太多。