EasyExcel如何读取全部Sheet页数据方法

一、需求描述

Excel表格里面大约有20个sheet页,每个sheet页65535条数据,需要读取全部数据,并导入至数据库。

找了好多种方式,EasyExcel比较符合,下面看代码。

二、实现方式 采用EasyExcel框架的doReadAll()方法

 1、DemoController

    /*** 导入文件分析*/public void importAll(){String fileName = "D:\\aa.xlsx";//读取所有Sheet的数据.每次读完一个Sheet就会调用这个方法EasyExcel.read(fileName, new EasyExceGeneralDatalListener(empService)).doReadAll();}

 2、EmpService 

import java.util.List;
import java.util.Map;public interface EmpService 
{public void importData(List<Map<Integer, String>> dataList);
}

 3、EmpServiceImpl 

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.springframework.stereotype.Service;import com.ruoyi.imp.service.EmpService;
import com.ruoyi.jdbc.util.JDBCDruidUtils;@Service
public class EmpServiceImpl implements EmpService 
{/** 测试用Excel导入超过10w条数据,经过测试发现,使用Mybatis的批量插入速度非常慢,所以这里可以使用 数据分批+JDBC分批插入+事务来继续插入速度会非常快*/@Overridepublic void importData(List<Map<Integer, String>> dataList) {//结果集中数据为0时,结束方法.进行下一次调用if (dataList.size() == 0) {return;}//JDBC分批插入+事务操作完成对20w数据的插入Connection conn = null;PreparedStatement ps = null;try {long startTime = System.currentTimeMillis();System.out.println("此次共"+dataList.size() + "条数据,导入开始时间:" + startTime + "ms");// JDBCDruidUtils.getConnection() 此部分为JDBC连接,百度一下就有conn = JDBCDruidUtils.getConnection();//控制事务:默认不提交conn.setAutoCommit(false);String sql = "insert into tp_import_all (wy,kh,ch,dk,on,wlc,ncv,mc,jmc) values";sql += "(?,?,?,?,?,?,?,?,?)";ps = conn.prepareStatement(sql);//循环结果集:这里循环不支持"烂布袋"表达式for (int i = 0; i < dataList.size(); i++) {Map<Integer, String> item = dataList.get(i);ps.setString(1, item.get(0));ps.setString(2, item.get(1));ps.setString(3, item.get(2));ps.setString(4, item.get(3));ps.setString(5, item.get(4));ps.setString(6, item.get(5));ps.setString(7, item.get(6));ps.setString(8, item.get(7));ps.setString(9, item.get(8));//将一组参数添加到此 PreparedStatement 对象的批处理命令中。ps.addBatch();}System.out.println("importData方法,executeBatch()...开始执行");//执行批处理ps.executeBatch();System.out.println("importData方法,executeBatch()...执行结束");System.out.println("importData方法,commit()...开始提交");//手动提交事务conn.commit();System.out.println("importData方法,commit()...提交结束");long endTime = System.currentTimeMillis();System.out.println(dataList.size() + "条,导入结束时间:" + endTime + "ms");System.out.println("导入用时:" + (endTime - startTime) + "ms");} catch (Exception e) {e.printStackTrace();System.out.println("catch Exception e");} finally {//关连接JDBCDruidUtils.close(conn, ps);System.out.println("JDBCDruidUtils.close 关连接");}}}

4、EasyExceGeneralDatalListener 

import java.util.ArrayList;
import java.util.List;
import java.util.Map;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.ruoyi.imp.service.EmpService;// 事件监听
public class EasyExceGeneralDatalListener extends AnalysisEventListener<Map<Integer, String>> {/*** 处理业务逻辑的Service,也可以是Mapper*/private EmpService  empService;/*** 用于存储读取的数据*/private List<Map<Integer, String>> dataList = new ArrayList<Map<Integer, String>>();public EasyExceGeneralDatalListener() {}public EasyExceGeneralDatalListener(EmpService empService) {this.empService = empService;}@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {//数据add进入集合dataList.add(data);//size是否为100000条:这里其实就是分批.当数据等于20w的时候执行一次插入if (dataList.size() >= ExcelConstants.GENERAL_ONCE_SAVE_TO_DB_ROWS) {//ExcelConstants.GENERAL_ONCE_SAVE_TO_DB_ROWS Integer类型,控制条数//存入数据库:数据小于1w条使用Mybatis的批量插入即可;saveData();//清理集合便于GC回收dataList.clear();}}/*** 保存数据到DB** @param* @MethodName: saveData* @return: void*/private void saveData() {System.out.println("saveData方法,importData...开始");//    empService.importData(dataList);System.out.println("saveData方法,importData...结束");// 回收dataList.clear();}/*** Excel中所有数据解析完毕会调用此方法** @param: context* @MethodName: doAfterAllAnalysed* @return: void*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("doAfterAllAnalysed方法,saveData...开始");// 调用方法saveData();System.out.println("doAfterAllAnalysed方法,saveData...结束");// 回收dataList.clear();}
}

三、其他问题

 1、所用版本

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.10</version>
        </dependency>

2、可能会碰到null的报错,可以检查下poi版本是否冲突,这边用的4.1的版本

如果出现poi-ooxml是4.x版本,poi是3.x  可能会出错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/234343.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哪吒汽车拔头筹,造车新势力首家泰国工厂投产

中国造车新势力首家泰国工厂投产&#xff01;11月30日&#xff0c;哪吒汽车位于泰国的首家海外工厂——泰国生态智慧工厂正式投产下线新车&#xff0c;哪吒汽车联合创始人兼CEO张勇、哪吒汽车泰国合作伙伴BGAC公司首席执行官万查曾颂翁蓬素等出席仪式。首辆“泰国制造”的哪吒汽…

如何熟练使用vim工具?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

.net-去重的几种情况

文章目录 前言1. int 类型的list 去重2. string类型的 list 去重3. T泛型 List去重4. 使用HashSet List去重5. 创建静态扩展方法 总结 前言 .net 去重的几种情况 1. int 类型的list 去重 // List<int> List<int> myList new List<int>(){ 100 , 200 ,100…

使用Three.js创建导航立方体

什么是导航立方体&#xff1f; 导航立方体是一个交互式的3D控件&#xff0c;它允许用户通过点击和拖动立方体的各个面来改变3D视图的方向。这是一种非常直观的方式&#xff0c;让用户能够轻松地在3D空间中导航。 创建导航立方体 下面是一个基本的步骤&#xff0c;说明如何使用…

BUUCTF [GXYCTF2019]BabySQli 1 详解!(MD5与SQL之间的碰撞)

题目环境burp抓包 随便输入值 repeater放包 在注释那里发现某种编码 MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5 看着像是base编码格式 通过测试发现是套加密&#xff08;二次加密&#xff09; 首先使用base32对此编码…

shell编程系列(7)-使用wc进行文本统计

文章目录 前言wc命令的使用wc命令的参数说明&#xff1a;统计字数统计行数打印文本行号 结语 前言 统计功能也是我们在shell编程中经常碰到的一个需求&#xff0c;wc命令可以适用于任何需要统计的数据&#xff0c;不只是统计文本&#xff0c;配合ls命令我们可以统计文件的个数…

4.livox hap(大疆激光雷达)环境搭建

本文是在rk3588设备的ubuntu20.04的系统环境下搭建livox hap的。大概的步骤分为&#xff1a; 一、gcc、g、cmake 的安装 二、ros安装&#xff08;上一章已介绍&#xff09; 三、Livox SDK2的编译 四、livox_ros_driver2的编译 五、hap的点云视频录制、点播点云视频bag、ba…

开启虾皮购物新旅程,快速注册买家号

想要在shopee上畅享丰富的购物体验吗&#xff1f;那就让我们一起迈出第一步&#xff0c;注册一个属于你自己的虾皮买家号吧&#xff01; 1. 访问虾皮平台 首先&#xff0c;打开你的浏览器&#xff0c;输入虾皮平台网址&#xff0c;点击注册或登录按钮。这将引导你进入注册界面…

基数排序及利用数组简化解题

红豆不堪看&#xff0c;满眼相思泪 本文主要是帮助大家熟练掌握利用数组进行有关判断的题目&#xff0c;看完本文后在之后的刷题中都可以利用这种思想&#xff0c;当然举例中的题目利用该种方法可能不是最优解&#xff0c;但绝对是你看到题目不用思考太多就可以做出来的方法&am…

实验8配置工具

一、实验目的 1. 掌握UML中建模工具——部署图&#xff0c;用于显示系统中软件和硬件的物理架构。 2. 掌握应用Visio等业界常用的建模工具的基本使用方法和基本绘图操作&#xff0c;选择一种并熟练使用&#xff0c;会使用该工具针对具体问题建立分析模型。 二、实验内容与步骤…

桥接设计模式

package com.jmj.pattern.bridge;/*** 视频文件(实现化角色)*/ public interface VideoFile {void decode(String fileName); }package com.jmj.pattern.bridge;public class RmvFile implements VideoFile{Overridepublic void decode(String fileName) {System.out.println(&…

米贸搜|如何用Facebook为eBay实现引流?

要利用Facebook为eBay实现引流&#xff0c;可以尝试以下方法&#xff1a; 创建专页或社群&#xff1a;在Facebook上创建一个专页或社群&#xff0c;专注于你在eBay上销售的产品或相关主题。确保专页或社群的名称和描述清楚地表明与eBay有关。 定期发布内容&#xff1a;在Face…