SpringBoot整合EasyExcel+MyBatis-Plus实现Excel批量导入和导出

news/2023/6/5 20:25:41

SpringBoot整合EasyExcel+MyBatis-Plus实现Excel批量导入和导出

  • 一、前期配置
    • 1、依赖
  • 二、使用步骤
    • 1、Entity实体类
    • 2、Mapper层
    • 3、自定义AnalysisEventListener
    • 4、Controller层
    • 5、Util工具类
  • 三、数据与接口截图
    • 1、Excel
    • 2、数据库中信息
    • 3、批量导入接口
    • 4、批量导出Excel接口


2022年8月我更新了新的导入导出方法更简单使用easyexcel实现Excel数据导入以及数据库数据导出成Excel

一、前期配置

1、依赖

        <!--SpringBoot整合easyExcel实现Excel的导入出--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.4</version></dependency><!-- mybatis-plus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency>

二、使用步骤

1、Entity实体类

@ColumnWidth(30)//注释在具体属性上,设置单独列。注释在类上,统一设置列宽
@HeadRowHeight(30)//设置表头行高
@ContentRowHeight(20)//统一设置数据行行高
@ApiModel(value = "User对象", description = "")
public class User implements Serializable {private static final long serialVersionUID = 1L;@ExcelProperty(value = "主键ID", index = 0)@ApiModelProperty(value = "主键ID")@TableId(value = "id", type = IdType.ASSIGN_ID)private Long id;@ExcelProperty(value = "姓名", index = 1)@ApiModelProperty(value = "姓名")private String name;@ExcelProperty(value = "年龄", index = 2)@ApiModelProperty(value = "年龄")private Integer age;@ExcelProperty(value = "邮箱", index = 3)@ApiModelProperty(value = "邮箱")private String email;@ExcelProperty(value = "创建时间", index = 4)@TableField(fill = FieldFill.INSERT)@ApiModelProperty(value = "创建时间")private Date createTime;@ExcelProperty(value = "最后修改时间", index = 5)@TableField(fill = FieldFill.INSERT_UPDATE)@ApiModelProperty(value = "最后修改时间")private Date updateTime;/*** 逻辑删除(0 未删除、1 删除)*/@ExcelProperty(value = "逻辑删除", index = 6)@TableField(fill = FieldFill.INSERT)@ApiModelProperty(value = "逻辑删除(0 未删除、1 删除)")private Integer deleteFlag;@ExcelProperty(value = "最后修改时间", index = 7)@Version@TableField(fill = FieldFill.INSERT)@ApiModelProperty(value = "版本号(用于乐观锁, 默认为 1)")private Integer version;public Integer getVersion() {return version;}public void setVersion(Integer version) {this.version = version;}public static long getSerialVersionUID() {return serialVersionUID;}public Integer getDeleteFlag() {return deleteFlag;}public void setDeleteFlag(Integer deleteFlag) {this.deleteFlag = deleteFlag;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getUpdateTime() {return updateTime;}public void setUpdateTime(Date updateTime) {this.updateTime = updateTime;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", email='" + email + '\'' +", createTime=" + createTime +", updateTime=" + updateTime +", deleteFlag=" + deleteFlag +'}';}
}

2、Mapper层

public interface UserMapper extends BaseMapper<User> {}

3、自定义AnalysisEventListener

public class ExcelListener extends AnalysisEventListener {//可以通过实例获取该值private List<Object> datas = new ArrayList<Object>();@Overridepublic void invoke(Object o, AnalysisContext analysisContext) {datas.add(o);//数据存储到list,供批量处理,或后续自己业务逻辑处理。doSomething(o);//根据自己业务做处理}private void doSomething(Object object) {//1、入库调用接口}public List<Object> getDatas() {return datas;}public void setDatas(List<Object> datas) {this.datas = datas;}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// datas.clear();//解析结束销毁不用的资源}
}

4、Controller层

package com.example.ceshi.controller;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.ceshi.entity.User;
import com.example.ceshi.mapper.UserMapper;
import com.example.ceshi.utils.ExcelListener;
import com.example.ceshi.utils.JsonData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;/*** <p>* 前端控制器* </p>** @author lcy* @since 2021-02-25*/
@RestController
public class UserController {@AutowiredUserMapper userMapper;@RequestMapping("myImport")public JsonData myImport(MultipartFile file) {try {//获取文件名String filename = file.getOriginalFilename();//获取文件流InputStream inputStream = file.getInputStream();//实例化实现了AnalysisEventListener接口的类ExcelListener listener = new ExcelListener();EasyExcelFactory.read(inputStream, User.class, listener).headRowNumber(1).build().readAll();//获取数据List<Object> list = listener.getDatas();if (list.size() > 1) {for (int i = 0; i < list.size(); i++) {User user = (User) list.get(i);System.out.println(user.toString());//使用mybatis-plus添加到数据库userMapper.insert(user);}}} catch (Exception e) {e.printStackTrace();}return JsonData.buildSuccess();}@RequestMapping("myExport")public void myExport(HttpServletResponse response, HttpServletRequest request) {try {String filenames = "111111";String userAgent = request.getHeader("User-Agent");if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {filenames = URLEncoder.encode(filenames, "UTF-8");} else {filenames = new String(filenames.getBytes("UTF-8"), "ISO-8859-1");}response.setContentType("application/json.ms-exce");response.setCharacterEncoding("utf-8");response.addHeader("Content-Disposition", "filename=" + filenames + ".xlsx");// Step1:创建一个 QueryWrapper 对象QueryWrapper<User> queryWrapper = new QueryWrapper<>();// Step2: 构造查询条件queryWrapper.select("*");// Step3:执行查询List<User> userList = userMapper.selectList(queryWrapper);EasyExcel.write(response.getOutputStream(), User.class).sheet("sheet").doWrite(userList);} catch (Exception e) {e.printStackTrace();}}}

5、Util工具类

package com.example.ceshi.utils;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;import java.io.Serializable;@ApiModel("接口实体类")
public class JsonData implements Serializable{/*** 状态码 0表示成功过,-1,-2,-3、、、为失败*/@ApiModelProperty("状态码 0表示成功过,-1,-2,-3、、、为失败")private Integer code;/*** 业务数据*/@ApiModelProperty("业务数据")private Object data;/*** 信息表示*/@ApiModelProperty("信息表示")private String msg;public JsonData() {}public JsonData(Integer code, Object data, String msg) {this.code = code;this.data = data;this.msg = msg;}/*** 成功,不用返回数据** @return*/public static JsonData buildSuccess() {return new JsonData(0, null, null);}/*** 成功,返回数据** @param data* @return*/public static JsonData buildSuccess(Object data) {return new JsonData(0, data, null);}/*** 成功,返回数据** @param msg* @return*/public static JsonData buildSuccess(String msg) {return new JsonData(0, null, msg);}/*** 成功,返回数据,信息* @param data* @param msg* @return*/public static JsonData buildSuccess(Object data,String msg) {return new JsonData(0, data, msg);}/*** 失败,固定状态码** @param msg* @return*/public static JsonData buildError(String msg) {return new JsonData(-1, null, msg);}/*** 失败,自定义错误码和信息** @param code* @param msg* @return*/public static JsonData buildError(Integer code, String msg) {return new JsonData(code, null, msg);}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

三、数据与接口截图

1、Excel

Excel

2、数据库中信息

数据库中信息

3、批量导入接口

批量导入接口

4、批量导出Excel接口

批量导出Excel接口


https://dhexx.cn/news/show-18441.html

相关文章

spark常用RDD算子 - foldByKey

foldByKey函数是对PairRDD<K, V>&#xff0c;对V做合并处理 可以看到&#xff0c;第一个参数是zeroValue&#xff0c;这个就是用来对原始的V做合并操作的&#xff0c;后面的参数是一个JFunction操作。 对于一个PairRDD&#xff0c;如Array(("A",0),("A&…

SpringBoot整合Shiro+Redis框架权限管理

SpringBoot整合ShiroRedis框架权限管理一、导入依赖二、Config类2.1、自定义realm2.2、自定义AuthorizationFilter2.3、自定义SessionIdGenerator2.4、自定义DefaultWebSessionManager2.5、ShiroConfig三、登陆注册及其他接口3.1、Controller层3.2、Service层3.2.1、UserServic…

Nginx安装及使用

Nginx安装及使用一、Nginx的安装网址二、windows下安装1、启动方式一2、启动方式二3、运行成功画面4、配置监听5、关闭nginx的两种方式三、Linux下安装四、后端负载均衡策略和反向代理实战1、编辑conf/nginx.conf2、代码3、测试一、Nginx的安装网址 安装网址 二、windows下安装…

SpringBoot整合RabbitMQ消息中间件及多种设计模式

SpringBoot整合RabbitMQ消息中间件及多种设计模式1、介绍与安装下载1.1、不同MQ特点1.2、下载1.3、打开网址2、使用可视化配置2.1、创建交换机2.2、创建队列2.3、来宾用户详情2.4、创建来宾用户2.5、用户与虚拟主机进行绑定2.6、创建虚拟主机3、五种常用的模式3.1、导入依赖3.2…

LCHub:ChatGPT4和低代码来临,程序员面临下岗?

一个网友吐槽道: “ 建站出来了,你们说程序员会失业。 低代码出来了,你们说程序员会失业。 Copilot出来了,你们说程序员会失业。 Chatgpt出来了,你们说程序员会失业 虽然这只是网友的吐槽,但却引起了小编的好奇。为何程序员那么容易被新技术取代?今天小编打算跟大家…

Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决...

昨晚在编译源码&#xff0c;make一段时间之后报错如下&#xff1a; # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc0x40362d33, pid12195, tid2835454784 # # JRE version: 6.0_45-b06 # Java VM: Java HotSpot(TM) Server VM …

3.3FactoryMethod——工厂方法

意图&#xff1a; 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。 其实在抽象工厂模式中&#xff0c;经过改进后的模式就是工厂方法模式&#xff0c;所以不多说了&#xff0c;上UML图。 通过工厂方法模式的类图…

学习ASP.NET MVC(五)——我的第一个ASP.NET MVC CURD页面

在上一篇文章中我们已经创建了实体类&#xff0c;在这一篇文章中&#xff0c;我将创建一个新的控制器类——BookController&#xff0c;使用BookController对Books表中的数据进行CURD操作的方法&#xff0c;并使用视图模板在浏览器中显示所查询到的书籍数据信息。 一、添加控制…

SpringCloud学习之路

SpringCloud学习之路1、使用IDEA搭建Eureka服务中心Server端启动1.1、创建和配置注册中心Eureka1.2、使用Eureka案例1.3、负载均衡器Ribbon1.4、负载均衡器Feign1.5、Feign核心源码解读和服务调用方式ribbon和Feign选择2、降级熔断Hystrix实战2.1、SpringCloud整合断路器的使用…

存储引擎-存储结构之二:页

说理论&#xff0c;总是枯燥的&#xff0c;先来段搞笑视频&#xff0c;清清脑 模特兒走秀摔倒集錦&#xff1a;http://947kan.com/video/player-53088-0-0.html 原文地址&#xff1a; http://www.sqlskills.com/BLOGS/PAUL/post/Inside-the-Storage-Engine-Anatomy-of-a-page.a…