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

news2024/9/29 1:21:28

目录

前言

一、 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")
    @HLog
    public void importTraditionInfo(@RequestParam MultipartFile file) {
        translateService.importTraditionalDataStringInfo(file);
    }
2. service方法和方法实现

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

    /**
     * 导入翻译项数据
     *
     * @param file //忽略
     */
    void importTraditionalDataStringInfo(MultipartFile file);
@Override
    public 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方法之前执行,将数据添加到集合中
    @Override
    public void invoke(ImportTraditionalChineseItemDto importTraditionalChineseItemDto, AnalysisContext analysisContext) {
        translateItemLists.add(importTraditionalChineseItemDto);
    }

    //收集好的数据具体如何处理逻辑
    @Override
    public 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.coloradmin.cn/o/1309614.html

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

相关文章

spring 笔记三 Spring与Web环境集成

文章目录 Spring与Web环境集成ApplicationContext应用上下文获取方式导入Spring集成web的坐标置ContextLoaderListener监听器通过工具获得应用上下文对象SpringMVC概述SpringMVC快速入门 Spring与Web环境集成 ApplicationContext应用上下文获取方式 应用上下文对象是通过new …

QT-CAD-3D显示操作工具

QT-CAD-3D显示操作工具 一、效果展示二、核心程序三、程序链接 一、效果展示 二、核心程序 TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) {TDF_LabelSequence seqLabel;Handle_XCAFDoc_ShapeTool shapeTool doc->xcaf().shapeTool();…

ProcessOn在线绘制部分项目流程图

目录 一、ProcessOn 1.1 简介 1.2 官方网站 二、Axure自定义元件库 2.1 新建元件库 2.2 自定义元件 2.3 添加元件库 三、HIS系统门诊流程图 四、HIS系统住院流程图 五、HIS系统药品采购入库流程图 六、OA会议流程图 一、ProcessOn 1.1 简介 ProcessOn是一款在线的流…

快递鸟「物流导盲犬」助力鞋服头部企业客户全链路物流数字化升级

数字化时代&#xff0c;企业全域经营已成为数字商业新浪潮&#xff0c;多店铺多平台多仓库同步发货成为经营常态&#xff0c;消费者对物流服务体验的要求越来越高&#xff0c;企业对物流精细化管理的需求也越来越强烈。快递鸟基于对物流数字化领域的深耕和对行业及客户需求的深…

域名备案通过啦

整体来看还算比较顺利&#xff1a;遇到的问题&#xff1a; 1.香港服务器没有免费的备案码&#xff0c;就单独购买一个备案码用于备案。 2.备案的时候小程序审核优先通过&#xff0c;导致阿里云备案域名不能使用初次备案&#xff0c;不能通过初审&#xff0c;就放弃重新申请备…

css画饼图

<template slot-scope"scope"> <div class"pie" :style"{--p: scope.row.rate}" style"--p:10;--b:10px;--c:#FFAB79;"> <!-- --p&#xff1a;这个变量应该包含百分比值作为一个数字&#xff08;不带%符号&#xff09;…

智能防雷监测系统+智能SPD在线监测系统解决方案

雷电是一种自然现象&#xff0c;也是一种灾害。雷电对人类的生命财产安全造成巨大的威胁&#xff0c;尤其是对于电子设备、通信网络、电力系统等敏感设备&#xff0c;雷电浪涌会导致设备损坏、数据丢失、系统故障等严重后果。因此&#xff0c;防雷措施是必不可少的。 传统的防雷…

Narak

靶场下载 https://download.vulnhub.com/ha/narak.ova 信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-09 22:18 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.…

class080 状压dp-上【算法】

class080 状压dp-上【算法】 算法讲解080【必备】状压dp-上 Code1 464. 我能赢吗 // 我能赢吗 // 给定两个整数n和m // 两个玩家可以轮流从公共整数池中抽取从1到n的整数&#xff08;不放回&#xff09; // 抽取的整数会累加起来&#xff08;两个玩家都算&#xff09; // 谁在…

【Python】人工智能-机器学习——不调库手撕深度网络分类问题

1. 作业内容描述 1.1 背景 数据集大小150该数据有4个属性&#xff0c;分别如下 Sepal.Length&#xff1a;花萼长度(cm)Sepal.Width&#xff1a;花萼宽度单位(cm)Petal.Length&#xff1a;花瓣长度(cm)Petal.Width&#xff1a;花瓣宽度(cm)category&#xff1a;类别&#xff0…

flutter调试器查看不了副页面(非主页面/子页面)

刚接触flutter&#xff0c;写了两个页面&#xff0c;通过按钮&#xff0c;可以从主页面跳转到副页面&#xff0c;副页面我自己写的一个独立的dart文件&#xff0c;在主页面的代码中导入使用。但是当我运行代码后&#xff0c;点击跳转的时候&#xff0c;却发现查看不到对应的副页…

用CHAT了解生活中的化学

问CHAT&#xff1a;生活中有哪些常见的氢氧化合物&#xff1f; CHAT回复&#xff1a;生活中常见的氢氧化合物有以下几种&#xff1a; 1. 氢氧化钠(NaOH)&#xff1a;也叫苛性钠&#xff0c;是一种强碱性物质&#xff0c;主要用于造纸、肥皂制作、人造纤维和棉纺等工业中。 2.…

php实现截取姓名中的第一个字作为头像的实战记录

php 截取中文字符串第一个字 substr 函数 在 PHP 中&#xff0c;使用 substr 函数来截取中文字符串的第一个字。由于 PHP 默认的字符编码是 UTF-8&#xff0c;它可以正确处理中文字符。 $chineseString "你好世界"; $firstChar substr($chineseString, 0, 1); e…

TCP对数据的拆分

应用程序的数据一般都比较大&#xff0c;因此TCP会按照网络包的大小对数据进行拆分。 当发送缓冲区中的数据超过MSS的长度&#xff0c;数据会被以MSS长度为单位进行拆分&#xff0c;拆分出来的数据块被放进单独的网路包中。 根据发送缓冲区中的数据拆分情况&#xff0c;当判断…

ERP主要是干什么的

在信息技术快速发展的背景下&#xff0c;很多企业为了应对这些技术带来的机遇和挑战&#xff0c;也为了提高企业的竞争力和效率&#xff0c;提高企业管理水平&#xff0c;选择使用ERP系统来帮助企业进一步的发展。但是也有部分企业没明白ERP到底是干什么的&#xff0c;所以有些…

数据结构:图的存储和遍历

文章目录 图的存储结构邻接矩阵邻接矩阵的存储模拟实现 邻接表邻接表的模拟实现 图的遍历DFS和BFS遍历 图的存储结构和遍历的实现 图也是一种数据结构&#xff0c;在实际生活中有广泛运用&#xff0c;因此本篇总结的就是图的存储等 图的存储结构 在图中既有节点&#xff0c;也…

【docker 】Dockerfile指令学习

学习文档地址 上篇文章&#xff1a;【docker 】基于Dockerfile创建镜像 Dockerfile指令文档地址 .dockerignore 文件 Dockerfile指令 常见的指令 Dockerfile 指令说明FROM指定基础镜像&#xff0c;用于后续的指令构建。MAINTAINER指定Dockerfile的作者/维护者。&#xff…

代码审计零基础入门之思路篇

0x01 前言 ThinkPHP 是一款开源的 PHP 框架&#xff0c;用于快速、简单地开发 PHP 应用程序。它提供了一套丰富的功能和工具&#xff0c;使开发者能够更容易地构建各种规模的 Web 应用。ThinkPHP 的目标是提高开发效率&#xff0c;同时保持代码的可读性和可维护性。thinkphp的…

mysql:在字符串类型的列上创建索引,建议指定索引前缀长度

https://dev.mysql.com/doc/refman/8.2/en/create-index.html#create-index-column-prefixes 在字符串类型的列上创建索引&#xff0c;建议指定索引前缀长度&#xff0c;而没有必要用整个列来创建索引。因为用前面的字符创建索引&#xff0c;查询时并不会比在整列上创建索引慢很…

绿盟 SAS堡垒机 local_user.php 权限绕过漏洞复现

0x01 产品简介 SAS 安全审计系统是绿盟科技开发的一款堡垒机。 0x02 漏洞概述 绿盟 SAS堡垒机 local_user.php接口处存在权限绕过漏洞,未经身份认证的攻击者可以访问他们通常无权访问的敏感资源,最终导致系统处于极度不安全状态。 0x03 复现环境 FOFA: body="/ne…