【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

这篇具有很好参考价值的文章主要介绍了【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  springboot篇章整体栏目: 


【一】springboot整合swagger(超详细

【二】springboot整合swagger(自定义)(超详细)

【三】springboot整合token(超详细)

【四】springboot整合mybatis-plus(超详细)(上)

【五】springboot整合mybatis-plus(超详细)(下)

【六】springboot整合自定义全局异常处理

【七】springboot整合redis(超详细)

【八】springboot整合AOP实现日志操作(超详细)

【九】springboot整合定时任务(超详细)

【十】springboot整合redis实现启动服务即将热点数据保存在全局以及redis(超详细)

【十一】springboot整合quartz实现定时任务优化(超详细)

【十二】springboot整合线程池解决高并发(超详细,保你理解)

【十三】springboot整合异步调用并获取返回值(超详细)

【十四】springboot整合WebService(超详细)

【十五】springboot整合WebService(关于传参数)(超详细)

【十六】springboot整合WebSocket(超详细)

【十七】springboot整合WebSocket实现聊天室(超详细)

【十八】springboot实现自定义全局异常处理

【十九】springboot整合ElasticSearch实战(万字篇)

【二十】springboot整合过滤器实战

【二十一】springboot整合拦截器实战并对比过滤器

【二十二】springboot整合activiti7(1) 实战演示篇

【二十三】springboot整合spring事务详解以及实战

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十五】springboot整合jedis和redisson布隆过滤器处理缓存穿透

【二十六】springboot实现多线程事务处理_springboot多线程事务

【二十七】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能


        在公司开发时,遇到一个很常见的导入功能的需求,需要导入Excel文件,由此想到了阿里巴巴的EasyExcel这个方便的工具,当客户给我说需要支持大数据量导入时,我想到了使用线程池来多线程处理导入数据库这个操作。由此本章记录一下这次操作。

qq交流群导航——>231378628文章来源地址https://www.toymoban.com/news/detail-400801.html

        首先,整体的大概流程差不多是这个样子:

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

效果:

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据


        真实项目上是公司封装的RPC框架,这次demo直接使用的前面的整合mybatis-plus的demo来写的。

        首先看下目录结构

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

        图片中框选部分就是本章需要修改到的或者新创建的文件,后面一一解读,下面的描述可以对标这个图片中的类名。

        然后介绍下本章需要做的准备工作:

  • 数据库表
  • 修改application配置文件,修改tomcat的最大文件上传限制(否则excel文件太大,上传会报错)
  • 开启mybatis-plus的批量插入功能,mybatis-plus默认只有insert这个单条插入功能(若自己的项目不使用这个,则不需要,这只是我的demo上没有批量插入方法)
  • 创建excel多线程导入接口所需的各个类

目录

一、准备数据库和Excel文件

二、引入所需依赖

三、修改配置文件,修改文件大小默认限制

四、开启mybatis-plus的批量保存功能

五、创建所需工具类

六、创建业务各层代码

七、创建easyExcel事件监听器

八、创建自定义线程类

九、测试单线程和多线程处理的效率


一、准备数据库和Excel文件

CREATE TABLE `deadman` (
  `uid` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '主键',
  `idCard` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '身份证号',
  `userName` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '死者姓名',
  `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '死者性别',
  `age` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '死者年龄',
  `reason` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '死因',
  `house` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '安排地狱层数',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据


二、引入所需依赖

        主要是导入easyExcel所涉及的依赖,如下:

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据


三、修改配置文件,修改文件大小默认限制

        这个必须修改,不然后面接口都进不去,默认tomcat服务器是限制了上传文件的大小的。

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
server:
  tomcat:
    max-swallow-size: 100MB 

四、开启mybatis-plus的批量保存功能

        这次demo整合的rpc框架是Mybatis-plus,所以找了一个方法去实现批量保存,如下:

1、新建一个SpiceSqlInjector类

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

PS:注意框选部分类名。

2、创建SpiceBaseMapper接口类

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

PS:本来是业务的接口层去继承BaseMapper,此处又它去继承BaseMapper,然后加如上图这个方法,注意名称必须是这个否则后面调用该方法会报错。

3、创建业务所需的Mapper层

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

继承刚才自定义的接口类。

由此就可以通过注入DeadManMapper调用上面的方法实现批量插入了。

如下:

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据


五、创建所需工具类

        在通过EasyExcel导入时,会涉及到一些数据类型不满足入参之类的,本次demo涉及到如下工具类。

1、MultipartFileToFileUtils

        将传入的MultipartFile类型转为File类型,Controller接收到的是MultipartFile类型,EasyExcel.read方法所需要的是File类型。

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

2、SpringJobBeanFactory

        在监听器类注入mappe时会报空指针,使用如下工具类继承ApplicationContextAware,获取bean对象。

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据


六、创建业务各层代码

1、controller层

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

2、映射数据库的实体类

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

        关于mybatis-plus相关的注解可以去看看前面的文章。 

3、easyExcel的实体类

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

        index指的是excel表上面的行编号,例如

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

4、service层

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

5、service的实现类层

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

        上面的方法是多线程处理的事件监听器,下面的是单线程的事件监听器,后面针对两种方式都做一下对比。 


七、创建easyExcel事件监听器

1、单线程的事件监听器

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

        解析:该监听器继承自AnalysisEventListener类,泛型指定为上面easyExcel指定的实体类对象类。重写该类的两个方法:invoke和doAfterAllAnalysed。 

invoke():该方法会从excel表的第二行开始读取数据。

doAfterAllAnalysed():当invoke将excel的数据全部解析完后,会执行该方法,所以在该类进行数据的入库即可。

        此时,单线程的导入已经完成,我们最后再对比测试两种监听器的效率,现在创建多线程事件监听器。 

2、多线程的事件监听器

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

        解析:同样是重写上面说的那两个方法。invoke方法的处理不变,修改doAfterAllAnalysed方法的处理,在该方法通过创建线程池的方法,将创建的线程任务提交到线程池,让线程池进行多线程任务的执行,从而实现多线程执行导入操作。

流程:创建线程池——》计算每个线程需要处理的数据——》创建CountDownLatch对象(保证最后每个线程会回到主线程)——》循环线程数量并提交线程任务到线程池——》执行CountDownLatch对象的await方法,让当前线程处于等待状态,等待CountDownLatch减少为1后会唤醒当前线程——》每个线程处理自己的数据并在处理完后执行CountDownLatch对象的countDown方法,让CountDownLatch对象的值减一——》当CountDownLatch的值为0时(说明线程池类的线程任务以及执行完成),执行主线程的代码——》关闭线程池

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据


八、创建自定义线程类

        此步骤创建上面描述的线程任务类。

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

        实现Callable或者Runable或者继承Thread都行,此处实现Runable,重写run方法。

        根据传入的划分给他的数据区间,将该区间的数据通过subList方法取出来之后,执行上面实现的批量插入方法进行数据的入库操作。为了防止代码出现问题不执行coutDown方法,将该句代码写入finally。

PS:CountDownLatch的两个方法(countDown,await)配合使用,保证每个线程的代码执行时,主线程进入等待,然后等各个线程任务执行完后,又回到主线程进行执行。


九、测试单线程和多线程处理的效率

        上面已经完成了单线程和多线程事件监听器的编写,下面开始测试两者的效率。

1、使用单线程事件监听器

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据​  

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

        结果:100033条数据,数据正确。 

2、使用多线程事件监听器

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

        结果:100033条数据,数据正确,确实快了很多。


        我觉得对于业务简单的多线程处理类似场景的都可以拿这个demo拿去改造一下,如果有问题,谢谢大家指出。瑞思拜。

qq交流群导航——>231378628

到了这里,关于【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用EasyExcel实现Excel的导入导出

    在真实的开发者场景中,经常会使用excel作为数据的载体,进行数据导入和导出的操作,使用excel的导入和导出有很多种解决方案,本篇记录一下EasyExcel的使用。 EasyExcel是一个开源的项目,是阿里开发的。EasyExcel可以简化Excel表格的导入和导出操作,使用起来简单快捷,易上手

    2023年04月15日
    浏览(38)
  • 使用EasyExcel实现模板下载、数据导入功能

    1.在你的工程下添加模板文件 2.编写代码实现下载功能 controller serviceImpl 好了,到这里,一个简单的下载模板功能就实现了。不过我在项目运行中遇到了一些坑,下面记录一下。 3.项目中遇到的坑:excel文件在springboot的maven项目下打了jar包后损坏 4.解决办法:试了很多种,主要

    2024年02月13日
    浏览(29)
  • 使用EasyExcel实现Excel表格的导入导出

    Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 easyexcel重

    2024年02月12日
    浏览(32)
  • Java 使用 EasyExcel 实现导入导出(新手篇教程)

    官网镇楼↓,觉得我写的不好的同学可以去官网看哦 EasyExcel 示例: 如上一个简易 Excel 表格,表头占了两行,且第三列开始才为有效数据,那么我们应该如何导入? 建造实体类 首先无论是导入还是导出,都需要先建对应的实体类  如图所示,因为我的示例 Excel 一共需要读

    2024年04月17日
    浏览(31)
  • Java多线程&并发篇----第二十四篇

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 采用时间片轮转的方式。可以设置线程的优先级,会映射到下层的系统上

    2024年01月20日
    浏览(35)
  • 使用POI和EasyExcel来实现excel文件的导入导出

    废话不多说咱们直接上干货!!!! 一.读取Excel表格 【1】使用POI读取excel表格中的数据 POI还可以操作我们这个word文档等等,他不仅仅只能弄Excel,而JXI只能操作excel 1.POI的结构,我们可以更具文件的类去选择 相关的对象我当前是使用的XLSX来操作的 HSSF - 提供读写Microsoft

    2024年02月05日
    浏览(39)
  • SpringBoot整合EasyExcel,Excel导入导出就靠它了

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了如何在SpringBoot项目中整合EasyExcel,实现Excel快捷导入导出,解析Excel导入导

    2024年02月16日
    浏览(27)
  • “easyExcel”导入的代码实现

    使用easyExcel在导入数据事有很好的使用性,方便操作。 前端解析的文件流调用这个方法; 需要首先创建监听方法类 创建utils,创建这个方法即可 通过“easyExcel”导出文件代码:  在此记录,方便下次使用时调用。

    2024年02月15日
    浏览(34)
  • JAVA实现easyExcel批量导入

    注解 类型 描述 ExcelProperty 导入 指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index=0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。千万别三个混着用,除非你非常了解源代码中三个

    2024年04月27日
    浏览(30)
  • EasyExcel实现导入+各种数据校验

    实现的功能 1.导入非xls和xlsx格式的文件 2.导入空数据的excel文件 3.数据缺失 4.导入的excel文件中有重复的数据 5.导入的excel文件数据错误 6.导入的模板不是正确模板 前置条件: 1)传的参数是 MultipartFile file 2)编写一个接收excel文件的实体类,保证@ExcelProperty(“表头1”)中的属性和

    2024年02月02日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包