(一)EasyExcel的使用(读取数据到实体类即绑定实体类)

news2025/8/16 16:57:47

        最近遇到了一个excel简单的导入导出的需求,因此就对easyexcel第三方插件的使用做一点总结,大家可以看一看,可能会对你有点帮助。

目录

前言:

1、引入easyexcel相关依赖

2、创建对应excel的实体类

3、导入excel,并保存到数据库表中

4、导入excel的服务操作

5、得到结果,保存数据到数据库

6、读取数据库数据写入excel

7、总结


前言:

        项目是一个springboot 项目,使用maven对依赖进行管理,需求有两个是:

        ①导入的excel有模板,即表头是明确的(简单)

        ②导入的excel没有模板,即表头是不明确的

        此篇博客主要讲述easyexcel对于需求①的开发,关于需求②会在下一篇博客中进行讲解,地址(二)easyexcel 的使用(读取数据到map集合中)_网恋褙骗八万的博客-CSDN博客

1、引入easyexcel相关依赖

<!--   easyexcel     -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.1</version>
        </dependency>

2、创建对应excel的实体类

        excel模板如下:

         对应的实体类:(注解 @ExcelProperty是easyexcel自带的注解,可以通过value绑定值即绑定到表头的方式,让每个属性对应到表头,当然也可以使用index进行索引的绑定。)

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;

/**
 * @Author 不要有情绪的  ljy
 * @Date 2022/11/4 19:01
 * @Description:
 */
@Data
@ToString
public class FaultInfoData {

    @ExcelProperty(value = "产品专业")
    private String productSpeacialty;

    @ExcelProperty(value = "产品类别")
    private String productCategory;

    @ExcelProperty(value = "产品规格")
    private String productSpecification;

    @ExcelProperty(value = "故障时间")
    private String faultTimeString;

    @ExcelProperty(value = "故障型号")
    private String faultModel;

    @ExcelProperty(value = "故障原因")
    private String faultReason;

    @ExcelProperty(value = "解决方案")
    private String faultSolution;

}

3、导入excel,并保存到数据库表中


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.bjsasc.productksys.exceptionHandler.SelfDefinitionException;
import com.bjsasc.productksys.faultinfoservice.entity.FaultInfo;
import com.bjsasc.productksys.faultinfoservice.entity.excel.FaultInfoData;
import com.bjsasc.productksys.faultinfoservice.service.FaultInfoService;
import com.bjsasc.productksys.utils.StringToDateUtil;
import org.springframework.beans.BeanUtils;


import java.util.Date;
import java.util.Map;

/**
 * @Author 不要有情绪的  ljy
 * @Date 2022/11/4 19:20
 * @Description:
 */
public class FaultExcelListener extends AnalysisEventListener<FaultInfoData> {

    private FaultInfoService faultInfoService;
    private int treeNodeId;

    public FaultExcelListener(FaultInfoService faultInfoService) {
        this.faultInfoService = faultInfoService;
    }

    public FaultExcelListener() {
    }

    public FaultExcelListener(FaultInfoService faultInfoService, int treeNodeId) {
        this.faultInfoService = faultInfoService;
        this.treeNodeId = treeNodeId;
    }

    //一行一行读取,然后使用new FaultInfo,把faultInfoData 使用copy的一个工具类复制过去,然后使用service直接save函数进行保存到数据库
    @Override
    public void invoke(FaultInfoData faultInfoData, AnalysisContext analysisContext) {
        //表示excel中没有数据,就不需要读取了
        if (faultInfoData == null) {
            throw new SelfDefinitionException(20001, "故障信息导入失败!");
        }
//        System.out.println(faultInfoData);
        //用于临时的一个对象,保存到数据库中的实例
        FaultInfo faultInfo = new FaultInfo();
        //使用工具类将FaultInfoData类拷贝给FaultInfo类
        BeanUtils.copyProperties(faultInfoData, faultInfo);  //这儿是将faultInfoData拷贝到faultInfo
        //设置树的节点,此时的树节点应该为前端传递过来的树节点id
        faultInfo.setSysTreeId(treeNodeId);
        faultInfoService.save(faultInfo);
    }

    //读取excel表头信息
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext
            context) {
        System.out.println("表头信息:" + headMap);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("表格读取完成!");
    }

}

对以上代码进行解读,其中

  1. invoke()函数是进行一行行读取excel数据的函数,并且每行数据会被保存到 FaultInfoData 类中,然后将FaultInfoData转化成数据库对应的实体类 FaultInfo ,使用mybatis进行保存数据。  
  2. invokeHeadMap()函数能够打印输出表头
  3. doAfterAllAnalysed()函数是表格读取后进行的操作
  4.  FaultInfoService是进行服务操作的,由于没有在spring容器中进行注册,所以要通过传递参数的形式传递过来。

4、导入excel的服务操作

 @Override
    public void saveFaultInfos(MultipartFile file, FaultInfoService faultInfoService, int treeNodeId) {
        try {
            //文件输入流
            InputStream is = file.getInputStream();
            //调用方法进行读取
            EasyExcel.read(is, FaultInfoData.class, new FaultExcelListener(faultInfoService, treeNodeId)).sheet().doRead();
        } catch (Exception e) {
            e.printStackTrace();
            throw new SelfDefinitionException(20001, "导入故障信息excel失败,添加失败");
        }
    }

5、得到结果,保存数据到数据库

        访问controller的链接地址,进行服务调用,将数据保存到数据库,数据库表结果如下图:

以上是读取excel保存到数据库的操作

6、读取数据库数据写入excel

 @ApiOperation(value = "选择一个路径,将当前的列表导出到excel")
    @GetMapping("/xxxxx/{treeNodeId}")
    public R xxxxx(@ApiParam(name = "treeNodeId", value = "当前树节点id", required = true) @PathVariable Integer treeNodeId) {
        SysTree treeNode = sysTreeService.getById(treeNodeId);
        String treeNodeName = treeNode.getNodeName();
        String fileName = treeNodeName + "_故障信息.xlsx";
        List<FaultInfo> list = faultInfoService.list(new QueryWrapper<FaultInfo>().eq("sys_tree_id", treeNodeId));

        //将FaultInfo类型转化成FaultInfoData类型
        List<FaultInfoData> faultInfoDataList = list.stream().map(info -> {
            FaultInfoData faultInfoData = new FaultInfoData();
            BeanUtils.copyProperties(info, faultInfoData);
            return faultInfoData;
        }).collect(Collectors.toList());

        EasyExcel.write(fileName, FaultInfoData.class).sheet(treeNodeName).doWrite(faultInfoDataList);
        return R.ok();
    }

7、总结

        以上就是使用第三方插件easyexcel读取excel,写入excel的过程,本来想的挺清晰的,结果写着写着就有点乱了,不知道你们能不能看懂,通过绑定实体类的方式读取写入操作是比较简单的,仔细看看应该能够读懂,嘻嘻嘻!

学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
                                                                                                         ------不写代码不会凸的小刘

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

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

相关文章

mac照片肖像美容ON1 Portrait AI 2023

人像照片怎么美容编辑呢&#xff1f;使用 ON1 Portrait AI 2023只需点击一下即可完美修饰。它使用机器学习来查找照片中的每一张脸&#xff0c;并自动使它们看起来很棒。它分析每张脸&#xff0c;并为皮肤、眼睛和嘴巴添加适量的修饰&#xff0c;立即为您提供专业的效果。 软件…

目标检测算法——工业缺陷数据集汇总1(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f680;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批自动驾驶开源数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&#x1f91e…

计算机毕业设计:基于html制作大学生网上报到系统响应式模板项目源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

UNet - 预测数据predict(多个图像的分割)

目录 1. 介绍 2. predict 预测分割图片 3. 结果展示 4. 完整代码 1. 介绍 之前已经将unet的网络模块、dataset数据加载和train训练数据已经解决了&#xff0c;这次要将unet网络去分割图像&#xff0c;下面是之前的链接 unet 网络&#xff1a;UNet - unet网络 dataset 数…

chineseocr测试具体部署步骤(不用web界面)

源项目地址&#xff1a; https://github.com/chineseocr/chineseocr 由于chineseocr需要在web上展示检测结果&#xff0c;还需要安装web相关内容&#xff0c;我的硬件是nvidia agx orin只需要在本地查看检测结果&#xff0c;做如下操作 找到源码项目中的test.ipynb,改写成test.…

天津教育杂志天津教育杂志社天津教育编辑部2022年第30期目录

卷首语 构建精准资助模式 保障经济困难学生安心求学 本刊编辑部; 1 本刊视线_关注 中学生行为习惯养成教育的策略——基于福州第十五中学学生行为习惯养成教育的实践 贺玉亮;林瑶; 4-6 本刊视线_特殊教育《天津教育》投稿&#xff1a;cn7kantougao163.com 面向听障…

最高薪15k!“转行软件测试后,我想要的生活,就应该是这样!”

​最近的低温天气 切切实实让汇智妹感受到了冬天 上下班路上骑个自行车都冻手手 &#xff08;成都的“湿冷魔法伤害”真不是吹的&#xff09; 好不容易等来了周末 只想待在家里哪儿都不去 裹着毛毯安逸地休息两天 周一再继续撸起袖子加油干 ​ ​“公司通知周末要加班”…

jenkins 中pipeline相关语法学习

jenkins基础 Jenkins介绍 持续集成&#xff0c;就是通常所说的CI&#xff08;Continues Integration&#xff09;&#xff0c;可以说是现代软件技术开发的基础。 持续集成是一种软件开发实践&#xff0c;即团队开发成员经常集成他们的工作&#xff0c;通常每个成员至少集成一…

Docker踩坑,又涨知识了

背景 新上线一个批处理功能&#xff0c;基于Docker发布的。上线之后出现一个问题&#xff0c;Docker批处理生成的文件目录&#xff0c;别的应用程序无法访问。 之前也在使用Docker&#xff0c;但并未涉及到文件共享的问题&#xff0c;还真没留意到。经过一系列排查&#xff0…

第二章 模型评估与选择(上)

2.1 经验误差与过拟合 通常我们把分类错误的样本数占样本总数的比例为”错误率”&#xff0c;精度1-错误率。模型的实际预测输出与样本的真实输出之间的差异称为“误差”&#xff0c;模型在训练集上的误差称为“训练误差”或“经验误差”,在新样本上的误差称为“泛化误差” 当…

uni-app框架

目录 什么是uniapp 为什么学uniapp uni-app目录结构 uniapp开发规范 pages.json页面的基本配置 pages页面配置 pages对象的属性 globalStyle全局配置 配置基本tabbar tabbar的基本属性 condition启动模式配置 具体属性 组件的基本使用 text文本组件 view组件 …

【历史上的今天】11 月 18 日:DNS 发明者出生;按键式电话问世;比尔·盖茨开始编程

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2022 年 11 月 18 日&#xff0c;在 1928 年&#xff0c;华特迪士尼&#xff08;Walt Disney&#xff09;和他终身的助手阿维尔克合作创造了后来闻名世界的“米老鼠”的…

MySQL (8)

MySQL (8) 前言 &#xff1a; 知识点回顾 &#xff1a; 上文我们已经了解到了我们的事务 , 知道了事务是将诺干个独立的操作打包成一个整体 &#xff0c; 如 1 1 此时想将这个结果写到纸上 &#xff0c;那么 1 1 计算 可以看做一个操作&#xff0c; 将答案 2 写 到纸上 也是…

酪氨酸激酶、自噬等抗肿瘤抑制剂

TPCA-1 TPCA-1 是一种有效&#xff0c;选择性的 IKK-2 抑制剂&#xff0c;IC50 值为 17.9 nM。TPCA-1 也是 STAT3 磷酸化、DNA 结合以及反式激活的有效抑制剂。 表皮生长因子受体 (EGFR) 是治疗 EGFR 突变型非小细胞肺癌 (NSCLC) 的有效靶点。然而&#xff0c;一些 EGFR 突变表…

独家,阿里技术人限产的MySQL高级笔记及面试宝典,简直开挂

又逢“金九银十”&#xff0c;年轻的毕业生们满怀希望与忐忑&#xff0c;去寻找、竞争一个工作机会。已经在职的开发同学&#xff0c;也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而&#xff0c;面试人群众多&#xff0c;技术市场却相对冷淡&#xff0c;…

【Linux】深刻理解进程概念、进程状态、进程常用指令和系统调用

文章目录1、什么是进程?1.1 PCB的概念1.2 程序加载到内存2、初识进程2.1 进程相关的指令2.2 进程相关的系统调用3、进程状态3.1 运行、阻塞和挂起状态3.2 具体的Linux进程状态3.3 僵尸进程3.4 孤儿进程1、什么是进程? 从程序说起&#xff0c;我们写好的程序在经过编译链接最…

【cmake】cmake应用:安装和打包

【cmake】cmake应用&#xff1a;安装和打包 在本系列前序的文章中已经介绍了CMake很多内容&#xff0c;在CMake应用&#xff1a;CMakeLists.txt完全指南一文中简略介绍了安装和打包&#xff0c;本文会更加深入地介绍CMake的安装和打包功能。【cmake】cmake应用&#xff1a;安装…

分享500道我在“金九银十”收集的Java架构面试题

前段时间&#xff0c;字节跳动官方就发布消息称在武汉扩招至5000人&#xff0c;放出了2000个岗位名额。可见&#xff0c;互联网大厂岗位需求仍然奇缺。 在已经过去的“金九银十”&#xff0c;我有许多朋友就已经成功的跳槽&#xff0c;有的还在家等候下一步的面试通知。我托朋…

【计算机扫盲】计算机的基础操作你知多少?

计算机的高级操作 控制面板 ​ 控制面板&#xff08;control panel&#xff09;是Windows图形用户界面的一部分&#xff0c;可通过开始菜单访问。它允许用户查看并操作基本的系统设置&#xff0c;比如添加/删除软件&#xff0c;控制用户帐户&#xff0c;更改辅助功能选项。 …

CAS号:60535-02-6,二肽Met-Trp

血管紧张素-1转换酶(ACE)非竞争性抑制剂IC₅₀9.8 μM。 编号: 154290中文名称: 二肽Met-Trp英文名: Met-TrpCAS号: 60535-02-6单字母: H2N-MW-OH三字母: H2N-Met-Trp-COOH氨基酸个数: 2分子式: C16H21N3O3S1平均分子量: 335.42精确分子量: 335.13等电点(PI): 6.11pH7.0时的净电…