Spring Boot整合EasyExcel

文章目录

EasyExcel简介

1、EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百 M 的 Excel(没有一次性将数据读取到内存中,从磁盘中一行行读取,从而节约内存)。

2、EasyExcel 采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理。EasyExcel官网

Spring Boot整合EasyExcel

1、引入依赖:

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.2.0</version>
</dependency>

2、添加 excel 对应的实体类信息:

java 复制代码
@Data
public class User {
    @ExcelProperty("姓名")
    private String userName;
    @ExcelProperty("邮箱")
    private String email;
    @ExcelProperty("年龄")
    private Integer age;
}

@ExcelProperty 用于定义 excel 表中列的列名(表头)

一、单sheet写操作
java 复制代码
@SpringBootTest
class ApplicationTests {

    @Test
    void testWrite() {
        // 文件保存的位置
        String fileName = "G:/test/test.xlsx";
        EasyExcel.write(fileName, User.class).sheet("用户表").doWrite(list());
    }

    // 简单造写数据,用于测试
    public List<User> list() {
        List<User> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setUserName("tom" + i);
            user.setAge((int)(Math.random() * 20));
            user.setEmail(user.getUserName() + "@163.com");
            list.add(user);
        }
        return list;
    }
}
二、多sheet写数据

写入不同的 sheet,因此需要用到更灵活的方式,通过创建 ExcelWriter 来实现。这种方法可以控制每个 sheet 的名称、索引和数据来源。

适用场景:复杂、多 sheet 写入或分页写入。

java 复制代码
//假设这个map里面有数
Map<Integer, Page<Salaries>> map = new HashMap<>();

//1.获取ExcelWriter实例
try (ExcelWriter excelWriter = EasyExcel.write(文件输出流, Salaries.class).build()) {
            //遍历Map:转为Set集合
            for (Map.Entry<Integer, Page<Salaries>> setMap : map.entrySet()) {
                Integer key = setMap.getKey();
                Page<Salaries> salariesPage = entry.getValue();
                /* 2.获取WriteSheet的实例,每个 writeSheet 表示一个单独的工作表
                两个参数:第一个是sheet的索引,第二个是sheet的名字
                */
                WriteSheet writeSheet = EasyExcel.writerSheet(key, "模板" + key).build();
                /* 开始写
                两个参数:数据、WriteSheet对象
                */
                excelWriter.write(salariesPage.getRecords(), writeSheet);
            }
} catch (IOException e) {
    e.printStackTrace();
}

try 语句中创建 ExcelWriter,确保在完成写操作后自动关闭 ExcelWriter 资源,避免资源泄漏。

① 为什么后面有 build() ?

build() 方法在 EasyExcel 中的作用是构建一个 ExcelWriterWriteSheet 实例。

  • 构建了一个 ExcelWriter 对象,允许我们自定义写入流程(如多个 sheet 的写入、批量写入等)
  • 构建了一个 WriteSheet 对象,指定 sheet 的索引和名称等,用于在指定的 sheet 上进行写操作。

② 不调 build() ?

build() 是必需的,因为 EasyExcel 使用建造者模式。

三、读操作

基本与 写操作 类似,但是需要定义一个监听器(继承 AnalysisEventListener 抽象类),用于监听操作。

监听器:监听 excel 读取操作。(这里例子没有将监听器交给 Spring 管理)

java 复制代码
 /**
 * 定义一个数据监听器,继承 AnalysisEventListener 抽象类。
 */

public class DataListener extends AnalysisEventListener<User> {
    
    // 一行行读取表格内容
    @Override
    public void invoke(User user, AnalysisContext analysisContext) {
        System.out.println("===============" + user);
    }

    // 读取表头内容
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("======表头内容========" + headMap);
    }

    // 读取完成后的操作
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("========读取完成========");
    }
}
java 复制代码
//测试

@SpringBootTest
class TestEasyexcelApplicationTests {

    @Test
    void testRead() {
        // 读取文件的位置
        String fileName = "G:/test/test.xlsx";
        EasyExcel.read(fileName, User.class, new DataListener()).sheet().doRead();
    }
}
相关推荐
databook12 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室13 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三14 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试
考虑考虑17 小时前
Jpa使用union all
java·spring boot·后端
用户25191624271118 小时前
Python之语言特点
python
刘立军18 小时前
使用pyHugeGraph查询HugeGraph图数据
python·graphql
数据智能老司机21 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
c8i1 天前
django中的FBV 和 CBV
python·django
c8i1 天前
python中的闭包和装饰器
python