@TOC
1.需求背景
最近有一个工作任务是用户提供了一个基础的excel文件,要求首先将excel中的数据解析并入库,然后再做后续的一些业务处理,因此涉及到excel的数据读取,正常如果是一行一行数据的excel的读取,还是比较简单,但用户提供的数据涉及跨行跨列问题,就稍有点麻烦,比如数据样例如下:
需要将跨行跨列数据也读取出来最后进行入库处理,比如要解析成如下的数据并入库。
2.实现思路分析
首先以上的excel样例数据中,第一列共2个跨行区域,天河区和番禺区,每个跨行区域中在第二列又存在子跨行数据的问题,查看了poi的api,如获取到excel的工作表sheet后(通过如XSSFSheet sheet = xssfWorkbook.getSheetAt(0);获取
),有个sheet.getNumMergedRegions()
方法,此方法会返回excel中的所有关于合并单元格的信息,每个信息中包含了这个合并单元格的开始行,结束行,开始列,结束列
。合并单元格的数据能通过第一行
和第一列
获取到。
因此,可以采用一个hashmap将以上的合并单元格的信息进行预先读取,将存在合并单元格的列记录入put进hashmap, 如key为行号+下划线+列号组成
,value为记录了合并单元格的起始行号和起始列号组成的数组
。
有了上面的hashmap之后,就可以按常规的遍历excel的行,然后再遍历excel的列进行数据的读取处理了,对每一个单元格进行判断,判断此单元格的行号+列号组成的key是不是在hashmap中存在,存在的话说明是一个合并单元格,读取数据就从value中取出合并单元格的起始行号和起始列号,通过合并单元格的起始行号和起始列号组成的单元格读取真正的数据(合并单元数的组据在首行和首列,其他行和列是空白
)比如,以下的510075的数据,要通过读B2这一格才能读到数据
3.重要代码片码说明
- 获取存在合并单元格的列记录并以行号列号为key组成的map
1 | c复制代码 //将存在合并单元格的列记录入put进hashmap并返回 |
4.完整的代码类如下:
1 | c复制代码package poitest; |
5.完整的demo代码提供如下
github: github.com/jxlhljh/exc…
gitee: gitee.com/jxlhljh/exc…
6.demo执行结果
本文转载自: 掘金