EasyExcelDemo
官网:https://easyexcel.opensource.alibaba.com/
demo代码:
github:ishuaige/easyExcelDemo: easyExcel的Demo (github.com)
gitee:easyExcelDemo: easyExcel的小demo (gitee.com)
一.准备工作
导入数据库文件
- 我们做一个类似积分系统,数据库包含用户名,上月积分和当前积分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名',
`oldScore` int(0) NOT NULL COMMENT '旧分数',
`currentScore` int(0) NULL DEFAULT NULL COMMENT '当前分数',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '覃瑾瑜', 2, 815562);
INSERT INTO `user` VALUES (2, '高炎彬', 8907860, 42442602);
INSERT INTO `user` VALUES (3, '石嘉熙', 665342, 86753);
INSERT INTO `user` VALUES (4, '赵越彬', 426, 999);
INSERT INTO `user` VALUES (5, '廖智渊', 733840, 6529367);
INSERT INTO `user` VALUES (6, '傅明辉', 5, 57647299);
INSERT INTO `user` VALUES (7, '龚越彬', 43, 78204464);
INSERT INTO `user` VALUES (8, '陆烨霖', 1681509, 3);
INSERT INTO `user` VALUES (9, '黎晋鹏', 2, 134809752);
INSERT INTO `user` VALUES (10, '雷昊焱', 20, 3489470);
INSERT INTO `user` VALUES (11, '唐子骞', 62, 20720);
INSERT INTO `user` VALUES (12, '杜健雄', 2594, 3);
INSERT INTO `user` VALUES (13, '刘烨霖', 25, 120);
INSERT INTO `user` VALUES (14, '吕远航', 1, 59870);
SET FOREIGN_KEY_CHECKS = 1;
- 我们做一个类似积分系统,数据库包含用户名,上月积分和当前积分
创建一个springboot工程
- 依赖 springboot 2.7.7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<dependencies>
<!--fastjson序列化-->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.23</version>
</dependency>
<!--easyexcel操作excel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.0</version>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<!-- 接口文档 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 依赖 springboot 2.7.7
1 | spring: |
- 创建好操作数据的model、mapper、service
- 使用mybatis X插件创建
这里不赘述以上技术的玩法哈
二.简单的写
主要api: EasyExcel.write()
导入easyExcel和fastjson的依赖,上面的依赖中已有
定义excel的表头
- 我们在这里自己算出增长积分
- @ExcelProperty(“姓名”) 声明表头,在代码中变量不好取中文,就可以使用注解声明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package com.niuma.easyexceldemo.excel.model;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
* @author niumazlb
* @create 2023-01-19 20:35
*/
public class ExcelUserData {
private String name;
private Integer oldScore;
private Integer currentScore;
private Integer growScore;
}
编写测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class easyExcelTest {
UserService userService;
public static final String PATH = "D:\\code\\IDEA\\easyExcelDemo\\";
public static final String fileName = "testEasyExcelWrite.xlsx";
public static final String pathName = PATH + fileName;
public void testEasyExcelWrite() {
List<User> userList = userService.list();
List<ExcelUserData> excelDataList = userList.stream().map(user -> {
ExcelUserData excelData = new ExcelUserData();
excelData.setName(user.getName());
excelData.setOldScore(user.getOldScore());
excelData.setCurrentScore(user.getCurrentScore());
excelData.setGrowScore(user.getCurrentScore() - user.getOldScore());
return excelData;
}).sorted(Comparator.comparingInt(ExcelUserData::getGrowScore)).collect(Collectors.toList());
//参数声明路径名和表头
EasyExcel.write(pathName,ExcelData.class).sheet().doWrite(excelDataList);
}
}
- 其实就是调用
EasyExcel.write()
这个api,参数是路径名,表头- 链式调用
sheet()
,可以声明页信息,如页号,页名 dowrite()
,执行写操作,参数填入数据集
- 链式调用
- 校验结果
- 在对应的路径下就可以看到导出的excel表
三.简单的读
在导入依赖和定义了表头后开始读操作的编写测试
大概意思:服务端要接收到excel,我们需要知道
excel文件:通过网络或本地路径(对谁做?)
表头字段:转换成对象(什么样子?面向对象)
监听器:定义读取数据后的处理方式(做什么?)
- 定义Listeners监听器,注意这里处理数据的方法,防止OOM
- 实现ReadListener<DataType>接口,泛型自然就是表头的字段
- 实现2个主要方法
- invoke(ExcelUserData excelUserData, AnalysisContext analysisContext):每读到一条数据都会调用这个函数,可以在这里对数据的预处理,比如将读到的ExcelUserData转换成数据库的User
- doAfterAllAnalysed(AnalysisContext analysisContext):所有数据解析完成了 都会来调用 做收尾工作,确保最后遗留的数据也持久化(存储到数据库)
1 | package com.niuma.easyexceldemo.excel.listeners; |
- 测试
1 |
|
- 主要调用api:
EasyExcel.read()
参数就是前面我们需要知道的三个东西。链式调用sheet同写
- 检验结果
四.web接口调用
① 上传 excel 并解析
- 解析逻辑在 Listener 里,这里演示只做日志打印
1 |
|
② 下载文件
- 用swagger不好使,直接在浏览器输入地址就好了
- 这里应该将大段逻辑放到service中,只不过作演示方便
1 | /** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 coderbin!