springboot使用EasyExcel导出数据

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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/253181.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeciLM-7B:突破极限,高效率、高精准度的70亿参数AI模型

引言 在人工智能领域&#xff0c;语言模型的发展速度令人瞩目。Deci团队最近推出了一款具有革命性意义的语言模型——DeciLM-7B。这款模型在速度和精确度上都实现了显著的突破&#xff0c;以其70亿参数的规模&#xff0c;在语言模型的竞争中脱颖而出。 Huggingface模型下载&am…

Oracle EBS PAC“定期成本分配处理程序”报错:30004不存在为成本类型、成本组和法人主体定义的帐户

Oracle EBS版本&#xff1a; RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状&#xff1a; 中文环境&#xff1a; 30004不存在为成本类型、成本组和法人主体定义的帐户。 CSTPALPC.dyn_proc_call : Error Calling Package 30004不存在为成本类型、成本组和法人主…

牛客网 DP34 【模板】前缀和(优质解法)

代码&#xff1a; import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注…

【数据分享】2019-2023年我国区县逐年二手房房价数据(Excel/Shp格式)

房价是一个区域发展程度的重要体现&#xff0c;一个区域的房价越高通常代表这个区域越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01;之前我们分享了2019—2023年我国区县逐月的二手房房价数据…

【OpenGL/WebGL】Shader中如何获取摄像机视口的宽高

一、需求背景 在有些需求中&#xff0c;物体的大小是随着摄像机的视口的大小而变化的。如下图中&#xff0c;蓝色小方块&#xff0c;随着不断放大&#xff0c;其大小有个最大值&#xff0c;并不会无限放大。 这种实现的原理是在Shader中&#xff0c;不断根据摄像机近平面尺寸大…

实验记录:深度学习模型收敛速度慢有哪些原因

深度学习模型收敛速度慢有哪些原因&#xff1f; 学习率设置不当&#xff1a; 学习率是算法中一个重要的超参数&#xff0c;它控制模型参数在每次迭代中的更新幅度。如果学习率过大&#xff0c;可能会导致模型在训练过程中的振荡&#xff0c;进而影响到收敛速度&#xff1b;如果…

leetcode刷题日志-383赎金信

思路&#xff1a;分别用两个map记录ransomNote和magazine中的字符以及出现的次数。最后遍历记录ransomNote的map&#xff0c;如果ransomNote的map中出现的magazine的map中没有出现或者出现的次数小于ransomNote的map则返回false&#xff0c;否则返回true&#xff1b; class So…

ffmpeg6.0-ffplay.c源码分析(三)之read_thread和stream_component_open函数详细分析

文章目录 第一部分:for (;;) {}之前stream_component_open函数解析第二部分:for (;;) {}之内第三部分:for (;;) {}之后关注公众号看全文: 看名字就可以知道这是读数据的线程。在前面的文章中是不是一直没看到avformat_open_input、av_read_frame之类的函数,没错都在这个…

Element 介绍

Element 介绍 Vue 快速入门 Vue 常见组件 表格 分页组件 其他自己去看吧 链接: 其他组件

数据结构之<图>的介绍

图&#xff08;Graph&#xff09;的概念&#xff1a; 在数据结构中&#xff0c;图是由节点&#xff08;顶点&#xff09;和边组成的非线性数据结构。图用于表示不同对象之间的关系&#xff0c;其中节点表示对象&#xff0c;边表示对象之间的连接或关系。 1.图的基本组成元素&a…

小项目:迷宫二

目录 引言一、题目描述二、解题思路三、代码实现四、测试 引言 这个迷宫项目是今天参加学校的一个比赛出的题目&#xff0c;从早上九点基本搞到了四五点才完成&#xff0c;其实写出来发现基本思路其实挺简单的&#xff0c;就是想不好想&#xff0c;真的要各种的尝试&#xff0…

设计模式(2)--对象创建(5)--单件

1. 意图 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 2. 一种角色 单件(Singleton) 3. 优点 3.1 对唯一实例的受控访问 3.2 缩小名空间(对全局变量的改进) 3.3 允许对操作和表示精化(可以有子类) 3.4 允许可变数目的实例 3.5 比类操作更灵活 4. 缺点…

ReenterLock重入锁

synchronized就是一种最简单的控制方法&#xff0c;它决定了一个线程释放可以访问临界区资源。 同时&#xff0c;Object.wait()方法和Object.notify()方法起到了线程等待和通知的作用。 ReenterLock重入锁可以完全替代关键字Synchoronized.重入锁是Synchoronized、Object.wait(…

reactive数据不响应

我们知道&#xff0c;reactive函数用于创建对象等复杂数据的响应式代理对象&#xff0c;当该对象的属性发生变化时&#xff0c;会自动触发视图更新。 但在Vue 3中&#xff0c;当我们使用reactive创建的对象或数组进行赋值时&#xff0c;尽管能够完成正常的赋值操作&#xff0c…

RK3568平台(网络篇)添加网络交换芯片RTL8306M

一.硬件原理图 分析&#xff1a; 该交换芯片支持I2C、SPI、mdio通信&#xff0c;但是看ast1520的uboot代码采用的是mdio去通信phy芯片的&#xff0c;所以暂时也先采用mdio的方式&#xff0c;需要配置相应的引脚才可以配置成mdio通信模式&#xff0c;具体的配置硬件工程师解决。…

HarmonyOS开发实战:如何实现一个运动排名榜页面

HarmonyOS开发实战&#xff1a;如何实现一个运动排名榜页面 代码仓库&#xff1a; 运动排名榜页面 项目介绍 本项目使用声明式语法和组件化基础知识&#xff0c;搭建一个可刷新的排行榜页面。在排行榜页面中&#xff0c;使用循环渲染控制语法来实现列表数据渲染&#xff0c;…

linux添加环境变量

一、查看当前环境变量 echo $PATH 二、将工作空间添加到环境变量&#xff0c;vim是编辑器&#xff0c;可以换成别的编辑器&#xff0c;vim编辑器的使用法可以百度一下 vim ~/.bashrc编辑器添加&#xff1a; source ~/scan_ws/devel/setup.bash

os功能模板

【 一 】简介 os 就是 “operating system” 的缩写&#xff0c;顾名思义&#xff0c;os 模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用 os 模块&#xff0c;一方面可以方便地与操作系统进行交互&#xff0c;另一方面页可以极大增强代码的可移植性。如果该…

深入理解JVM虚拟机第三十二篇:详解JVM当中本地方法栈

😉😉 欢迎加入我们的学习交流群呀! ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring等等很多应用和源码级别的高质量视频和笔记资料,你想学的我们这里都有! 🥭🥭3:QQ群:583783824 📚📚 工作VX:BigTreeJava 拉你…

Python框架篇(5):FastApi-中间件使用

1.介绍 1.1 官网介绍 "中间件"是一个函数,它在每个请求被特定的路径操作处理之前,以及在每个响应返回之前工作. 它接收你的应用程序的每一个 请求. 然后它可以对这个 请求做一些事情或者执行任何需要的代码. 然后它将 请求传递给应用程序的其他部分 (通过某种 路径操…