【问题标题】:pagination of xlsx file to XSSFworkbook using apache POI使用 apache POI 将 xlsx 文件分页到 XSSFworkbook
【发布时间】:2016-05-17 17:26:08
【问题描述】:

现在在我的代码中,我正在将一个 xlsx 文件读入 XSSFWorkbook,然后最终将其写入数据库。但是,当 xlsx 文件的大小增加时,会导致 outOfMemory 错误。 我无法增加服务器大小,或将 xlsx 文件分成几块。 我尝试使用文件(而不是输入流)加载工作簿,但这也没有帮助。

我正在寻找一种方法来一次读取 10k 行(而不是一次读取整个文件)并迭代地写入工作簿,然后再写入数据库。

有没有使用 Apache POI 的好方法?

【问题讨论】:

    标签: java apache-poi


    【解决方案1】:

    POI 包含专门为此目的设计的称为“事件模型”的东西。提到了in the FAQ

    SS eventmodel 包是用于读取 Excel 文件的 API,无需将整个电子表格加载到内存中。它确实需要用户更多的知识,但减少了十倍以上的内存消耗。它基于结合 SAX 的 AWT 事件模型。如果您需要只读访问权限,这是最好的方法。

    但是,如果问题出在其他地方,您可能需要先仔细检查。查看this item:

    1. 我认为 POI 占用了太多内存!我能做些什么? 这个问题出现了很多,但通常原因并不是您最初的想法。所以,首先要检查的是——问题的根源是什么?你的文件?你的代码?你的环境?还是 Apache POI?

    (如果您在这里,您可能会认为它是 Apache POI。但是,它通常不是!一台中等大小的笔记本电脑,从一开始就可以正常读取或写入文件在几秒钟内包含 100 列和 100,000 行,包括启动 JVM 的时间)。 Apache POI 附带了一些程序和一些示例程序,可用于进行一些基本的性能检查。对于测试文件生成,要使用的类在示例包 SSPerformanceTest 中。使用写入类型(HSSF、XSSF 或 SXSSF)、行数、列数以及是否应保存文件的参数运行 SSPerformanceTest。如果您不能在 3 秒内运行 HSSF 和 SXSSF 中的 50,000 行和 50 列,并且不能在 10 秒内运行 XSSF(理想情况下,所有 3 个都在不到 10 秒内!),那么问题出在您的环境上。 接下来,使用示例程序 ToCSV 尝试使用 HSSF 或 XSSF 读取文件。相关的是 XLSX2CSV,它使用 SAX 解析 .xlsx。对您的问题文件和由 SSPerformanceTest 生成的相同大小的简单文件运行此文件。如果这很慢,那么文件的处理方式可能存在 Apache POI 问题(POI 做出了一些可能并不总是对所有文件都正确的假设)。如果这些测试很快,那么任何性能问题都存在于您的代码中!

    【讨论】:

    • 嗨,Ray,我尝试按照您的指南探索更多细节,但我仍然找不到方法。请推荐一段代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2018-04-29
    相关资源
    最近更新 更多