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 可能会出错

相关文章:
EasyExcel如何读取全部Sheet页数据方法
一、需求描述 Excel表格里面大约有20个sheet页,每个sheet页65535条数据,需要读取全部数据,并导入至数据库。 找了好多种方式,EasyExcel比较符合,下面看代码。 二、实现方式 采用EasyExcel框架的doReadAll()方法 1、…...
GDPU 数据结构 天码行空12
文章目录 数据结构实验十二 图的遍历及应用一、【实验目的】二、【实验内容】三、实验源代码🍻 CPP🍻 C 数据结构实验十二 图的遍历及应用 一、【实验目的】 1、 理解图的存储结构与基本操作; 2、熟悉图的深度度优先遍历和广度优先遍历算法…...
什么是 Proxy?
目录 Proxy 的作用 1. 流量过滤 2. 记录日志 3. 加快访问速度 4. 隐藏 IP 地址 Proxy 的分类 1. 按协议分类 - HTTP 代理:只支持 HTTP 协议的代理服务器,它可以缓存 HTTP 请求和响应并过滤 HTTP 流量。 - FTP 代理:只支持 FTP 协议的…...
Vue系列:Vue Element UI中,使用按钮实现视频的播放、停止、停止后继续播放、播放完成后重新播放功能
最近在工作中有个政务大屏用到了视频播放; 技术栈是Vue2、Element UI; 要实现的功能是:使用按钮实现视频的播放、停止、停止后继续播放、播放完成后重新播放功能 具体可以按照以下步骤进行操作: 引入插件: 在Vue组件…...
.Net 8 Blazor下 Auto交互渲染模式试用
一、环境 C:\Users\zhuji>dotnet --version 8.0.100C:\Users\zhuji>dotnet --list-sdks 5.0.403 [C:\Program Files\dotnet\sdk] 6.0.404 [C:\Program Files\dotnet\sdk] 8.0.100 [C:\Program Files\dotnet\sdk] Microsoft Visual Studio Enterprise 2022 (64 位) - Cu…...
AndroidStudio - 新版本 Logcat 使用详解
最近这俩天正好有时间给自己做一下减法,忘记是去年还是今年,在升级 AndroidStudio 后使用 Logcat查看日志的方式也发生了一些变化,虽然一直在使用,但每当看到之前还未关闭 Logcat 命令行工具额昂也,就感觉可能还存在知…...
Webpack ECMAScript 模块
文章目录 前言标题一导出导入将模块标记为 ESM 后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:webpack 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&a…...
knife4j集合化postman
knife4j集合化postman 01 knife4j的介绍 基于 JavaMVC的集成框架swagger的进一步强化,在原有通过注释就能生成文档的前身swagger-bootstrap-ui之上,增加了postman的测试功能,优化了文档的UI界面,在测试api接口的方面有了极大的进…...
MongoDB的原子性和多文档事务处理
原子性和事务处理是数据库操作的核心,保证了数据的准确性。依据数据库原子性,数据库和使用数据库的人员定义事务处理的方式。本文依据Mongodb的官方文档,整理Mongodb数据库的原子性和事务处理方法。 Mongodb的原子操作 Mongodb中,…...
代理模式 1、静态代理 2、动态代理 jdk自带动态代理 3、Cglib代理
文章目录 代理模式1、静态代理2、动态代理jdk自带动态代理 3、Cglib代理 来和大家聊聊代理模式 代理模式 代理模式:即通过代理对象访问目标对象,实现目标对象的方法。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操…...
ELK+filebeat+kafka
无需创建logstash的端口,直接创建topic 远程收集mysql和httpd的日志 (一)安装nginx和mysql服务 1、打开mysql的日志功能 2、创建日志(创库、创表、添加数据) (1)mysql服务器上安装http system…...
LLVM学习笔记(63)
4.4.3.3.2.3. 向量操作数类型的处理 下面开始处理向量类型。在默认情形下这些操作都会拆分为更小的操作或者调用库。 X86TargetLowering::X86TargetLowering(续) 667 // Some FP actions are always expanded for vector types. 668 for…...
【python+requests】接口自动化测试
这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下。 一、整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类,比如数据库sql…...
plt创建指定色系
1、创建不连续色系 import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap# 定义颜色的RGB值 colors [(0.2, 0.4, 0.6), # 蓝色(0.8, 0.1, 0.3), # 红色(0.5, 0.7, 0.2),(0.3,0.5,0.8)] # 绿色# 创建色系 cmap ListedColormap(colors)# 绘制…...
Java多线程-第20章
Java多线程-第20章 1.创建线程 Java是一种支持多线程编程的编程语言。多线程是指在同一程序中同时执行多个独立任务的能力。在Java中,线程是一种轻量级的子进程,它是程序中的最小执行单元。Java的多线程编程可以通过两种方式实现:继承Threa…...
寿险公司通过开源治理保障数字创新,安全打通高质量服务新通道
某寿险公司致力于为消费者提供人性化的产品和服务,在中国保险市场中始终保持前列。该寿险公司以挖掘和满足客户需求为出发点,从产品开发、渠道销售、运营流程和售后服务等各环节,借助数字化工具,不断地努力探索并提升服务品质。 精…...
SpringBoot中的部分注解
1.SpringBoot/spring SpringBootApplication: 包含Configuration、EnableAutoConfiguration、ComponentScan通常用在主类上; Repository: 用于标注数据访问组件,即DAO组件; Service: 用于标注业务层组件; RestController: 用…...
蓝桥杯-02-蓝桥杯C/C++组考点与14届真题
文章目录 蓝桥杯C/C组考点与14届真题参考资源C/C组考点1. 组别2. 竞赛赛程3. 竞赛形式4. 参赛选手机器环境5. 试题形式5.1. 结果填空题5.2. 编程大题 6. 试题考查范围7. 答案提交8. 评分9. 样题样题 1:矩形切割(结果填空题)样题 2:…...
计算机杂谈系列精讲100篇-【计算机应用】关于TensorFlow和PyTorch的一些看法
目录 前言 知识储备 PyTorch使用高频代码 导入包和版本查询...
Uni-App知识点
文章目录 一、事件总线二、什么是事件总线三、触发事件1、监听事件2、只监听一次3、移除监听4、触发事件注意事项5、代码示例6、注意事项 一、事件总线 除了父子组件传参之外,兄弟组件之间共享信息也是我们经常会遇到的。如果遇到这类问题,我们现在可以…...
不花一分钱!用闲置电脑搭建永久Mac远程控制台(VNC+cpolar固定TCP教程)
零成本打造24小时在线的Mac远程开发环境 你是否有一台闲置的Mac电脑放在角落积灰?或者需要随时随地访问家里的开发环境?将旧Mac改造成全天候在线的远程工作站,不仅能充分利用闲置资源,还能为移动办公提供极大便利。本文将手把手教…...
告别变砖!手把手教你为HC32F460打造带断电保护的BootLoader(附完整代码)
工业级HC32F460 BootLoader设计实战:从防变砖到量产级解决方案 当你的嵌入式设备因为固件升级中断而变成"砖头",那种绝望感每个开发者都懂。今天我们要解决的,正是这个让无数工程师夜不能寐的痛点——如何为HC32F460设计一个真正工…...
储能系统海量时序数据边缘侧清洗:基于微服务架构的死区过滤与数据语境化实现
摘要: 针对新能源储能现场底层总线高频轮询(如 50ms 采集间隔)所引发的海量数据洪流,传统的数据全量透传模型不仅会迅速耗尽 4G/5G 流量配额,更会造成云端时序数据库的写入雪崩。本文深度分享一种在具有充沛边缘算力且…...
用QT5的QTcpSocket做一个TCP调试助手:连接单片机/服务器测试数据收发
用QT5打造专业级TCP调试助手:从基础通信到工业级工具开发 在嵌入式开发和物联网项目中,TCP通信调试是每个工程师都会遇到的常规需求。无论是与STM32单片机通信,还是测试PLC设备的网络功能,亦或是验证云服务器的数据接口࿰…...
颠覆黑苹果配置传统:革新式极简EFI生成方案,突破技术壁垒
颠覆黑苹果配置传统:革新式极简EFI生成方案,突破技术壁垒 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否也曾被黑苹果配…...
告别云服务器开销:手把手教你用Docker Compose在本地Linux虚拟机部署Dify
告别云服务器开销:手把手教你用Docker Compose在本地Linux虚拟机部署Dify 在云计算成本不断攀升的今天,越来越多的独立开发者和小团队开始寻求更经济高效的解决方案。对于数据敏感型项目或内部测试环境而言,本地化部署不仅能显著降低长期运营…...
Kandinsky-5.0-I2V-Lite-5s企业级部署案例:客服知识库配图→动态教学短视频生成
Kandinsky-5.0-I2V-Lite-5s企业级部署案例:客服知识库配图→动态教学短视频生成 1. 项目背景与需求分析 在客服培训领域,传统的知识库配图往往是静态图片,难以直观展示操作流程和动态场景。某大型电商平台客服团队面临以下痛点:…...
Alberta Wells数据集:从213,000个井位到全球环境监测,计算机视觉如何重塑油气设施追踪
1. 油气井监测的全球挑战与环境意义 想象一下,你正站在加拿大阿尔伯塔省广袤的草原上,脚下可能就隐藏着数十个被遗忘的油气井。这些钢铁结构的"时间胶囊"有的已经沉寂数十年,却仍在持续释放比二氧化碳强效84倍的甲烷气体。这就是全…...
YOLO26改进策略【卷积层】| arXiv 2025 加权卷积Weighted Conv 密度函数提表征 + 零参扩展降负担,提升目标检测精度
一、本文介绍 本文记录的是利用加权卷积改进 YOLO26 的卷积层特征提取部分。 Weighted Convolution(加权卷积)通过空间密度函数与标准卷积核加权结合,实现YOLO26特征提取中像素位置依赖的差异化权重分配。本文利用Weighted Convolution算子,通过对称衰减的密度函数强化中…...
【多智能体框架实战】JoyAgent-JDGenie:从零构建定制化AI工作流
1. JoyAgent-JDGenie框架初探:你的AI工作流搭建利器 第一次接触JoyAgent-JDGenie时,我正为一个电商客户发愁——他们需要一套能自动处理退换货咨询的AI系统。传统方案要么开发周期太长,要么灵活性不足。直到发现这个开源框架,只用…...
