excel的导入导出的两种方案 (1 EasyExcel 2 Hutool工具类)

news2024/12/23 0:06:52

文章目录

  • 前言
  • 1 EasyExcel的导入导出
    • 导出
      • 1 导入依赖
      • 2 项目中的CourseEntity实体类
      • 3 CoureseVo VO类 (对CourseEntity进行EasyExcel导入导出操作)
      • 4 导出代码的编写 并最终测试导出效果
      • 5 (前端内容 可选)通过vue按钮点击 导出
    • 导入
      • 1 导入依赖 跟导出相同
      • 2 创建回调监听器
      • 3 编写导入代码
      • 4 最终测试


前言

介绍
excel的导入导出
两种方式
(1 EasyExcel(alibaba) 2 Hutool工具类)

已经实现了 1 EasyExcel 的导入导出
待完善 2023/4/18


1 EasyExcel的导入导出

导出

1 导入依赖

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

2 项目中的CourseEntity实体类

项目用到的课程实体类  

这个实体类是我们DAO层绑定用的

不能使用这个实体类操作EasyExcel 我们等会儿再创建一个VO类
用VO类 操作EasyExcel

这里使用的是mybatis-plus的操作方式

@TableName("course")  注解绑定的是数据库中的course表

@TableId(type = IdType.AUTO)  主键ID ID为AUTO自增策略

在这里插入图片描述
在这里插入图片描述


/**
 * 课程表
 */
@Data
@TableName("course")
public class CourseEntity {
    /**
     * 主键
     */
    @TableId(type = IdType.AUTO)
    private Integer id;

    /**
     * 课程id
     */
    private Integer cid;

    /**
     * 课程名
     */
    private String name;
}

3 CoureseVo VO类 (对CourseEntity进行EasyExcel导入导出操作)

@ExcelIgnore 忽略 也就是导出的时候没有这个字段

@ExcelProperty(value = "课程id",index = 0)
value是指 导出到excel中的列名称
Index 是指在第几列 0 代表在第一列

在这里插入图片描述

@Data
public class CoureseVo {

    /**
     * 主键
     */
    @ExcelIgnore
    private Integer id;

    /**
     * 课程id
     */
    @ExcelProperty(value = "课程id",index = 0)
    private Integer cid;

    /**
     * 课程名
     */
    @ExcelProperty(value = "课程名称",index = 1)
    private String name;
}

4 导出代码的编写 并最终测试导出效果

这里为了方便 
就在controller层写了
你当然可以抽出逻辑写到service层 这都无所谓
@RestController
@RequestMapping("/excel")
public class EasyExcelController {

    //注入的是Mybatis-plus Dao层
    // 这个CourseDao 与数据库中的course 表已经绑定了
    //这里注入 DAO 直接调Dao的方法进行测试
    @Autowired
    CourseDao courseDao;


    @RequestMapping("/export")
    public void export(HttpServletResponse response) throws IOException {

        //1 设置下载
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("数据字典", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");

        // 2 查所有course实体  封装到coureseVo中  再把coureseVo通过Easyexcel写出
        //   coureseVo相当于 course实体 和 Easyexcel工具的一个中介  实现了解耦
        List<CourseEntity> courseEntities = courseDao.selectList(null);
        ArrayList<CoureseVo> vos = new ArrayList<>();
        for (CourseEntity courseEntity : courseEntities) {
            CoureseVo coureseVo = new CoureseVo();
            BeanUtils.copyProperties(courseEntity,coureseVo);
            vos.add(coureseVo);
        }

        //write写出(输出位置,输出类型) .sheet(标题) .diwrite(实际写出的list集合数据)
        EasyExcel.write(response.getOutputStream(), CoureseVo.class).sheet("数据库课程").doWrite(vos);



    }

}

结果 测试

直接启动项目,浏览器 url 端口加路径访问
结果
在这里插入图片描述

5 (前端内容 可选)通过vue按钮点击 导出

1 <template 标签内容>

<div class="el-toolbar">
<div class="el-toolbar-body"style="justify-content: flex-start;">
<el-button type="text"@click="exportData"><i class="fa fa-plus"/> 导出</el-button>
</div>
</div>

2 <script标签内容>
调我们后端写的接口

exportData() {
window.location.href = 'http://localhost:8202/admin/cmn/dict/exportData'
}

导入

1 导入依赖 跟导出相同

2 创建回调监听器

package com.example.cat.EasyExcelListen;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.cat.dao.CourseDao;
import com.example.cat.entity.CoureseVo;
import com.example.cat.entity.CourseEntity;
import org.springframework.beans.BeanUtils;

//监听器类
//需要继承阿里的 AnalysisEventListener 泛型里写 EasyExcel工具和实体类的  中介VO类
public class courseListener extends AnalysisEventListener<CoureseVo> {

    //这里注入 mybatis-plus Dao层 方便我们对从excel表中读到的数据进行处理
    private CourseDao courseDao;
    public courseListener(CourseDao courseDao) {
        this.courseDao = courseDao;
    }



    //这个方法会 一行一行的读取 excel
    //把excel 中的一行内容变成 一个 中介类coureseVo
    @Override
    public void invoke(CoureseVo coureseVo, AnalysisContext analysisContext) {
        //创建数据库中对应的实体类
        CourseEntity courseEntity = new CourseEntity();
        //把每个中介类VO的 属性 copy给 数据库中对应的实体类
        BeanUtils.copyProperties(coureseVo,courseEntity);
        //添加到数据库中 实现到导入
        courseDao.insert(courseEntity);

    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}


3 编写导入代码

我这里直接在cont

这里为了方便 
就在controller层写了
你当然可以抽出逻辑写到service层 这都无所谓
@RestController
@RequestMapping("/excel")
public class EasyExcelController {

    //注入的是Mybatis-plus Dao层
    // 这个CourseDao 与数据库中的course 表已经绑定了
    //这里注入 DAO 直接调Dao的方法进行测试
    @Autowired
    CourseDao courseDao;



    @RequestMapping("/import")
    public void importData(MultipartFile file) throws IOException {


        System.out.println("打印出来的是_" + file.toString());

        //导入操作
        //  read(文件中,读的类型,设置监听器(传入一个Mybatis-plus的dao 方便数据添加))
        EasyExcel.read(file.getInputStream(),CoureseVo.class,new courseListener(courseDao)).sheet().doRead();
        
    }

}

4 最终测试

先准备一个excel
在这里插入图片描述

使用POSTMAN访问接口
在这里插入图片描述
插入成功
在这里插入图片描述

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

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

相关文章

1、Typescript基础入门与环境搭建

1、开发工具安装与基本配置 1.1、软件下载安装 如果你还没有使用过VSCode&#xff0c;当然先要去官网下载了。下载完成后双击安装&#xff0c;一直下一步即可。 1.2、编辑器汉化 如果你英语不是很好&#xff0c;配置中文版界面是很有必要的&#xff0c;安装个插件就可以了。打…

虚化背景 - 基于镜头模糊滤镜的深度映射

镜头模糊 Lens Blur等滤镜可以使用深度映射 Depth Map来设置像素在视觉上的前后关系。因此&#xff0c;常利用深度映射来创建真实感虚化效果&#xff0c;或者进行超越镜头的任意虚化处理。 ◆ ◆ ◆ 基于 Alpha 通道的深度映射关系 一般可通过建立 Alpha 通道或图层蒙版来创建…

【算法基础】DP第三弹 —— 竞赛篇

一、计数问题 (一)Question 1. 问题描述 2. Input 输入包含多组测试数据。每组测试数据占一行,包含两个整数 a 和 b。当读入一行为 0 0 时,表示输入终止,且该行不作处理。(0 < a, b < 100000000) 3. Output 每组数据输出一个结果,每个结果占一行。每个结果包…

MIPI D-PHYv2.5笔记(21) -- Forward High-Speed Data Transmission Timing

声明&#xff1a;作者是做嵌入式软件开发的&#xff0c;并非专业的硬件设计人员&#xff0c;笔记内容根据自己的经验和对协议的理解输出&#xff0c;肯定存在有些理解和翻译不到位的地方&#xff0c;有疑问请参考原始规范看 DDR时钟差分信号和Data差分信号的时序关系如下图所示…

计及调度经济性的光热电站储热容量配置方法【IEEE30节点】(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

计算机网络简史

ARPANET的发展 互联网最早的雏形 1931-ARPANET设计 互联网名人堂 1965-packet switching(分包交换) 1969 第一个RFC(Request for Comments)(开始通过APPANET发布)第一个接口信息处理单元&#xff08;Interface Message Processor&#xff09;&#xff08;下图&#xff0c;节…

ChatGPT时代:我们可能站到了自然语言编程的大门口

ChatGPT大火&#xff0c;我现在有种感觉&#xff1a;我们可能站到了自然语言编程的门口&#xff0c;一脚下去&#xff0c;也许能把门踹开。 当然&#xff0c;也可能会踢到一块铁板。 回顾我们的编程之路&#xff0c;基本上就是一个编程门槛不断降低的历史。 最早的一批前辈们…

wireshark抓包工具的使用

前言 ①wireshark是非常流行的网络封包分析软件&#xff0c;功能十分强大。可以截取各种网络封包&#xff0c;显示网络封包的详细信息。 ②使用wireshark的人必须了解网络协议&#xff0c;否则就看不懂wireshark。 ③为了安全考虑&#xff0c;wireshark只能查看封包&#xff…

【Linux】进程通信之管道通信详解

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 一、什么是管道通信 1. 管道通信是一种在进程间传递数据的方法 其实管道通信是Unix中最古老的进程间通信的形式了&#xff1a; 管道通信是一种进程间通信的方式&#xff0c;它可以让一个进…

聚观早报|马斯克将TruthGPT挑战ChatGPT;腾讯披露自研芯片新进展

今日要闻&#xff1a;马斯克将TruthGPT挑战ChatGPT&#xff1b;苹果在印度年销售额近60亿美元&#xff1b;腾讯披露自研芯片沧海最新进展&#xff1b;特斯拉中国工厂普通工人月薪约1万元&#xff1b;飞猪将直接向阿里CEO张勇汇报 马斯克将TruthGPT挑战ChatGPT 4 月 18 日消息&…

Pytorch深度学习笔记(四)梯度向下算法

课程推荐&#xff1a;03.梯度下降算法_哔哩哔哩_bilibili 优化问题&#xff1a;求误差值函数最小的权重w &#xff08;1&#xff09;梯度向下算法思想 在绝大多数的情况下&#xff0c;损失函数是很复杂的&#xff08;比如逻辑回归&#xff09;&#xff0c;根本无法得到参数估计…

从输入url到页面展现(三)通过DNS将域名解析为IP地址以及dns-prefetch的好处

前言 上一节我们用直白的话讲了一下浏览器解析url&#xff0c;而浏览器并不具备发送网络消息的能力&#xff0c;所以委托操作系统发送&#xff0c;而这里的第一步&#xff0c;就是去找到对应web服务器的ip地址&#xff0c;并且对互联网和小子网有了一个认识。 这一节呢说一下我…

换个角度使用Redis去解决跨域存取Session问题

系列文章目录 Redis缓存穿透、击穿、雪崩问题及解决方法 Spring Cache的使用–快速上手篇 分页查询–Java项目实战篇 全局异常处理–Java实战项目篇 该系列文章持续更新&#xff0c;更多的文章请点击我的主页查看哦&#xff01; 文章目录 系列文章目录前言一、遇到的情况二、解…

golang 云效私有模块依赖拉取配置

相关文档 阿里官方文档 go 环境变量配置 export GOPRIVATEcodeup.aliyun.com 凭证设置 非常找重要,https密码配置克隆账户和克隆密码后续会用到 在 可以在 netrc 文件中指定凭据 Linux\MacOS 文件应该存放在执行账户的根目录下&#xff0c;即&#xff1a;~/.netrc sudo v…

SAS 9.3软件安装包下载及安装教程 办公软件

SAS 9.3软件简介&#xff1a; SAS 9.3是目前行业软件中的一款专业的数据统计分析软件&#xff0c;其核心功能包括高级分析、商业智能、客户智能、数据管理、风险管理和欺诈与安全智能六大模块&#xff0c;通过sas软件提供创新的分析、商业智能和数据管理软件与服务&#xff0c…

3Dsmax丨3dsmax2016软件下载安装教程 含全版本软件详细安装流程

大家好~随着计算机技术的发展&#xff0c;3D建模在各个行业中被广泛应用。以游戏行业为例&#xff0c;通过3D建模模型制作、灯光制作、材质渲染、细节润色、渲染合成等能够制作出游戏原神、王者荣耀、和平精英、英雄联盟、明日之后、光遇、哈利波特、剑网3、我的世界、第五人格…

SQL——关于bjpowernode.sql的33道经典例题之1-17

目录 1 查询每个部门最高薪水的人员名称 2 查询哪些人的薪水在部门平均薪水之上 3 查询每个部门的平均薪水等级 3.1 每个部门的平均薪水的等级 3.2 每个部门的平均的薪水等级 4 查询最高薪水&#xff08;不用max函数&#xff09; 5 查询平均薪水最高的部门的部门编号 …

如何使用 GPT-4 为博客目录页打造炫酷前端效果

前不久我用 cmd markdown 写了篇文章《项目 TO 的自我修养》&#xff0c;文章的目录如下&#xff1a; 当我把它发布到线上后&#xff0c;目录却只展示出了二级标题&#xff1a; 这哪行&#xff01;我猜这个可能就是加个配置啥的就能修复。于是马上就问 GPT-4 怎么办&#xff1f…

25.SSM-SpringMVC延续--拦截器与异常处理思想

目录 一、拦截器。 &#xff08;1&#xff09;拦截器的作用。 &#xff08;2&#xff09;拦截器与过滤器的区别。 &#xff08;3&#xff09;拦截器的方法。 &#xff08;4&#xff09;拦截器的快速入门。 &#xff08;5&#xff09;多拦截器。 &#xff08;5.1&#xf…

哈工大软件构造-设计模式笔记

文章目录 UML简单知识1&#xff0e;单例模式2.工厂方法模式3&#xff0e;迭代器模式4&#xff0e;策略模式5&#xff0e;建造者模式6&#xff0e;模板方法模式7&#xff0e;代理模式8&#xff0e;责任链模式9&#xff0e;抽象工厂模式10&#xff0e;适配器模式11&#xff0e;观…