【问题标题】:How to parse xls file containing multiple sheets, within 50MB of memory, in Java如何在Java中解析包含多个工作表的xls文件,在50MB内存中
【发布时间】:2017-09-11 14:13:36
【问题描述】:

我使用过 POI 和 Jexcel。 POI 使用与文件大小一样多的内存,而 Jexcel 在加载工作簿时会占用大量内存。 我的要求是将xls文件分块处理,以减少内存消耗。

【问题讨论】:

  • 定义“分块处理”。什么是“块”?
  • 当工作表是独立的。 xlsx 文件只是带有 XML 文件等的 zip。使用 java zip 文件系统 (jar:file:/...)。内容 XML 可以通过 zip 上的简单 BufferedReader 为每个工作表拆分,并生成一个新的 xlsx。
  • “分块处理 xls 文件”:这是不可能的,因为所有类型的 Excel 文件都有一个内部文件系统,分为工作簿部分、样式部分、共享字符串部分和工作表部分。所以没有办法避免将整个Excel 文件作为一个单元来处理。但是apache poiHSSFXSSF 提供了一种事件驱动的方法。
  • @Stephen C Chunks 表示我不必将整个文件加载到内存中,我可以分小部分进行处理。
  • @Joop Eggen 我想解析 xls 而不是 xlsx。

标签: java apache-poi xls chunks memory-efficient


【解决方案1】:

Apache POI 提供类似 SAX 的 API 来访问 Excel 文档。

Apache POI Event API:

事件 API 比用户 API 更新。 [...] 提供的优势是您可以读取带有 相对较小的内存占用。

【讨论】:

  • HSSF 事件 API 与 SAX 无关,因为 SAXS 简单的 API 用于 X ML 和HSSF 不是XML 而是二进制文件格式BIFF
  • @Axel Richter:我知道 SAX 是什么。事件 API 是一个 SAX like API。请参阅POI Spreadsheet API Feature Summary。他们将 Excel 解析与 XML 解析进行了比较。有一个类似于 XML DOM 的 API,它将整个文档加载到内存中。还有一个类似于 SAX 的 API,不需要内存中的整个文档。
  • 能否请您命名与xml解析器相同的api。
  • @somey:我的答案中有一个链接
  • 引用链接页面:" 如果您只是读取电子表格数据,则使用 org.apache.poi.hssf.eventusermodel 包或 org.apache.poi.hssf.eventusermodel 包中的 eventmodel api。 apache.poi.xssf.eventusermodel 包,取决于你的文件格式。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2019-12-17
  • 2011-03-15
  • 2017-07-20
  • 2012-01-04
相关资源
最近更新 更多