SpringBoot整合easyexcel进行excel报表导入导出
目录
- `easyexcel` 简介
- `EasyExcel` 和 `POI` 的对比
- `SpringBoot` 整合 `easyexcel`
- `Maven` 依赖
- 数据库 `SQL` 脚本
- 实体类
- 导入导出 `dao` 层
- 导入导出 `service` 层
- 导入导出 `controller` 层
- 表格事件监听器
- 导入 `excel` 报表页面
- `excel` 报表的导出
- `excel` 报表的导入
easyexcel
简介
Java
解析、生成 Excel
比较有名的框架有 Apache POI
,但存在一个严重的问题就是非常的耗内存,针对这个问题阿里出品了用来处理 Excel
的开源工具 easyexcel
GitHub
官网:https://github.com/alibaba/easyexcel
官方文档:https://alibaba-easyexcel.github.io/
EasyExcel
和 POI
的对比
- 相比于
POI
,EasyExcel
简化了开发量,能够用更少的代码实现更多的功能 - 相比于
POI
,EasyExcel
使用简单 - 相比于
POI
,EasyExcel
能够使用更少的内存占用
SpringBoot
整合 easyexcel
Maven
依赖
主要依赖如下,其他依赖自行依赖导入
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version>
</dependency>
数据库 SQL
脚本
CREATE TABLE `excel_user` (`user_id` int(11) NOT NULL AUTO_INCREMENT,`dept_id` int(11) NOT NULL COMMENT '部门ID',`loginName` varchar(255) NOT NULL COMMENT '登录账号\r\n',`phone` varchar(255) NOT NULL,`password` varchar(255) NOT NULL COMMENT '密码',`status` int(255) NOT NULL COMMENT '帐号状态',`createTime` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`updateTime` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`user_id`),UNIQUE KEY `index_ln` (`loginName`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
实体类
@Data
public class ExcelUser {// 定义表头名称和位置,0代表第一列@ExcelProperty(value = "编号", index = 0)private Integer userId;@ExcelProperty(value = "部门编号", index = 1)private Integer deptId;@ExcelProperty(value = "登录账号", index = 2)private String loginname;@ExcelProperty(value = "用户手机号", index = 3)private String phone;@ExcelProperty(value = "密码", index = 4)private String password;@ExcelProperty(value = "账户状态", index = 5)private Integer status;@ExcelProperty(value = "创建时间",index = 6)private Date createtime;@ExcelProperty(value = "更新时间",index = 7)private Date updatetime;
}
easyexcel
中的常用注解:https://blog.csdn.net/weixin_45151960/article/details/109095332
导入导出 dao
层
mapper
接口
@Mapper
public interface ExcelUserMapper {List<ExcelUser> getAll();int insertAll(List<ExcelUserDto> excelUserDtoList);
}
mapper.xml
<!--查询所有-->
<select id="getAll" resultType="org.example.pojo.ExcelUser">SELECT<include refid="Base_Column_List"></include>FROMexcel_user
</select><!--批量插入-->
<insert id="insertAll" parameterType="java.util.List">insert into excel_user (dept_id, loginName, phone, password, status) values<foreach collection="list" item="excelUserDto" index="index" separator=",">(#{excelUserDto.deptId}, #{excelUserDto.loginname},#{excelUserDto.phone}, #{excelUserDto.password}, #{excelUserDto.status})</foreach>
</insert>
导入导出 service
层
@Slf4j
@Service
public class ExcelServiceImpl implements ExcelService {@Autowiredprivate ExcelUserMapper excelUserMapper;/*** 导出用户信息** @param response response*/@Overridepublic ResultMap excelExport(@NotNull HttpServletResponse response) {// 获取需要导出的数据List<ExcelUser> excelUserList = excelUserMapper.getAll();log.info("记录导出数据行数:{}", excelUserList.size());try {response.setContentType("application/json");response.setCharacterEncoding("UTF-8");String fileName = URLEncoder.encode("用户名单表", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");// 向Excel中写入数据ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), ExcelUser.class);ExcelWriterSheetBuilder excelWriterSheetBuilder = write.sheet("用户名单表");excelWriterSheetBuilder.doWrite(excelUserList);return new ResultMap().success();} catch (Exception e) {log.error("数据导出失败!!!");return new ResultMap().fail();}}/*** 导入用户信息** @param multipartFile multipartFile*/@Transactional@Overridepublic ResultMap excelImport(@NotNull MultipartFile multipartFile) {try {ExcelListener excelListener = new ExcelListener();// 读取数据ExcelReaderBuilder excelReaderBuilder = EasyExcel.read(multipartFile.getInputStream(), ExcelUser.class, excelListener);ExcelReaderSheetBuilder excelReaderSheetBuilder = excelReaderBuilder.sheet();excelReaderSheetBuilder.doRead();// 获取excel读取到的数据List<ExcelUser> list = excelListener.getList();// 比较loginname字段去重,数据库有唯一索引List<ExcelUser> excelUserList = this.removeDuplicateOrder(list);// 数据库表不用插入userId列,它是主键列List<ExcelUserDto> excelUserDtoList = new ArrayList<>();excelUserList.forEach(item -> {ExcelUserDto excelUserDto = new ExcelUserDto();BeanUtils.copyProperties(item, excelUserDto);excelUserDtoList.add(excelUserDto);});// 数据的持久化int i = excelUserMapper.insertAll(excelUserDtoList);if (i > 0) {return new ResultMap().success();}return new ResultMap().fail();} catch (IOException e) {log.error("数据导入失败!!!");return new ResultMap().fail();}}/*** 比较loginname字段去重,数据库有唯一索引** @param list list* @return List*/@NotNullprivate List<ExcelUser> removeDuplicateOrder(List<ExcelUser> list) {Set<ExcelUser> set = new TreeSet<>((a, b) -> {// 等于0表示重复int compareToResult = 1;if (a.getLoginname().equals(b.getLoginname())) {compareToResult = 0;}return compareToResult;});set.addAll(list);return new ArrayList<>(set);}
}
导入导出 controller
层
@Slf4j
@Controller
public class ExcelController {@Autowiredprivate ExcelService excelService;/*** 导出用户信息** @param response response* @return ResultMap*/@GetMapping(path = "/excelExport")@ResponseBodypublic ResultMap excelExport(HttpServletResponse response) {return excelService.excelExport(response);}@GetMapping(path = "/fileUpload")public String uploadPage(){return "fileUpload";}/*** 导入用户信息** @param file multipartFile* @return ResultMap*/@PostMapping(path = "/excelImport")@ResponseBodypublic ResultMap excelImport(MultipartFile file) {return excelService.excelImport(file);}
}
表格事件监听器
@Slf4j
public class ExcelListener extends AnalysisEventListener<ExcelUser> {@Getter@Setterprivate List<ExcelUser> list = new ArrayList<>();@Overridepublic void invoke(ExcelUser excelUser, AnalysisContext analysisContext) {log.info("--------------------------------------------");log.info("导入数据{}", JSON.toJSONString(excelUser));// 数据存储到list,供批量处理,或后续自己业务逻辑处理list.add(excelUser);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}
导入 excel
报表页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8" /><title>Insert title here</title>
</head>
<body><h1 th:inlines="text">文件上传</h1><form th:action="@{excelImport}" method="post" enctype="multipart/form-data"><p>选择文件: <input type="file" name="file"/></p><p><input type="submit" value="提交"/></p></form>
</body>
</html>
- 此处的选择文件的
input
标签中的name
属性值务必要与controller
接口中的入参变量名MultipartFile file
保持一致,否则会报错参数MultipartFile
不能为null
excel
报表的导出
浏览器请求接口 http://127.0.0.1:8080/excelImport
,结果如下
导出 excel
中的数据
数据库表数据
excel
报表的导入
准备要导入的 excel
报表的数据如下
浏览器访问接口 http://127.0.0.1:8080/fileUpload
,页面如下
选择相应的 excel
报表文件,点击提交,结果如下
数据库表新增数据如下
SpringBoot整合easyexcel进行excel报表导入导出相关推荐
- EasyExcel实现Excel文件导入导出
1 EasyExcel简介 EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址: https://git ...
- 使用EasyExcel实现Excel的导入导出
文章目录 前言 一.EasyExcel是什么? 二.使用步骤 1.导入依赖 2.编写文件上传配置 3.配置表头对应实体类 4.监听器编写 5.控制层 6.前端代码 总结 前言 在真实的开发者场景中,经 ...
- SpringBoot整合easyexcel实现Excel的导出
在一般不管大的或者小的系统中,各家的产品都一样,闲的无聊的时候都喜欢让我们这些程序员导出一些数据出来供他观赏,非说这是必须需求,非做不可,那么我们就只能苦逼的哼哧哼哧的写bug喽. 之前使用POI导出 ...
- EasyExcel实现Excel文件导入导出功能
一.EasyExcel简介 Java领域解析.生成Excel比较有名的框架有Apache poi.jxl等.但他们都存在一个严重的问题就是非常的耗内存.如果你的系统并发量不大的话可能还行,但是一旦并发 ...
- SpringBoot整合Easyexcel操作Excel,闲暇之余,让我们学习更多
easyexcel 3.0.2 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boo ...
- 使用springboot整合EasyExcel对excel类型的文件进行读写操作
实现功能:可以将java对象转换成excel文件或者将excel文件中的内容读取到java中 具体的实现: 导入对应的依赖 实现读操作 实现写操作 导入对应的依赖 <!-- https://mv ...
- 使用easyexcel进行excel的导入和导出(web)
使用easyexcel进行excel的导入和导出(web) 前言:使用springboot,mybatis,excel3.x.x,通用mapper.本文主要演示怎么使用easyexcel,因此先展示效 ...
- 使用EasyExcel实现Excel的导入、导出、下载模板等功能
文章目录 导入功能 依赖 实体类 监听器 控制器 批量插入 导出功能 下载模板 实体类 控制层 业务层 参考:https://blog.csdn.net/z845910508/article/deta ...
- EasyPoi实现excel文件导入导出
EasyPoi学习实践 1 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板 ...
- [Java中实现Excel表导入导出]基于easy-poi和EasyExcel两种方式实现
第一种:基于easy-poi实现Excel导入导出 1.导出Excel表格 第一步:在pom文件中导入依赖 <!--基于easy-poi实现Excel导入导出--><dependen ...
最新文章
- linux安装eclipse运行web,Linux安装Tomcat,运行Eclipse,web项目
- ORB-SLAM(八)ORBmatcher 特征匹配
- 在一个SQL Server表中的多个列找出最大值
- node平台截取图片模块——jimp
- 批量生成100万张小程序码?了解一下。
- 模块怎么用_IC设计方法:模块划分与overdesign
- python-列表list和元组tuple
- Eclipse和IDEA 简单对比说明
- sql能查到数据 dataset对象里面没有值_spark系列:RDD、DataSet、DataFrame的区别
- Linux命令:find命令
- php接收不到url传值_【干货】PHP 异步后台处理
- 自定义Button按钮
- 计算机指令窗口如何放大,我电脑每次打开一个窗口都好小,怎么设置为每次都全屏啊?...
- python回复qq消息,python自动化实现自动回复QQ消息
- Power BI报表常见格式 1 - 报告
- 查看kafka的版本
- 关于云音乐数据治理的实践与思考
- 免费图床,看这一篇就够了!
- Linux磁盘管理练习题(习题+演示)
- 拒绝的权限----创建中间层对象错误解决方法
热门文章
- 自动驾驶 2-1 第 1 课补充阅读:传感器和计算硬件 -- 上
- 把UIView提到所有View的最前面
- iphone 抹除设备是什么意思_环保设备公司什么意思?|危汇网|
- oracle安装出现乱码报错,oracle_oracle安装出现乱码等相关问题,安装oracle时候遇到错误 Preparing - phpStudy...
- 阿玛尼搜索引擎收录_被全网黑的阿玛尼权利,我一个大干皮咋用的挺好?
- 14Penrose广义逆(II)
- uva 1587 题解
- php 自动选择时间的代码,JavaScript_extjs 时间范围选择自动判断的实现代码,extjs中 有时需要选择一个日期 - phpStudy...
- python 京东 价格_python根据京东商品url获取产品价格
- 【知识图谱系列】基于Randomly Perturb的图谱预训练模型GraphCL