一 背景
业务需求,经常会有一些导入数据的需求,如果每次都需要针对不同导入excel一一去解析,开发起来费时费力,效率还会很低。
那么有没有什么办法可以提高这个开发效率,比如可以直接把excel的行记录直接转换为对象,每次只需要维护好列的顺序和字典的顺序即可,答案是肯定的,下面我们就来介绍一下如何做。
二 引入依赖
1 | # 版本可替换为最新版本 |
jxls的官网请参考:http://jxls.sourceforge.net/index.html
三 通用工具类
专门写一个通用工具类,完成行记录到对象列表的转换工作,工具类如下:
1 | import org.apache.poi.ss.usermodel.Cell; |
四 使用工具类示例
定义一个UserVO如下:
1 | import lombok.Data; |
Controller类如下:
1 | import lombok.extern.slf4j.Slf4j; |
excel数据如下
通过postman测试
后台日志如下
1 | 2021-03-28 03:40:13.470 INFO 98472 --- [nio-8082-exec-1] c.e.p.z.d.c.api.v1.ReadExcelController : user infos: [UserVO(name=张三, age=29, addr=广州市黄埔区xx小区xx栋xxxx1号房), UserVO(name=李四, age=20, addr=广州市黄埔区xx小区xx栋xxxx2号房), UserVO(name=王五, age=25, addr=广州市黄埔区xx小区xx栋xxxx3号房)] |
从以上测试可见,完全实现了我们想要的结果。
五 结论
通过以上工具类的做法,我们确实是方便了从excel到对象的转换,但是此处也有一个点是特别需要注意的,那就是excel列的顺序一定要严格与定义VO字段的顺序是一致的,否则会报错。这个VO定义好之后,正常情况下是不允许随便增删字典或者调整字段顺序的,如果变了,excel列也得随之改变。
并且该工具类还支持了Spring的validation校验,可以给属性加上@NotBlank、@NotNull等等validation相关注解就能同时对字段进行校验,避免了解析出来之后还需要在代码层面再做一次校验的麻烦。
另外,该工具类,还可以根据自己的业务需求做进一步的调整,可以做的更通用以满足多样的导入需求。