有天上飞的概念, 就要有落地的实现
概念十遍不如代码一遍, 朋友, 希望你把文中所有的代码案例都敲一遍
先赞后看, 养成习惯
SpringBoot 图文教程系列文章目录
SpringBoot 图文教程 1「概念 + 案例 思维导图」「基础篇上」 https://mp.weixin.qq.com/s/phk6j3ChBP-kPtS2xZeEZg
SpringBoot 图文教程 2 - 日志的使用「logback」「log4j」 https://mp.weixin.qq.com/s/7Mw_xhFF4Q5NtdtcsHc67Q
SpringBoot 图文教程 3-「'初恋'情结」集成 Jsp https://mp.weixin.qq.com/s/BYzVg5NBcF_ou_PyX8ygag
SpringBoot 图文教程 4-SpringBoot 实现文件上传下载 https://mp.weixin.qq.com/s/6ctykPo3eDBEB7YsC0PAZw
SpringBoot 图文教程 5-SpringBoot 中使用 Aop https://mp.weixin.qq.com/s/17qMRlv_mUfwkcVD05Bh2g
SpringBoot 图文教程 6-SpringBoot 中过滤器的使用 https://mp.weixin.qq.com/s/r2BO4UMNRAw_REA6nNFLKw
SpringBoot 图文教程 7-SpringBoot 拦截器的使用姿势这都有 https://mp.weixin.qq.com/s/YpDhuOTpt1vjYjnhnK8YdQ
SpringBoot 图文教程 8 - SpringBoot 集成 MBG「代码生成器」 https://mp.weixin.qq.com/s/uGYO4fkw03Kxpfp_PIA8rQ
SpringBoot 图文教程 9-SpringBoot 导入导出 Excel 「Apache Poi」 https://mp.weixin.qq.com/s/BXfxhO5rFFg6XZQ0rZgGMg
SpringBoot 图文教程 10 - 模板导出 | 百万数据 Excel 导出 | 图片导出「easypoi」 https://mp.weixin.qq.com/s/8Yqfn27UCFP2lU3_IYb5AQ
SpringBoot 图文教程 11 - 从此不写 mapper 文件「SpringBoot 集成 MybatisPlus」 https://mp.weixin.qq.com/s/8KG5Wj77MYEUCIRFqWBdPQ
SpringBoot 图文教程 12-SpringData Jpa 的基本使用 https://mp.weixin.qq.com/s/gPfSjBj1hMWf23J50d5Z_g
SpringBoot 图文教程 13-SpringBoot+IDEA 实现代码热部署 https://mp.weixin.qq.com/s/DYP_12V01D0NJGEBdwK9Ew
EasyExcel
EasyExcel 是阿里巴巴开源的一个 Java 操作 Excel 的技术, 和 EasyPoi 一样是封装 Poi 的工具类. 但是不同的地方在于, 在 EasyExcel 中解决了 Poi 技术读取大批量数据耗费内存的问题. 当然了, 也封装了很多常用的 Excel 操作
最基本的导入导出
图片的导入导出
大批量数据的导入导出
模板的导出
官方地址: https://alibaba-easyexcel.github.io/quickstart/write.html
最基本的导入导出
最基本的导入导出, 要导出的数据的实体类如下:
- public class Teacher {
- /**
- * 老师的主键
- */
- private Integer teacherId;
- /**
- * 名字
- */
- private String teacherName;
- /**
- * 头像图片地址
- */
- private String teacherImage;
- /**
- * 老师的状态 0 代表正常 1 代表删除
- */
- private Integer teacherStatus;
- }
省略 get set
1. 导入依赖
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>easyexcel</artifactId>
- <version>2.0.5</version>
- </dependency>
2. 给要导出数据实体类加注解
EasyExcel 也是注解式开发, 常用注解如下
ExcelProperty 指定当前字段对应 Excel 中的那一列
ExcelIgnore 默认所有字段都会和 Excel 去匹配, 加了这个注解会忽略该字段
DateTimeFormat 日期转换, 用 String 去接收 Excel 日期格式的数据会调用这个注解. 里面的 value 参照 java.text.SimpleDateFormat
NumberFormat 数字转换, 用 String 去接收 Excel 数字格式的数据会调用这个注解. 里面的 value 参照 java.text.DecimalFormat
3. 直接导入导出
导出代码
- /**
- * 基本的导出
- */
- @Test
- public void test1(){
- // 准备数据
- List<Teacher> teachers = new ArrayList<>();
- teachers.add(new Teacher(1,"hhh","hhh.jpg",1));
- teachers.add(new Teacher(1,"hhh","hhh.jpg",1));
- teachers.add(new Teacher(1,"hhh","hhh.jpg",1));
- teachers.add(new Teacher(1,"hhh","hhh.jpg",1));
- String fileName = "/Users/lubingyang/Desktop/hhhh.xlsx";
- // 这里 需要指定写用哪个 class 去写, 然后写到第一个 sheet, 名字为模板 然后文件流会自动关闭
- // 如果这里想使用 03 则 传入 excelType 参数即可
- EasyExcel.write(fileName, Teacher.class).sheet("模板").doWrite(teachers);
- }
导入代码
关于 EasyExcel 的数据读取会稍微麻烦一点, 直接通过工具类读取到的数据不能直接处理, 需要借助一个中间的类 监听器 类, 大致的流程如下图
监听器的代码如下, 有详细的注释
- package com.lu.booteasyexcel;
- import com.alibaba.Excel.context.AnalysisContext;
- import com.alibaba.Excel.event.AnalysisEventListener;
- import com.lu.booteasyexcel.dao.TeacherDao;
- import com.lu.booteasyexcel.entity.Teacher;
- import java.util.ArrayList;
- import java.util.List;
- // 有个很重要的点 DemoDataListener 不能被 spring 管理, 要每次读取 Excel 都要 new, 然后里面用到 spring 可以构造方法传进去
- public class DemoDataListener extends AnalysisEventListener<Teacher> {
- /**
- * 每隔 5 条存储数据库, 实际使用中可以 3000 条, 然后清理 list , 方便内存回收
- */
- private static final int BATCH_COUNT = 5;
- /**
- * 这个集合用于接收 读取 Excel 文件得到的数据
- */
- List<Teacher> list = new ArrayList<Teacher>();
- /**
- * 假设这个是一个 DAO, 当然有业务逻辑这个也可以是一个 service. 当然如果不用存储这个对象没用.
- */
- private TeacherDao teacherDao;
- public DemoDataListener() {
- }
- /**
- *
- * 不要使用自动装配
- * 在测试类中将 dao 当参数传进来
- */
- public DemoDataListener(TeacherDao teacherDao) {
- this.teacherDao = teacherDao;
- }
- /**
- * 这个每一条数据解析都会来调用
- *
- */
- @Override
- public void invoke(Teacher teacher, AnalysisContext context) {
- list.add(teacher);
- // 达到 BATCH_COUNT 了, 需要去存储一次数据库, 防止数据几万条数据在内存, 容易 OOM
- if (list.size()>= BATCH_COUNT) {
- saveData();
- // 存储完成清理 list
- list.clear();
- }
- }
- /**
- * 所有数据解析完成了 都会来调用
- *
- */
- @Override
- public void doAfterAllAnalysed(AnalysisContext context) {
- // 这里也要保存数据, 确保最后遗留的数据也存储到数据库
- saveData();
- }
- /**
- * 加上存储数据库
- */
- private void saveData() {
- // 在这个地方可以调用 dao 我们就直接打印数据了
- System.out.println(list);
- }
- }
注意:
监听器这个类不能够被 Spring 管理, 每次使用单独的 new 出来
导入的代码如下:
- /**
- * 添加数据库用到的 dao
- */
- @Autowired
- private TeacherDao teacherDao;
- /**
- * 最简单的读
- */
- @Test
- public void simpleRead() {
- String fileName = "/Users/lubingyang/Desktop/hhhh.xlsx";
- // 这里 需要指定读用哪个 class 去读, 然后读取第一个 sheet 文件流会自动关闭
- /**
- * 参数 1 要读取的文件
- * 参数 2 要读取的数据对应的实体类类对象
- * 参数 3 监听器对象 可以在创建的时候把 dao 当做参数传进去
- */
- EasyExcel.read(fileName, Teacher.class, new DemoDataListener(teacherDao)).sheet().doRead();
- }
读取的结果如下:
图片的导出
在 EasyExcel 中支持多种图片的导入导出, 什么意思呢? 一般情况下, 数据库表中的图片字段存储的是图片路径, 读取图片文件导出是支持的, 除此之外, 还支持网络路径, 流, 字节数组等方式. 我的案例以读取本地图片文件为主.
官方文档地址: https://alibaba-easyexcel.github.io/quickstart/write.html#图片导出
实体类改造
导出的代码是 [不需要做任何改变]
总结
Tips: 最近开始复工了, 比较的忙, 本文只是 EasyExcel 的基本使用, 下一篇文章, 讲解模板导出和百万数据导出
恭喜你完成了本章的学习, 为你鼓掌! 如果本文对你有帮助, 请帮忙点赞, 评论, 转发, 这对作者很重要, 谢谢.
让我们再次回顾本文的学习目标
掌握 SpringBoot 中 EasyExcel 的基本使用
要掌握 SpringBoot 更多的用法, 请持续关注本系列教程.
求关注, 求点赞, 求转发
来源: https://www.cnblogs.com/bingyang-py/p/12461944.html