JAVA:excel通用解析按所需对象返回集合(附DEMO)

          在平时开发和使用过程中,经常会出现要使用excel解析文件,用来处理一些批量业务,比如批量创建,批量修改,或者批量入库保存,这类业务的特点是,一般用txt或者excel保存待处理数据,每一行对应N个字段,N个字段有些可为空,有些不为空,N行循环解析完毕后,获取相应的列的值,一个一个处理,其实处理方有很多种,但是如果说,没有一个通用接口去处理这件事,每次都要写很多的解析代码,然后在一行一行一列一列的处理所需字段,这太麻烦了。最近写的项目,也用到了这一块,但是本来的代码有些问题,尝试自己重写了一遍,感觉清楚很多,记录一下, 也方便以后的使用。

         正题:

              首先,我想实现的效果是,给一个excel文件(xlsx或者xls),然后申明一个xml文件,和一个对象。xml文件负责放一些解析的配置,例如,一个excel文件从第几行开始解析,不解析尾部多少行以后的,以及excel文件中的列的顺序对应对象字段值,例如,第一列的值代表用户名,则xml就可以设置一个item 值为userName,并且对象中也有一个userName,这样解析的时候,就可以,以list的形式,返回行数个userName,对应excel 中的值。

              在实际处理过程中,可以理解为,只要把相关参数填好,通用解析方法,能直接返回一个LIST<T>对象,后续处理直接循环集合中的对象参数就可以获取相关参数,省却了大量的重复解析,重复获取row,和cell的过程。

               实际结果如图所示

               

              设计思路如下:

             1.所需依赖及原因

                    poi包:由于要解析xls,xlsx文件,目前普遍的使用的工具类是poi

                    dom4j:由于配置文件选择放在xml中,所以引入xml对文件及其内部节点进行解析

                    fastJson:内部处理时,是先解析成List<Map<String,Object>>的形式。可由,该形式返回,同时在提供一个接口,

把解析的List<Map<String,Object>> 通过fastJson的方法转成了List<T>的形式

            2. 逻辑

             《1》首先,先创建一个和解析列有对应关系的xml文件,这个文件中存放解析规则:

                   1.解析字段放在map,或对应对象中的字段名字 

                   2.起始解析行(一般为1,因为第零行一般是excel文件的中文标示,例如,名字,账号等,一行开始才是数据)

                   3.结束截止行数(一般为零,如果某些文件有汇总行,比如有两行汇总行,就可以写2,这样最后两行就不解析)

                   4.解析字段顺序(index,可以不写,不写就默认为按xml的字段顺序进行解析了) 

                   5.有其他想要处理的或者忽略的字段也可以,自己自定义,但是那就要自己再改下了-0-

                《2》获取文件路径,获取文件路径,判断是否存在,是否是特定文件尾。通过验证顺便把xls还是xlsx判断了,获取Workbook,并根据接口传值,把所需sheet获取

                       1.得到sheet后,获取xml解析模板文件, 创建一个内部类,包括一个字段名,和字段对应的列下标。循环xml解析模板中的字段,把解析字段,和index下标(没有则为-1,按默认顺序),组装对象,放在List<内部类> 中,该List为后面的列对应值(cell对应)  

                         2.获取起始解析行,和截止行数,以及获取sheet的有数据总行

                         3.for循环遍历row,起始i为起始解析行,(总行数-截止行数)为for 终点

                         4.遍历row的循环内部,遍历List<内部类> 用一个Map<String,Object> 获取单行的:字段名称+值,最终返回一个List<Map<String,Object>>

                          5.到此,一个public 接口已经完成

                          6.用以上的接口,加一个想 要转成的对象为一个新的接口,将获取的List<Map<String,Object>> 转成List<所需对象>,其中,所需对象中的字段,等于map的String,等于xml文件配置的字段名

                          7.结束

                      《3》   注

                        因为我这边用的文件,已经事先说明了,并判断了,文件行数不能大于10000行,所以,就没有进行分页处理,直接一个文件可以转成一个List返回解析。

                          但是,其实也许也有很多需求中,是有上十万,或者百万的数据在一个文件中,在这种情况下,是需要分页解析,分页处理的。这里只说下思路吧

                           在《2》 .3 中的起始行和结束行这里需要改动一下,新增两个参数,一个参数是起始行,一个参数是遍历数,例如,5000,5000,则表明,从第5000行开始解析,并且再解析5000行,for 那里就成了(i=5000;i<=5000+5000;i++),直到最后一次解析数小于5000时,变为   (i=5000;i<=5000+5000-结束截止行数;i++)即可。

                             

                  本次写有关代码也是因为,本来的common方法是有bug的,坑了很久,最后改掉以后,想自己重写一遍,学习一下,最后感觉比原来的写法还是清晰多了

                  3.源码Maven  demo链接

                               https://download.csdn.net/download/zxysshgood/10697773

                            (直接执行poi包下的test,即可看到结果)

 

                                                   

 

              

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用 Java 语言解析 Excel 文件的示例代码: ``` import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; public class ExcelParser { public static void main(String[] args) throws IOException { // 创建 Workbook 对象,读取 Excel 文件 Workbook workbook = new XSSFWorkbook(new FileInputStream("example.xlsx")); // 获取第一个工作表 Sheet sheet = workbook.getSheetAt(0); // 获取行迭代器 Iterator<Row> rowIter = sheet.rowIterator(); // 遍历行 while (rowIter.hasNext()) { Row row = rowIter.next(); // 获取单元格迭代器 Iterator<Cell> cellIter = row.cellIterator(); // 遍历单元格 while (cellIter.hasNext()) { Cell cell = cellIter.next(); // 获取单元格内容 String cellValue = cell.getStringCellValue(); System.out.print(cellValue + "\t"); } System.out.println(); } // 关闭 Workbook 对象 workbook.close(); } } ``` 在上述代码中,我们使用了 Apache POI 库来读取 Excel 文件。POI 是一个开源的 Java 库,它可以帮助我们操作各种 Microsoft Office 文件格式,包括 Excel、Word 和 PowerPoint。 在这个示例中,我们使用了 `XSSFWorkbook` 类来创建 Workbook 对象,该类可以读取 Excel 2007 及以后版本的文件(即 .xlsx 文件)。如果你想读取 Excel 97-2003 版本的文件(即 .xls 文件),你可以使用 `HSSFWorkbook` 类。 然后,我们使用 `getSheetAt()` 方法获取第一个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值