背景
公司要求做一个数据统计类的功能,大概就是由每个地方采集数据用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