使用EasyExcel实现导入导出功能

2023-11-11

使用EasyExcel实现导入导出功能

一、导出

1.使用ideal新建一个maven项目,并在pom.xml文件中引入EasyExcel依赖

<!--easyexcel实现导入导出-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.6</version>
</dependency>

2.新建数据库mybatis,并创建用户表user,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lc9n7t40-1656483454988)(E:\Desktop\笔记\使用EasyExcel实现导入导出功能\image-20220629111613277.png)]

3.新建实体类User,代码如下:

package com.example.demo.pojo;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/*
*
* 加了@Data注解的类,编译后会自动给我们加上下列方法:
    所有属性的get和set方法
    toString 方法
    hashCode方法
    equals方法
*
* @AllArgsConstructor :有参构造方法
* @NoArgsConstructor :无参构造方法
* */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ContentRowHeight(18)//内容行高
@HeadRowHeight(25)//标题行高
@ColumnWidth(20)//列宽,可设置成员变量上
public class User implements Serializable {
    //index表示第几列(从0开始,表示第一列),value表示标题(表头)
    @ExcelProperty(value = "用户id",index = 0)
    private Integer id;

    @ExcelProperty(value = "用户名",index = 1)
    private String name;

    @ExcelProperty(value = "用户密码",index = 2)
    private String pwd;

    @ExcelProperty(value = "用户介绍",index = 3)
    private String userIntroduce;
}

4.新建controller接口,实现导出功能,代码如下:

/**
     * 导出本地用户userId与聚力对应userId
     * @return 是否导出成功
     * @throws Exception
     */
@GetMapping("/exportJuLiData")
@ResponseBody
public void exportJuLiData(HttpServletResponse response) throws Exception
{
    String operName = "fengzihao"; // 操作人
    userService.exportJuLiData(response, operName);
}

5.具体的实现代码如下:

/**
     * 导出
     * @param response
     * @param operName 操作人
     * @return 是否成功
     * @throws IOException
     */
@Override
public void exportJuLiData(HttpServletResponse response, String operName) throws IOException {
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //设置响应内容类型
    response.setCharacterEncoding("utf-8");//编码
    // 设置文件名, ps:把字符串中所有的'+'替换成'%20',在URL中%20代表空格
    String fileName = URLEncoder.encode("用户表", "UTF-8").replaceAll("\\+", "%20");
    response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");//设置响应头

    List<User> applicantByPage = userService.listUser();// 获取全部用户数据
    ExcelWriter writer = EasyExcel.write(response.getOutputStream(), User.class).build();//获取写出流
    WriteSheet sheet = EasyExcel.writerSheet("用户").build();//创建表格,设置表格页名称
    writer.write(applicantByPage, sheet);//读出
    writer.finish();//关闭流
}

6.之后启动项目,在浏览器中输入地址即可导出数据到excel,导出的excel如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RYgMcypu-1656483454990)(E:\Desktop\笔记\使用EasyExcel实现导入导出功能\image-20220629113039544.png)]

二、导入

1.在controller添加导入接口,代码如下:

/**
     * 导入本地用户userId与聚力对应userId
     * @param file 导入文件
     * @param updateSupport 是否更新支持,如果已存在,则进行更新数据
     * @return 是否导入成功
     * @throws Exception
     */
@PostMapping("/importJuLiData")
@ResponseBody
public Boolean importJuLiData(@RequestParam MultipartFile file, @RequestParam boolean updateSupport) throws Exception
{
    String operName = "fengzihao"; // 操作人
    Boolean flag = userService.importJuLiData(file, updateSupport, operName);
    return flag;
}

2.具体的实现,代码如下:

/**
     * 导入
     * @param file 导入文件
     * @param updateSupport 是否更新支持,如果已存在,则进行更新数据
     * @param operName 操作人
     * @return 是否成功
     * @throws IOException
     */
@Override
public Boolean importJuLiData(MultipartFile file, boolean updateSupport, String operName) throws IOException {
    UserListener excelListener = new UserListener(userService, updateSupport, operName);
    // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
    //EasyExcel.read(哪个文件).sheet(那张sheet表).head(表头什么样子).headRowNumber(表头占几行).registerReadListener(处理数据的监听器类).doRead()
    EasyExcel.read(file.getInputStream(), User.class, excelListener).sheet(0).head(User.class).headRowNumber(1).doRead();
    System.out.println(excelListener.getSet_fail());
    System.out.println(excelListener.getSuccess());
    System.out.println(excelListener.getFail());
    return true;
}

需要注意的是,这里我们使用到了监听器UserListener,用来读取excel中的数据并保存到数据库,具体的监听器代码如下:

package com.example.demo.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.demo.pojo.User;
import com.example.demo.service.UserService;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

@SuppressWarnings("ALL")
@Component
@Scope("prototype")	// 作者要求每次读取都要使用新的Listener
public class UserListener extends AnalysisEventListener<User> {
    private UserService userService;
    private Boolean updateSupport;
    private String operName;

    private Set<User> juliSet_fail = new HashSet<>(); // 插入失败的数据
    private int success = 0; // 统计插入成功的条数
    private int fail = 0; // 统计插入失败的条数

    // 获取插入失败的数据
    public Set<User> getSet_fail(){
        return juliSet_fail;
    }

    // 获取插入成功的条数
    public int getSuccess(){
        return success;
    }

    // 获取插入失败的条数
    public int getFail(){
        return fail;
    }

    /**
     *
     * @param userService
     * @param updateSupport 是否更新支持,如果已存在,则进行更新数据
     * @param operName 操作人
     */
    public UserListener(UserService userService, Boolean updateSupport, String operName){
        this.userService = userService;
        this.updateSupport = updateSupport;
        this.operName = operName;
    }


    /**
     * 读的时候,每读取excel一行记录就会调用监听器的invoke()方法
     * @param user
     * @param analysisContext
     */
    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
        System.out.println("读的时候,每读取excel一行记录就会调用监听器的invoke()方法");
        User user_new = userService.queryUserById(user.getId());
        if (updateSupport){ // 更新支持,如果已存在,则进行更新数据
            if (user_new != null){ // 如果要插入的数据已存在
                boolean update = userService.updateUser(user);
                if (update){
                    ++success;
                }else {
                    juliSet_fail.add(user);
                    ++fail;
                }
            }else { // 如果要插入的数据不存在
                boolean save = userService.addUser(user);
                if (save){ // 插入成功
                    ++ success;
                }else {// 插入失败
                    juliSet_fail.add(user);
                    ++fail;
                }
            }
        }else {
            if (user_new != null) { // 如果要插入的数据已存在
                juliSet_fail.add(user_new);
            }else {
                boolean save = userService.addUser(user);
                if (save) {// 插入成功
                    ++success;
                } else {// 插入失败
                    juliSet_fail.add(user);
                    ++fail;
                }
            }
        }

    }

    /**
     * 整个过程结束后执行该方法
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("整个过程结束后执行该方法");
    }


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

3.启动项目,使用postman进行测试,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sgo4aAOS-1656483454991)(E:\Desktop\笔记\使用EasyExcel实现导入导出功能\image-20220629140509068.png)]

三、源码获取

至此,我们的使用EasyExcel实现导入导出就讲解完成了。源码和数据库文件可以通过关注我的微信公众号我爱学习呀嘻嘻 ,回复关键字EasyExcel实现导入导出进行获取哦。

image-20211108230322493

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用EasyExcel实现导入导出功能 的相关文章

随机推荐

  • nginx 启动 停止,与报错nginx: [error] open() “/run/nginx.pid“ failed (2: No such file or directory)

    1 寻找nginx启动路径whereis nginx 2 启动 nginx s reload 3 停止 nginx s stop 4 如报错 在执行启动或者停止时 执行 nginx c etc nginx nginx conf
  • Dynamics CRM SLA 使用限制

    自身限制 一 不能循环 例如 Failure设置3天提醒 Warning设置5天提醒 只能是从Applicable From时间开始 第3天Failure 第5天Warning 不能有第二次3天和5天的提醒 不能循环发邮件 例如Warnin
  • 为三个整数排序(30分)

    2 为三个整数排序 30分 题目内容 输入三个整数a b c 按照从小到大的顺序打印输出 输入格式 三个整数 每行一个 输出格式 三个整数 每行一个 输入样例 3 1 22 a int input b int input c int inp
  • 手机端font-size:31.25vw原理

    移动端布局一般使用 方法一 媒体查询 rem 弹性盒子布局 方法二 vw rem 弹性盒子布局 这里说一下vw原理 vw它是根据可视区的宽度来计算的 如果是10vw 就是当前移动设备 浏览器 宽度的十分之一大小 vw 视窗宽度的百分比 1v
  • java集群

    转载 http blog csdn net happyangelling article details 6413584 序言 越来越多的关键应用运行在J2EE Java 2 Enterprise Edition 中 这些诸如银行系统和账单
  • Oracle快速入门(1)——ORACLE数据库简介

    一 什么是ORACLE ORACLE数据库系统是美国ORACLE公司 甲骨文 提供的以分布式数据库为核心的一组软件产品 是目前最流行的客户 服务器 CLIENT SERVER 或B S体系结构的数据库之一 ORACLE通常应用于大型系统的数
  • 编译boost提示错误:LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc100-mt-gd-1_64.lib”

    在Visual Studio 2010下编译出现如下错误 1 gt LINK fatal error LNK1104 cannot open file libboost system vc100 mt gd 1 64 lib 1 gt 1
  • pytorch安装报错:ERROR: torch has an invalid wheel, .dist-info directory not found

    在windows10 anaconda创建虚拟环境后 安装pytorch 运行pip install r requirement txt安装torch时报错 ERROR torch has an invalid wheel dist inf
  • NLP预训练模型系列-GPT-2

    NLP预训练模型 系列文章目录 1 BERT 2 GPT 3 GPT 2 4 GPT 3 目录 NLP预训练模型系列文章目录 前言 1 Abstract 2 Introduction 3 Approach 3 1 Training Data
  • 科大奥锐密立根油滴实验数据_密立根油滴实验数据处理

    刘秋君 回答于 2017 03 05 密立根油滴实验报告 实验题目 密立根油滴实验 电子电荷的测量 实验目的 1 通过对带电油滴在重力场和静电场中运动的测量 验证电荷的不连续性 并测定电子电荷的电荷值e 2 通过实验过程中 对仪器的调整 油
  • Python Wind量化API

    文章目录 导入 代码生成器 各个函数 wds 日期序列函数 wss多维数据函数 wset数据集函数 wsee wses swq 实时行情数据 wsi 获取分钟级别数据 wst 日内 edb 宏观数据 日期函数 tdays ddaysoffs
  • 【page分页工具类】贼好用的分页工具类

    PageUtils工具类如下 package utils import java io Serializable import java util HashMap import java util List import java util
  • QT学习笔记(四)信号槽与简单的自定义信号

    1 坐标系 左上角为零点 x向右为正方向 y向下为正方形 2 信号 完成连接connect的过程包括以下内容 信号的发送 信号发送的具体内容 信号的接受 信号的处理 称为槽函数 3 信号槽 信号槽的优点 松散耦合 信号的发送方和接受方本身没
  • 使用navicat为数据表添加外键

    1 选择需要操作的表 打开设计表 点击外键 2 名 自动生成 无需添加 字段 选择需要添加外键的字段 参考模式 选择表所在的数据库 参考表 关联表名 参考字段 关联表的关联字段 删除时 当删除关联表时 set null该字段置空 更新时 当
  • 【子比主题】添加今日实时热搜榜单教程

    预览图 演示地址 实时热榜 淇云博客 专注于IT技术分享 使用教程 首页版 将下载文件中的 index php 里的内容复制到 wp content themes zibll index php 里你想要放置的地方 Tips 不止index
  • 我爱说英语之学美语发音

    开篇 在写这篇文章之前 我考虑了很久 思前想后 还是决定把她写成一个系列的文章 用以来见证我们学习英语的历程 同时也为了说明我要学好英语的决心 废话不多说 进入正题 回忆 对于我们这些已经毕业很久的人来说 不知道还算不算有英语基础 最起码在
  • 狂野飙车9服务器维护中,狂野飙车9传奇进不去怎么办

    狂野飙车9 国际服IOS进入办法 苹果端的小伙伴如果想要进入 狂野飙车9 的国际服应该怎么办呢 下面 就跟随玩游戏网的小编一起来看一下具体的进入办法吧 感兴趣的小伙伴可千万不要错过哦 进入方法 第一步 首先我们需要推出AppStore账号
  • 魔方机器人之结构篇

    魔方颜色识别和魔方复原算法以及串口通信都解决完了 感觉自己该松口气了吧 结构可以反正仿照别人的来嘛 做出来就的了 事实又打了我一耳光 我怎么发现我的预判总是那么的不靠谱 总结就是自己没做过的东西再也不要说很简单了 即使看上去简单的再也不能简
  • 5-8 以特殊方式跟管理员打招呼

    创建一个至少包含5个用户名的列表 且其中一个用户名为 admin 想象你要编写代码 在每位用户登录网站后都打印一条问候消息 遍历用户名列表 并向每位用户打印一条问候消息 如果用户名为 admin 就打印一条特殊的问候消息 如 Hello a
  • 使用EasyExcel实现导入导出功能

    使用EasyExcel实现导入导出功能 一 导出 1 使用ideal新建一个maven项目 并在pom xml文件中引入EasyExcel依赖