简介:本文主要描述使用EasyExcel导出数据的简单流程,事实上企业需求一般都比较简单,就是表单数据输出到Excel即可,如果数据量大的话,为了避免占用内存过高或者OOM,使用多次读数据多次写入的方法,下面就简单介绍下两种情景的实现。
<!-- Easy Excel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.1</version>
</dependency>
例如我要导出的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;
}
假如流程为 前端发送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(); // 从数据库获取数据的dao
EasyExcel.write(fileName, UserInfoForExcel.class)
.sheet("模板")
.doWrite(userInfoData.getUserInfoList()); // 写Excel
return 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;
}
}
@RestController
@RequestMapping("userinfo")
public class UserInfoController {
@Autowired
UserService userService;
@GetMapping("output")
public String handleExcelOutput() throws ParseException {
String s = userService.handleExcelOutput();
return s;
}
}
在设定的文件路径中可以看到生成的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;
}
以上就是全文内容,最后还是提醒,这只是最简单的需求和实现方法,事实上EasyExcel还能实现其他有趣的功能,建议去官网看文档
官网地址:https://easyexcel.opensource.alibaba.com/