【问题标题】:XSSFWorkbook takes a lot of time to loadXSSFWorkbook 需要很长时间才能加载
【发布时间】:2012-06-24 15:54:26
【问题描述】:

我正在使用以下代码:

File file = new File("abc.xlsx");
InputStream st = new FileInputStream(file);
XSSFWorkbook wb = new XSSFWorkbook(st);

xlsx 文件本身有 25,000 行,每行包含 500 列的内容。在调试过程中,我看到我创建 XSSFWorkbook 的第三行,需要很长时间(1 小时!)才能完成此语句。

有没有更好的方法来访问原始 xlsx 文件的值?

【问题讨论】:

    标签: java excel optimization apache-poi xssf


    【解决方案1】:

    首先,当您有文件时,不要从 InputStream 加载 XSSFWorkbook!使用 InputStream 需要将所有内容缓冲到内存中,这会占用空间并花费时间。既然你不需要做缓冲,那就不要!

    如果您使用 POI 的最新夜间版本运行,那么这非常容易。你的代码变成:

    File file = new File("C:\\D\\Data Book.xlsx");
    OPCPackage opcPackage = OPCPackage.open(file);
    XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);
    

    不然很相似:

    File file = new File("C:\\D\\Data Book.xlsx");
    OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
    XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);
    

    【讨论】:

    • 如果不能完全解决问题,那么可以使用 poi event api 作为一种低内存占用的方式来读取大文件。 poi 文档在此处包含一个示例:poi.apache.org/spreadsheet/how-to.html#xssf_sax_api
    • 谢谢,试试这个。只是想知道这将如何解决问题?它不会将内容缓冲到内存中吗?还是它只是使用原始引用访问数据?
    • 如果你用文件打开它,缓冲的比用输入流打开的少
    【解决方案2】:

    考虑使用 POI 的 Streaming 版本。这将根据需要将文件的一个子集加载到内存中。这是处理大文件时推荐的方法。

    POI SXSSF

    【讨论】:

    • 我的印象是POI的流式版本只适用于写文件,不适用于读文件。
    • 正确,SXSSF 仅供写作。要进行低内存读取,您需要事件(SAX)处理
    最近更新 更多