springboot使用EasyExcel导出数据
简介:本文主要描述使用EasyExcel导出数据的简单流程,事实上企业需求一般都比较简单,就是表单数据输出到Excel即可,如果数据量大的话,为了避免占用内存过高或者OOM,使用多次读数据多次写入的方法,下面就简单介绍下两种情景的实现。
1. 导入依赖
<!-- Easy Excel -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version>
</dependency>
2. 建立对应实体类
例如我要导出的Excel数据格式为
首先创建实体类:
@Getter
@Setter
@ToString
public class UserInfoForExcel {@ExcelProperty("ID") // 标注字段对应Excel列行头private String userId;@ExcelProperty("账号")private String account;@ExcelProperty("邮箱")private String email;@ExcelProperty("昵称")private String nickname;@ExcelProperty("年龄")private Integer age;@ExcelProperty("生日")@DateTimeFormat("yyyy-MM-dd")private Date birthday;
}
3. 创建处理方法
假如流程为 前端发送get请求,后端controller接收提交给service处理,service从dao中获取数据后生成excel表,然后将excel的路径返回给前端(一般需求肯定是URL或者URI,此处只做演示,不做URL处理,直接返回路径)
service处理方法代码如下
/*** 从数据库读取所有数据,使用EasyExcel生成表格* @return*/public String handleExcelOutput() {String fileName = "D://data/" + "user_info_" + System.currentTimeMillis() + ".xlsx";UserInfoData userInfoData = new UserInfoData(); // 从数据库获取数据的daoEasyExcel.write(fileName, UserInfoForExcel.class).sheet("模板").doWrite(userInfoData.getUserInfoList()); // 写Excelreturn fileName;}
下面是模拟数据库获取数据操作,可以忽略
@Getter
@Setter
@ToString
public class UserInfoData {/*** 模拟数据库获取数据*/public List<UserInfoForExcel> getUserInfoList() {List<UserInfoForExcel> list = new ArrayList<>();for (int i = 1; i < 18; i++){UserInfoForExcel userInfoForExcel = new UserInfoForExcel();userInfoForExcel.setUserId("00"+i);userInfoForExcel.setAge(16+i);userInfoForExcel.setAccount("account"+i);userInfoForExcel.setNickname("nick "+ i);userInfoForExcel.setEmail("123"+i+"@123.com");try {userInfoForExcel.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1997-06-1"+i));} catch (ParseException e) {// 测试demo,不做处理throw new RuntimeException(e);}list.add(userInfoForExcel);}System.out.println(list);return list;}
}
4. 测试接口
@RestController
@RequestMapping("userinfo")
public class UserInfoController {@AutowiredUserService userService;@GetMapping("output")public String handleExcelOutput() throws ParseException {String s = userService.handleExcelOutput();return s;}
}
5. 测试结果
在设定的文件路径中可以看到生成的Excel表
6. 分批写到Excel
上面的例子是将数据一次性读取后写到excel,占用内存过大,可以分多次写入,service方法如下
/*** 从数据库分页读取数据,使用EasyExcel,分多次写入Excel* @return*/public String handleExcelOutputOnPage() {String fileName = "D://data/" + "user_info_" + System.currentTimeMillis() + ".xlsx";UserInfoData userInfoData = new UserInfoData(); // 从数据库获取数据的dao// 这里 需要指定写用哪个class去写try (ExcelWriter excelWriter = EasyExcel.write(fileName, UserInfoForExcel.class).build()) {WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来// 例如数据库中数据位1000条,每次写入100条,则i为Math.ceil(1000/100),向上取整for (int i = 0; i < 5; i++) {// 分页去数据库查询数据 这里可以去数据库查询每一页的数据// 通过设置limit值获取不同页数据List<UserInfoForExcel> userInfoList = userInfoData.getUserInfoList();excelWriter.write(userInfoList, writeSheet);}}return fileName;}
7. 最后
以上就是全文内容,最后还是提醒,这只是最简单的需求和实现方法,事实上EasyExcel还能实现其他有趣的功能,建议去官网看文档
官网地址:https://easyexcel.opensource.alibaba.com/