EasyExcel实现⭐️本地excel数据解析并保存到数据库的脚本编写,附案例实现

目录

前言

一、 EasyExcel 简介 

二、实战分析

1.Controller控制层

2. service方法和方法实现

3.EasyExcel相关类

        3.1 excel表实体类

        3.2 自定义监听器类

4.测试

        4.1 准备工作

        4.2 断点调试

5.生成脚本文件

 三、分析总结

章末


        小伙伴们大家好,最近开发的时候遇到了大量数据处理问题,今天来分析是如何通过EasyExcel工具实现批量数据导入解放双手的

前言

        项目系统中需要新增一个“繁体中文”初始化翻译功能(系统初始化有中英两个语种),拿到产品给的翻译好的数据后,简单看了下共1800多条数据,需要做的就是将这些数据按照sql插入语句的格式编写好,跑一下脚本即可(类似insert into table value (...);),但是这么多数据一条一条手写指定是要写废了的

        天无绝人之路,前几天在地铁上闲来无事翻到的excel数据读取工具这不就来活了嘛,先将表格数据读取解析,然后通过代码插入到数据库中,再用数据库的导出工具生成插入语句,岂不美哉,

        说干就干,IDEA 启动

一、 EasyExcel 简介 

        EasyExcel 是一款基于 Java 的开源 Excel 处理工具,它提供了简单且高效的方式来读取、写入和操作 Excel 文件。EasyExcel 是阿里巴巴集团开发并维护的项目,旨在解决大数据量 Excel 文件处理的难题。

以下是 EasyExcel 工具的一些特点和功能:

  1. 读取和写入 Excel 文件:EasyExcel 提供了简单易用的 API,可以方便地读取和写入 Excel 文件,支持常见的 Excel 格式,如 .xls 和 .xlsx。

  2. 高性能处理:EasyExcel 使用内存友好的方式处理 Excel 文件,能够快速处理大量的数据,具备较高的性能。

  3. 简化的数据模型:EasyExcel 采用简化的数据模型,使得读取和写入 Excel 数据更加灵活和方便。您可以将 Excel 文件的数据映射到 Java 对象或者直接处理 Excel 单元格数据。

  4. 复杂数据操作:EasyExcel 提供了丰富的 API,支持合并单元格、填充样式、设置数据校验等复杂的 Excel 操作。

  5. 监听器机制:EasyExcel 提供了监听器机制,您可以注册监听器来处理读取和写入 Excel 文件过程中的事件,如读取完成、写入成功等。

  6. 配置灵活:EasyExcel 支持自定义配置,您可以通过配置参数来定制读取和写入 Excel 文件的行为,如是否跳过空行、是否自动关闭流等。

二、实战分析

1.Controller控制层

        比较简单,接收一个文件参数,调用业务方法

    /*** 导入繁体中文**/@ApiOperation(value = "繁体中文落库")@PostMapping(value = "/importTrad")@HLogpublic void importTraditionInfo(@RequestParam MultipartFile file) {translateService.importTraditionalDataStringInfo(file);}
2. service方法和方法实现

        也比较简单,先判断是不是读取到了文件,然后调用EasyExcel的read方法

    /*** 导入翻译项数据** @param file //忽略*/void importTraditionalDataStringInfo(MultipartFile file);
@Overridepublic void importTraditionalDataStringInfo(MultipartFile file) {if (file.isEmpty() || StringUtils.isBlank(file.getOriginalFilename())) {throw new MyException("文件不能为空!");}try {//ImportTraditionalChineseItemDto 与excel表相对应的实体类//TraditoonalItemListener 自定义监听器,处理逻辑在这里便补充EasyExcel.read(file.getInputStream(), ImportTraditionalChineseItemDto.class, new TraditoonalItemListener()).sheet(0).doRead();} catch (IOException ex) {log.error("解析LocalDataStringExcel失败!");}}
3.EasyExcel相关类
        3.1 excel表实体类
@Data
public class ImportTraditionalChineseItemDto {@ExcelProperty(index = 0)@ApiModelProperty(value = "localizedId")private String localizedId;@ExcelProperty(index = 1)@ApiModelProperty(value = "stringId")private String  stringId;@ExcelProperty(index = 2)private String dataStringZh;@ExcelProperty(index = 3)@ApiModelProperty(value = "stringLanguage")private String stringLanguage;@ExcelProperty(index = 4)private String dataStringZhtw;}

        3.2 自定义监听器类
@Component
@Slf4j
public class TraditoonalItemListener extends AnalysisEventListener<ImportTraditionalChineseItemDto> {//新建一个集合,用于存储解析的数据public List<ImportTraditionalChineseItemDto> translateItemLists = new ArrayList<>();//该方法会在doAfterAllAnalysed方法之前执行,将数据添加到集合中@Overridepublic void invoke(ImportTraditionalChineseItemDto importTraditionalChineseItemDto, AnalysisContext analysisContext) {translateItemLists.add(importTraditionalChineseItemDto);}//收集好的数据具体如何处理逻辑@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {//AnalysisEventListener 不是被spring管理注入mapper,需要手动添加LocalizedDatastringMapper localizedDatastringMapper = SpringContextUtil.getBean("localizedDatastringMapper", LocalizedDatastringMapper.class);System.out.println("解析的数据" + translateItemLists);//筛选localizedId为空的,应该没有为空的List<ImportTraditionalChineseItemDto> translateItems = translateItemLists.stream().filter(x -> x.getLocalizedId() != null).collect(Collectors.toList());if (CollectionUtils.isNotEmpty(translateItems)) {for (ImportTraditionalChineseItemDto item : translateItems) {//翻译项表的实体类,用于操作数据库表LocalizedDatastring dataStringZhtw = new LocalizedDatastring();Long stringId = Long.parseLong(item.getStringId().replace(",", ""));dataStringZhtw.setLocalizedId(IdWorker.getId());dataStringZhtw.setStringId(stringId);dataStringZhtw.setStringLanguage("zhtw");dataStringZhtw.setDataString(item.getDataStringZhtw());dataStringZhtw.setIsActive(1);dataStringZhtw.setIsDelete(0);dataStringZhtw.setCreatedDate(new Date());localizedDatastringMapper.insert(dataStringZhtw);}}//清空translateItemLists.clear();}
}
4.测试
        4.1 准备工作

        打开apipost工具,输入请求地址,配置好文件属性,请求头的属性需要配置为这个,请求体这样配,选中需要导入的excel表格

        4.2 断点调试

        收集到的list集合大小为1842,与表格中的对比一下,去掉第一行的列名,正好1842对的上,继续往下执行,等待执行完成,看数据库表中的数据,也是对的上的

5.生成脚本文件

        右键》》生成sql》》insert》》复制即可

 三、分析总结

       除了以上这些,还有一些细节关于EasyExcel的,比如

1.这里的参数设置为0,表示从文件中的第一个表格读取,下表是从0开始的

2.也可以使用字符,使用字符则直接指定某一个表格的名称即可

3.包括实体类中的index指定下标,也可以通过赋值具体的列名实现

章末

        文章到这里就结束了 


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

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

相关文章

JavaSE第7篇:封装

文章目录 一、封装1、好处:2、使用 二、四种权限修饰符三、构造器1、作用2、说明3、属性赋值的过程 一、封装 封装就是将类的属性私有化,提供公有的方法访问私有属性 不对外暴露打的私有的方法 单例模式 1、好处: 1.只能通过规定的方法来访问数据 2.隐藏类的实例细节,方便…

【JavaEE】多线程案例 - 定时器

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

深度学习项目实战:垃圾分类系统

简介&#xff1a; 今天开启深度学习另一板块。就是计算机视觉方向&#xff0c;这里主要讨论图像分类任务–垃圾分类系统。其实这个项目早在19年的时候&#xff0c;我就写好了一个版本了。之前使用的是python搭建深度学习网络&#xff0c;然后前后端交互的采用的是java spring …

python学习2

大家好&#xff0c;这里是七七&#xff0c;这次学习的例子是一个数据清洗代码。完整代码在最后。 开始这次的内容 目录 代码一 代码二 代码三 代码四 全部代码 代码一 xlsx_file data/附件1.xlsx df_1 pd.read_excel(xlsx_file) xlsx_file data/附件2.xlsx df pd.re…

workflow系列教程(4)Parallel并联任务流

往期教程 如果觉得写的可以,请给一个点赞关注支持一下 观看之前请先看,往期的博客教程,否则这篇博客没办法看懂 workFlow c异步网络库编译教程与简介 C异步网络库workflow入门教程(1)HTTP任务 C异步网络库workflow系列教程(2)redis任务 workflow系列教程(3)Series串联任务流…

一个 tomcat 下如何部署多个项目?附详细步骤

一个tomcat下如何部署多个项目&#xff1f;Linux跟windows系统下的步骤都差不多&#xff0c;以下linux系统下部署为例。windows系统下部署同理。 1 不修改端口&#xff0c;部署多个项目 清楚tomcat目录结构的应该都知道&#xff0c;项目包是放在webapps目录下的&#xff0c;那…

【SpringBoot零基础入门到项目实战①】解锁现代Java开发之门:深度探究Spring Boot的背景、目标及选择理由

文章目录 引言Spring Boot的背景和目标背景目标 为什么选择Spring Boot1. 简化配置2. 内嵌式容器3. 生态系统支持4. 大量的Starter5. 广泛的社区支持6. 适用于微服务架构7. 丰富的扩展机制 实例演示创建一个简单的Spring Boot应用 拓展与深入学习1. Spring Boot Actuator2. Spr…

MySQL数据库,表的增量备份与恢复

1. 从物理与逻辑的角度 数据库备份可以分为物理备份和逻辑备份。物理备份是对数据库操作系统的物理文件&#xff08;如数据 文件&#xff0c;日志文件等&#xff09;的备份。这种类型的备份适用于在出现问题时需要快速恢复的大型重要数据库。 物理备份又可以分为冷备份&#xf…

MySQL进阶|MySQL中的事务(一)

文章目录 数据库事务MySQL中的存储引擎InnoDB存储引擎架构什么是事务事务的状态总结 数据库事务 MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比方我想要删除一个用户&#xff08;销户&#xff09;以及这个用户的个人信息、订单信息以及其他信息&#xff0c;这…

遗传算法应用-- 栅格法机器人路径规划

文章目录 一、遗传算法1.1 编码与解码1.2 选择算子-轮盘赌法1.3 交叉算子1.4 变异算子1.5 遗传算法流程1.6 基于遗传算法的栅格法机器人路径规划 二、采用模拟退火算法改善适应度函数 一、遗传算法 遗传算法 (Genetic AIgorithm, 简称 GA)起源于对生物系统所进行的计算机模拟研…

王道考研--》单链表课后习题C语言代码实现(冲刺)

考研是许多计算机科学专业学生追求高学历、寻求更好就业前景的途径。在考研过程中&#xff0c;数据结构是一个非常重要的科目&#xff0c;而代码实现题更是其中的难点之一。在这篇文章中&#xff0c;我们将探讨如何通过实现数据结构代码问题来提升考研成绩。无论您是否有编程经…

Linux:TCP 序列号简介

文章目录 1. 前言2. 什么是 TCP 序列号&#xff1f;3. TCP 序号 的 初始值设置 和 后续变化过程3.1 三次握手 连接建立 期间 客户端 和 服务端 序号 的 变化过程3.1.1 客户端 socket 初始序号 的 建立3.1.2 服务端 socket 初始序号 的 建立3.1.3 客户端 socket 接收 服务端 SAC…