EasyExcel简单实例(未完待续)

EasyExcel简单实例

准备工作

导入easyExcel依赖,注意版本:

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

场景一:读取 Student 表

需求1:简单读取

源表:

1. 编写实体类

可以使用 @ExcelProperty 指定数据封装为实体类对象的规则,后面可以跟index 和 列名(二选一);

若不加注解则按照默认封装规则: ①根据 Excel 列与实体类属性的顺序②根据 Excel 列的单元格式与对象字段类型匹配。

java 复制代码
@Data
public class Student {
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年级")
    private String grade;
    @ExcelProperty("年龄")
    private int age;
}

2. 监听器
invoke():每读取一行就执行的方法,每一行数据会被封装成一个 student 对象(invoke方法的第一个参数);
doAfterAllAnalysed():读取结束后执行的方法;

java 复制代码
class studentListener implements ReadListener<Student> {
    int i=1;

    @Override
    public void invoke(Student student, AnalysisContext context) {
        System.out.println("读取到第 "+(i++)+" 行:"+student);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("\nxlsx文件读取结束");
    }
}

3. 测试类
read():读取workbook工作簿,传入文件路径、实体类、监听器;
sheet():选定读取的工作表,默认读取第一个;
doRead():执行读操作;

java 复制代码
public class easyExcelTest {
    @Test
    public void readTest() {
        String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";
        EasyExcel.read(filePath,
                        Student.class,
                        new studentListener()).
                sheet().
                doRead();
    }
}

打印效果:

需求2:读取到异常信息时不中断

源表:

当出现了不符合数据类型的数据时,希望不中断读取

1. 实体类:

不变;
2. 监听器:

只需要调整监听器,在监听器加入 onException()方法;

java 复制代码
class studentListener implements ReadListener<Student> {
    int i = 1;

    @Override
    public void invoke(Student student, AnalysisContext context) {
        System.out.println("读取到第 " + (i++) + " 行:" + student);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("\nxlsx文件读取结束");
    }

    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        System.out.println("读取异常:"+exception);
    }
}

3. 测试类:

不变;

打印效果:

异常数据被打印,且不中断读取;

需求3:读取所有的sheet工作表

源表:

此时多个sheet都有数据;

1. 实体类

不变;
2. 监听器

不变;
3. 测试类

将sheet().doRead改为 doReadAll()

java 复制代码
public class easyExcelTest {
    @Test
    public void readTest() {
        String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";
        EasyExcel.read(filePath,
                        Student.class,
                        new studentListener()).
                doReadAll();
    }
}

效果:

读取到了两个sheet的数据:

需求4:读取指定的sheet工作表

源表:

此时多个sheet都有数据;

1. 实体类

不变;
2. 监听器

不变;
3. 测试类

在sheet()中传递指定sheet的index索引或者名称即可:

java 复制代码
public class easyExcelTest {
    @Test
    public void readTest() {
        String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";
        EasyExcel.read(filePath,
                        Student.class,
                        new studentListener()).
                sheet("Sheet2").
                doRead();

        EasyExcel.read(filePath,
                        Student.class,
                        new studentListener()).
                sheet("Sheet1").
                doRead();
    }
}

效果:

此时先指定读取sheet2,再读取sheet1;

需求5:从指定的行开始读取

源表:

假设此时有多行表头,内容需要从第3行开始读取;

1. 实体类

不变;
2. 监听器

不变;
3. 测试类

使用 headRowNumber(),参数中填写开始读取的行数;(默认从第2行开始读取,即headRowNumber()默认参数是索引1);

此时读取的内容要从第3行开始,索引为2,所以填入headRowNumber()的参数为2!

java 复制代码
public class easyExcelTest {
    @Test
    public void readTest() {
        String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";
        EasyExcel.read(filePath,
                        Student.class,
                        new studentListener()).
                sheet("Sheet1").
                headRowNumber(2).
                doRead();
    }
}

效果:

场景二:写入 Student 表

需求1:简单写入

1. 实体类

需要比读取excel多添加实体类的构造函数;

java 复制代码
@Data
public class Student {
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年级")
    private String grade;
    @ExcelProperty("年龄")
    private int age;
    
    public Student(){}

    public Student(String name, String grade, int age) {
        this.name = name;
        this.grade = grade;
        this.age = age;
    }
}

2. 模拟建数据的类

将每一行数据封装为Student对象,并放入一个List集合中;

java 复制代码
class CreateData{
    public static List<Student> create(){
        List<Student> datas = Arrays.asList(
                new Student("张三","一年级",23),
                new Student("里斯","一年级",19),
                new Student("王五","一年级",22),
                new Student("赵六","一年级",21)
        );
        return datas;
    }
}

3. 测试类

写的时候会自动将实体类的属性作为excel表的表头;

sheet()的参数为写入的工作表;

doWrite()的参数为要写入的数据,要求格式为Collection集合类型;

  • 写法1
java 复制代码
public class easyExcelTest {
    @Test
    public void writeTest() {
        String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";
        EasyExcel.write(filePath,
                        Student.class).
                sheet("学生表1").
                doWrite(CreateData.create()); // doWrite()的参数为 Collection 集合
    }
  • 写法2:
    适合写多个sheet;
java 复制代码
public class easyExcelTest {
    @Test
    public void writeTest() {
        String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";
        try(ExcelWriter excelWriter=EasyExcel.write(filePath,Student.class).build()){
            WriteSheet writeSheet=EasyExcel.writerSheet("学生表2").build();
            excelWriter.write(CreateData.create(),writeSheet);
        }
    }

效果:

成功生成指定sheet表的数据!

需求2:写入时不写某列

1. 实体类

不写哪列就在对应的属性加上 @ExcelIgnore 属性;

2. 模拟建数据的类

不变;
3. 测试类

不变;
效果:

年龄一列没有写入excel;

相关推荐
wyhwust11 分钟前
idea出现tomcat不能正确部署的问题--解决方案
java·ide·intellij-idea
航Hang*21 分钟前
C PRIMER PLUS——第6-2节:二维数组与多维数组
c语言·开发语言·经验分享·程序人生·算法·学习方法·visual studio
带刺的坐椅24 分钟前
FastMCP(python)和 SolonMCP(java)的体验比较(不能说一样,但真的很像)
java·python·solon·mcp·fastmcp
易只轻松熊36 分钟前
C++(1):整数常量
开发语言·c++
一勺菠萝丶41 分钟前
深入浅出:Spring Boot 中 RestTemplate 的完整使用指南
java·spring boot·后端
努力的搬砖人.44 分钟前
Java 线程池原理
java·开发语言
Dovis(誓平步青云)1 小时前
精讲C++四大核心特性:内联函数加速原理、auto智能推导、范围for循环与空指针进阶
c语言·开发语言·c++·笔记·算法·学习方法
passionSnail1 小时前
《用MATLAB玩转游戏开发》Flappy Bird:小鸟飞行大战MATLAB趣味实现
开发语言·matlab
jz_ddk1 小时前
[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
c语言·开发语言·学习
stevenzqzq1 小时前
kotlin flow防抖
开发语言·kotlin·flow