使用过EasyExcel的小朋友都知道,对于一张Excel表,如果我们想要将其解析好,然后导入数据库,后端需要封装对应的监听器去解析Excel,但是当Excel模板多了以后,就需要封装大量的监听器,而且监听里面有好多的冗余代码,需要我们自己去处理逻辑的,几乎就是存储数据到数据库部分。所以我们可不可以封装一个公共的监听器,然后编写对应监听继承此公共监听呢,这样我们只需要专心完善我们的入库逻辑即可。
EasyExcel官网:https://www.yuque.com/easyexcel/doc/easyexcel
需要注意的是,EasyExcel的监听器不能被Spring管理。
直接上公共监听器代码:
1 | /** |
上面说了,应该在文件信息传入构造之前将其入库,那么在业务层可以这样写
1 | private FileInfo saveUploadFileInfo(UploadParamDTO uploadParam) { |
然后在控制器层可以这样写
1 |
|
1 |
|
这里不用担心的是,EasyExcel在执行解析后会自动关闭输入流。
之前我们也说了,EasyExcel的监听器不能被Spring管理,也就是说,它里面的事务管理也是失效的。
那么我们如果入库过程中,出现了异常,我们应该采用何种操作呢?
第一种方式:
上面写的saveUploadFileInfo中不是存了文件标记么,我们可以在入库的数据中带上这个标记入库。
然后,如果我们解析过程中出现异常了,那么此文件解析肯定被标记为失败了,我们可以根据这个标记删除对应的数据。
也就是说,我们要执行 delete 操作,这确实有点极端。
第二种方式:
在监听器中通过构造注入事务管理相关类实现事务回滚。
1 | /** |
在业务层注入事务管理类,然后通过监听器构造器传入即可。
1 |
|
ExcelUtil工具类
工具类导出部分,可以根据自己的需求定制,具体参照官方文档。
1 | import com.alibaba.excel.EasyExcel; |
如果根据上述操作出现了问题,可能是我哪一步遗漏了,在此我说声抱歉,请大家根据出现的问题自行百度排查。。