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

news/2025/5/22 11:19:24

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://blog.csdn.net/weixin_46146718/article/details/115250530
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-18441.html

相关文章

SAP修改前台屏幕字段文本

首先&#xff0c;要找到需要修改文本所对应的数据元素&#xff1b;其次&#xff0c;进入CMOD&#xff0c;点击菜单栏中“转到--文本增强--关键字--更改”&#xff0c;填入数据元素&#xff0c;进入下一屏幕。将显示的文本全部改为自己需要的文本&#xff0c;保存即可。 转载于:…

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…

【Lucene4.8教程之二】索引

一、基础内容 0、官方文档说明 &#xff08;1&#xff09;org.apache.lucene.index provides two primary classes: IndexWriter, which creates and adds documents to indices; and IndexReader, which accesses the data in the index. &#xff08;2&#xff09;涉及的两…

自制AutoMapper实现DTO到持久层Entity的转换

项目中经常涉及到页面DTO更新&#xff0c;保存到数据库的操作&#xff0c;这就必然牵扯到DTO和持久层对象的转换&#xff0c;常见的第三方库有&#xff1a; java&#xff1a;dozer .net: AutoMapper 看到AutoMapper已经许久没更新了&#xff0c;而且项目中没必要用这么大的东西…

spark常用RDD算子 - SortByKey

SortByKey用于对pairRDD按照key进行排序&#xff0c;第一个参数可以设置true或者false&#xff0c;默认是true List<Tuple2<String, Integer>> data new ArrayList<>(); data.add(new Tuple2<>("A", 10)); data.add(new Tuple2<>(…

Nginx安装及使用

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

成功路很多,选对放心日赚几百不是问题

俗话说的好&#xff1a;“三百六十行&#xff0c;行行出状元”“人挪活&#xff0c;树挪死”。我从小就是个爱冒险的人&#xff0c;不喜欢千篇一律的固定模式。可是&#xff0c;在我人生的前二十七年中&#xff0c;我却一直这样循规蹈矩的活着。 我出生在苏州一个知识分子的家庭…

spark常用RDD算子 - groupByKey

groupByKey是对单个 RDD 的数据进行分组 def groupByKey(): RDD[(K, Iterable[V])] def groupByKey(numPartitions: Int): RDD[(K, Iterable[V])] def groupByKey(partitioner: Partitioner): RDD[(K, Iterable[V])] groupByKey会将RDD[key,value] 按照相同的key进行分组&…

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…