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.mzph.cn/news/228945.shtml

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

相关文章

Ansible-playbook编译.yml脚本

1、playbook是什么&#xff1f; 在Ansible中&#xff0c;Playbook是用于配置、部署和管理被控节点的剧本。它由一个或多个play&#xff08;角色&#xff09;组成&#xff0c;每个play可以包含多个task&#xff08;台词&#xff0c;动作&#xff09;。使用Ansible的Playbook&am…

网络编程-认识套接字socket

文章目录 套接字概念端口号网络字节序 套接字类型流套接字数据报套接字 socket常见APIsocket函数bind函数listen函数accept函数connect函数sockaddr结构 套接字概念 socket套接字是进程之间一种通信机制&#xff0c;通过套接字可以在不同进程之间进行数据交流。在TCP/UDP中&…

如何开发一个prompt?prompt的使用有哪些原则?

提示词使用原则 如何开发一个跟自己预期结果接近的提示词&#xff1f;有哪些基本原则&#xff1f; 提示词迭代开发 写提示词时&#xff0c;第一次尝试是值得的&#xff0c;反复完善提示&#xff0c;获得越来越接近你想要的结果 原文来源于B站吴恩达提示工程教学公开课。…

ActionCLIP:A New Paradigm for Video Action Recognition

文章目录 ActionCLIP: A New Paradigm for Video Action Recognition动机创新点相关工作方法多模态框架新范式预训练提示微调 实验实验细节消融实验关键代码 总结相关参考 ActionCLIP: A New Paradigm for Video Action Recognition 论文&#xff1a;https://arxiv.org/abs/21…

服务端主动给客户端发消息?实战教学:使用Nestjs实现服务端推送SSE

前言 服务端消息推送SSE是常用的服务器消息通信手段&#xff0c;适用于服务器主动给客户端发送消息的场景&#xff0c;例如私信通知&#xff0c;扫描登录等都可以使用SSE实现。SSE的底层原理是客户端与服务端建立 HTTP 长链接。 Nestjs 框架内置了对SSE的支持&#xff0c;本文…

ES6 面试题 | 15.精选 ES6 面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

C++:函数重载

1.函数重载概念 函数重载就是用同一个函数名定义的不同函数&#xff0c;当函数名和不同的参数搭配时函数的功能和含义不同。 2.实现函数重载的条件 同一个作用域&#xff0c;参数个数不同或者参数类型不同或者参数顺序不同(满足一个即可) void func(){} void func(int x){} v…

2024美赛全方位备赛教学/翻译/写作模版/翻译/软件/资料

本文字数20000&#xff0c;文章较长&#xff0c;建议先看目录&#xff0c;点击目录条目可以快速跳转。2024美赛大学生数学建模竞赛即将开始&#xff0c;不知道大家是否已经准备好相关资料如写作模板、常见算法的编程代码等等&#xff1f;评论区处有这些资料的下载方式。 文章结…

计算机网络:数据链路层(广域网、PPP协议、HDLC协议)

今天又学会了一个知识&#xff0c;加油&#xff01; 目录 一、广域网 二、PPP协议 1、PPP协议应满足的要求 2、PPP协议无需满足的要求 3、PPP协议的三个组成部分 4、PPP协议的状态图 5、PPP协议的帧格式 三、HDLC协议 1、HDLC的站&#xff08;主站、从站、复合站&…

计算机网络:网络层(无分类编址CIDR、计算题讲解)

带你快速通关期末 文章目录 前言一、无分类编址CIDR简介二、构成超网三、最长前缀匹配总结 前言 我们在前面知道了分类地址&#xff0c;但是分类地址又有很多缺陷&#xff1a; B类地址很快将分配完毕!路由表中的项目急剧增长! 一、无分类编址CIDR简介 无分类域间路由选择CI…

【后端学前端】第四天 css动画 垂直轮播效果(css变量、位移缩放动画、动画延迟)

1、学习信息 视频地址&#xff1a;css动画 垂直轮播效果&#xff08;css变量、位移缩放动画、动画延迟&#xff09;_哔哩哔哩_bilibili 2、源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title…

深入理解——快速排序

目录 &#x1f4a1;基本思想 &#x1f4a1;基本框架 &#x1f4a1;分割方法 ⭐Hoare版本 ⭐挖坑法 ⭐前后指针法 &#x1f4a1;优化方法 ⭐三数取中法 ⭐小区间内使用插入排序 &#x1f4a1;非递归实现快速排序 &#x1f4a1;性能分析 &#x1f4a1;基本思想 任取待排…

【redis,nosql】redis键值数据库

什么是redis数据库 Redis is an open source, in-memory data structure store used as a database, cache, message broker, and streaming engine. 存储模式 字符串&#xff08;String&#xff09; Redis strings store sequences of bytes, including text, serialize…

力扣刷题-二叉树-二叉树左叶子之和

404 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 思路 迭代法 迭代法理解…

【谭浩强C语言:前八章编程题(多解)】

文章目录 第一章1. 求两个整数之和(p7) 第二章2. 求三个数中的较大值&#xff08;用函数&#xff09;(p14、p107)3.求123...n(求n的阶乘&#xff0c;用for循环与while循环)(P17)1.循环求n的阶乘2.递归求n的阶乘(n< 10) 4.有M个学生&#xff0c;输出成绩在80分以上的学生的学…

外包干了3个月,技术退步明显。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

LangChain学习三:链-实战

文章目录 上一节内容&#xff1a;LangChain学习二&#xff1a;提示-实战&#xff08;下半部分&#xff09;学习目标&#xff1a;明白链是什么&#xff1f;有哪些&#xff1f;怎么用&#xff1f;学习内容一&#xff1a;介绍学习内容二&#xff1a;有那些学习内容三&#xff1a;实…

C++初阶-queue的使用与模拟实现

queue的使用与模拟实现 一、queue的介绍和使用二、queue的使用三、queue的模拟实现3.1 成员变量3.2 成员函数3.2.1 push入队列3.2.2 pop出队列3.2.3 返回队头数据3.2.4 返回队尾数据3.2.5 返回队列的大小3.2.6 判断队列是否为空 四、完整代码4.1 queue.h4.2 test.h 五、deque的…

Linux:TCP 序列号简介

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

vue使用el-tag完成添加标签操作

需求&#xff1a;做一个添加标签的功能&#xff0c;点击添加后输入内容后回车可以添加&#xff0c;并且标签可以删除 1.效果 2.主要代码讲解 鼠标按下后触发handleLabel函数&#xff0c;根据回车的keycode判断用户是不是按下的回车键&#xff0c;回车键键值为13&#xff0c;用…