springboot使用EasyExcel导出数据

2023-12-14 22:43:42

springboot使用EasyExcel导出数据

简介:本文主要描述使用EasyExcel导出数据的简单流程,事实上企业需求一般都比较简单,就是表单数据输出到Excel即可,如果数据量大的话,为了避免占用内存过高或者OOM,使用多次读数据多次写入的方法,下面就简单介绍下两种情景的实现。

1. 导入依赖

<!-- Easy Excel -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.2.1</version>
</dependency>

2. 建立对应实体类

例如我要导出的Excel数据格式为

image-20231214213222344.png
首先创建实体类:

@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();     // 从数据库获取数据的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;
    }
}

4. 测试接口

@RestController
@RequestMapping("userinfo")
public class UserInfoController {

    @Autowired
    UserService userService;

    @GetMapping("output")
    public String handleExcelOutput() throws ParseException {
        String s = userService.handleExcelOutput();
        return s;
    }
}

5. 测试结果

在设定的文件路径中可以看到生成的Excel表

image-20231214214943113.png

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/

文章来源:https://blog.csdn.net/weixin_42510217/article/details/135005555
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。