【问题标题】:Saving SXSSF as .xls file将 SXSSF 保存为 .xls 文件
【发布时间】:2013-12-19 09:46:12
【问题描述】:

我正在使用 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();

【问题讨论】:

    标签: java excel apache-poi


    【解决方案1】:

    你不能。

    正如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
    

    【讨论】:

    • 我已经为应用设置了 2k 内存堆,但这还不够。而且用户电脑上没有模式内存,所以我不能让堆大小变大。那么唯一的办法就是使用.xlsx?
    • 如果您要导出大量数据,则无论如何都需要使用 .xlsx,因为 .xls 对行数和列数的限制相当小(按照现代标准)。如果您设法使用 2gb 内存,那么您几乎可以肯定处于这些限制!
    • 我有 ~40k 行和 ~7-10 列。据我所知,xls 文件最多可以处理 65536,这对我来说可能已经足够了
    • 查看更新 - 40k 行和 10 列可以在 90mb 堆中非常愉快地完成。如果您的程序不适合 2gb 堆时遇到问题,那么问题似乎出在您的代码而不是 POI...
    • 在大多数机器上都能正常工作,但很少有人会因为这个问题而崩溃。增加堆会增加导出的数据量,但不会太多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多