【问题标题】:How to get total row count from .xlsx file using Apache POI event model API如何使用 Apache POI 事件模型 API 从 .xlsx 文件中获取总行数
【发布时间】:2021-02-08 12:50:44
【问题描述】:

我引用此文档https://poi.apache.org/components/spreadsheet/how-to.html#xssf_sax_api 来读取大型 excel (.xlsx) 文件。我可以使用这种方法读取整个 .xlsx 文件,但在从文件中读取记录时却无法获取总行数。

根据要求,用户正在上传 .xlsx 文件,并且数据始终在 excel 的第一列 (A) 中可用。我从 .xlsx 文件中一一读取记录并发送到队列。但我也想将每个发送数据的记录总数发送到队列。

我几乎为这个解决方案花了 3 个小时,但没有找到合适的代码。

任何帮助将不胜感激。

【问题讨论】:

  • 在解析文件时跟踪行号,并返回看到的最大行号?
  • @Gagravarr 我没明白。你能详细说明一下吗?
  • 查看您链接到的代码中的startElement 方法——它显示了如何获取单元格的引用,其中包括行号。只需在解析时跟踪它的最大值
  • @Gagravarr 感谢您的详细说明。我已经为不同的目的跟踪行号,但是当调用“endElement”方法时,我需要总行号eveytime。根据要求,我想将每条记录的总行号发送到队列。在 endElement 方法中,我编写了这个逻辑以在队列中发送。
  • 你必须解析文件两次,一次是为了得到总数,然后是第二次用值

标签: java apache-poi saxparser


【解决方案1】:

POI 示例中有第二个流式传输示例。 http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/examples/xssf/eventusermodel/XLSX2CSV.java

这个使用不同的流式接口,它使用行号公开 startRow 和 endRow 事件。

另一种方法是使用 excel-streaming-reader - 请参阅示例 (https://github.com/pjfanning/excel-streaming-reader-sample/blob/master/src/main/java/com/github/pjfanning/poi/sample/StreamingRead.java) - 这可以修改为记录最后一行中的最后一个 'getRowNum()' 值。

【讨论】:

  • 感谢您的方法。在这两种情况下,我都会在读取最后一行时获得总行数。但就我而言,我在从 excel 读取第一条记录时需要总行数。
  • excel-streaming-reader(上面的“另一种方法”)在其 Sheet 实现中有一个 getLastRowNum()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多