EasyExcel 并发读取文件字段并进行校验,数据写入到新文件,批量插入数据到数据库

背景

公司要求做一个数据统计类的功能,大概就是由每个地方采集数据用excel进行导入,根据地方大小每个文件的数量可能在10万-100万之间不等,导入时要求对每个字段进行校验,可能存在的规则有非空判断,时间格式判断,长度判断,手机号这类正则表达式类校验,文件有多个sheet,每个sheet对应一个表,对应的数量不确定但是不会重复表,有个别sheet需要前面sheet的字段判断。

如果数据有错的,要求在后面新加一列告诉用户错误的原因,正确的数据也要输出一遍(不理解客户的想法。。。),未来有可能会开新sheet单独列出错误的每条数据和错误内容。

最终版本分为单机版和web版,单机版让某些安全要求高的用户用,web版全国通用。

web版作为一个微服务项目提供接口道原来做的信息管理平台。

 

思路

由于web版可以采用的功能更丰富,如补充机制,定时任务,后台MQ异步数据处理等等,这里只谈谈单机版的demo思路。

遇到这类情况首先传统poi方式是行不通的,不过poi也有自己的事件监听机制,这里和EasyExcel是一样的,每一行一行的读取。

 

1.因为EasyExcel不支持多并发写入,所以这里采用了读、写,数据库插入并发操作。

2.校验规则由注解实现,启动时将需要校验的实体类扫描并存到一个容器里,读取每行数据时根据注解上的内容进行校验

3.本次尝试用非阻塞形式实现,因此出现大量的循环......需要注意的有主线程等待超时问题,子线程及时跳出循环问题,有错误数据及时停止数据库线程

4.子线程若执行时间过长也需要及时中断,防止出现线程死锁问题

 

老版本demo:https://download.csdn.net/download/bibiboyx/12897555

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用EasyExcel可以将Excel中的数据读取出来,并且方便地写入数据库中。具体实现步骤如下: 1.在pom.xml中添加EasyExcel的依赖 ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.7</version> </dependency> ``` 2.编写实体类,用于映射Excel中的数据 ``` public class User { private String name; private Integer age; // getter和setter方法省略 } ``` 3.编写Controller方法,用于处理上传Excel文件并将数据写入数据库中 ``` @PostMapping("/upload") public void upload(@RequestParam("file") MultipartFile file) { try { InputStream inputStream = file.getInputStream(); EasyExcel.read(inputStream, User.class, new UserListener(userService)).sheet().doRead(); } catch (IOException e) { e.printStackTrace(); } } // UserListener类用于处理读取到的Excel数据 public class UserListener extends AnalysisEventListener<User> { private UserService userService; public UserListener(UserService userService) { this.userService = userService; } private List<User> userList = new ArrayList<>(); @Override public void invoke(User user, AnalysisContext context) { userList.add(user); if (userList.size() >= 5) { // 每5条记录批量插入数据库 userService.batchInsert(userList); userList.clear(); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { userService.batchInsert(userList); } } ``` 4.将写入数据库中的数据返回到前端进行下载到本地 ``` @GetMapping("/download") public void download(HttpServletResponse response) { List<User> userList = userService.getAllUsers(); try { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = "users.xlsx"; response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); EasyExcel.write(response.getOutputStream(), User.class).sheet("用户信息").doWrite(userList); } catch (IOException e) { e.printStackTrace(); } } ``` 以上就是使用EasyExcel进行Excel数据读写和下载的基本流程,可以根据实际需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值