使用 apache poi 通过 streaming/pagination 策略将 xlsx 文件解析为块

Parsing xlsx files as chunks via streaming/pagination strategy using apache poi

有这样一种情况,其中具有大量数据(数量级为 80-100MB)的 xlsx、xlsm 文件在使用 Workbook 对象的 load() 方法的服务器上导致内存堆满 space 问题, 以 FileInputStream 作为参数。

它的目的是加载数据,验证单元格内容并在存在无效记录条目时报告错误。如果所有数据都正确,则将其写入 table.Hence,以下内容不足以满足我的目的。

Error While Reading Large Excel Files (xlsx) Via Apache POI

问题涉及分页解析、数据验证然后写入数据库。

由于 xlsx 文件是包含内容 XML 的 zip 格式,您可以通过简单的 parsing/discarding 删除页面,创建更小的内容 XML。然后创建一个较小的 xlsx 并使用 Apache POI。使用测试 xlsx 来开发解析。 XML 一般没有换行和缩进;所以 XML 美化器/树编辑器可能会有所帮助。 Excel 使用共享字符串,因此很难看到实际内容。

使用 zip 文件系统 (URLs "jar:file://... .xlsx") 对 xlsx 进行操作。

StAX 解析器是解决这种情况的好方法。 https://docs.oracle.com/javase/tutorial/jaxp/stax/index.html

我们可以遍历工作表以获取每个单元格的值索引,并使用 SharedStringsTable 对象获取特定单元格位置的值。