Easyexcel简介及写、读操作

一、背景

作为一个经常进行数据分析的后端人员,免不了面对各种报表,且在日常的工作中,经常需要处理大量的数据,并进行各种复杂的计算和分析。而Excel作为一个重要的工具,在数据处理与分析上也起到了至关重要的作用。但是,Excel的操作繁琐、效率低下等问题也制约着我们的工作效率。为了解决这个问题,我们可以使用EasyExcel这个优秀的Java类库,来优化Excel数据的读写,并提高我们的工作效率。

二、简介

  • Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
  • EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
  • EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)

官方网站: https://easyexcel.opensource.alibaba.com
github地址: https://github.com/alibaba/easyexcel
gitee地址: https://gitee.com/easyexcel/easyexcel

三、引入依赖

<!-- xls格式excel依赖包 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
<!--xlsx格式excel依赖包-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>
<!-- easyexcel依赖包 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.1</version>
</dependency>

四、代码实现

1.创建实体类

这个实体类的属性内容要与excel的表头字段进行绑定,可以在属性上添加@ExcelProperty指定相应的表头的内容。

public class UserData {
    @ExcelProperty("用户id")
    private Integer uid;
    @ExcelProperty("用户名")
    private String userName;
    @ExcelProperty("性别")
    private String sex;
    @ExcelProperty("年龄")
    private Integer age;

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

2.写入excel操作

public class ExcelWriteDemo {
    public static void main(String[] args) {
        List<UserData> list = new ArrayList<>();
        for(int i = 0;i<100;i++){
            UserData userData = new UserData();
            userData.setUid(i);
            userData.setUserName("excelwriteTest"+i);
            userData.setSex("男");
            userData.setAge(20+i);
            list.add(userData);
        }

        String fileName = "D:\\excelTest\\20230729.xls";
        EasyExcel.write(fileName,UserData.class).sheet("用户信息").doWrite(list);
    }

}

执行后文件如下:

11:58:22.004 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Begin to Initialization 'WriteContextImpl'
11:58:22.037 [main] DEBUG com.alibaba.excel.metadata.property.ExcelHeadProperty - The initialization sheet/table 'ExcelHeadProperty' is complete , head kind is CLASS
11:58:22.113 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - CurrentConfiguration is writeWorkbookHolder
11:58:22.433 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Initialization 'WriteContextImpl' complete
11:58:22.434 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Sheet number is null
11:58:22.435 [main] DEBUG com.alibaba.excel.metadata.property.ExcelHeadProperty - The initialization sheet/table 'ExcelHeadProperty' is complete , head kind is CLASS
11:58:22.435 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - CurrentConfiguration is writeSheetHolder
11:58:22.436 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Can not find sheet:0 ,now create it
11:58:22.854 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Finished write.

在这里插入图片描述

3.读取文件操作

3.1 指定excel对应索引

对于excel的读操作,需要修改下注解,指定该属性对应在excel中的哪一列的索引。

public class UserData {
    @ExcelProperty(value = "用户id",index = 0)
    private Integer uid;
    @ExcelProperty(value = "用户名",index = 1)
    private String userName;
    @ExcelProperty(value = "性别",index = 2)
    private String sex;
    @ExcelProperty(value = "年龄",index = 3)
    private Integer age;

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

3.2 设置监听器

读操作需要设置一个监听器,目的就是能够一行一行的去读取文件中的数据。

public class ExcelLisenner extends AnalysisEventListener<UserData> {
    // 一行一行的读取内容,从第二行开始
    @Override
    public void invoke(UserData userData, AnalysisContext analysisContext) {
        System.out.println(userData.toString());
        System.out.println("读取一行,执行操作");
    }


    // 读取之后执行的操作
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("读取之后执行的操作");
    }

    // 读取第一行表头信息
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头信息:" + headMap);
    }
}

3.3 执行读取操作

public class ExcelReadDemo {
    public static void main(String[] args) {
        String fileName = "D:\\excelTest\\20230729.xls";
        EasyExcel.read(fileName,UserData.class,new ExcelLisenner()).sheet().doRead();
    }
}

执行结果如下:

表头信息:{0=用户id, 1=用户名, 2=性别, 3=年龄}
UserData{uid=0, userName='excelwriteTest0', sex='男', age=20}
读取一行,执行操作
UserData{uid=1, userName='excelwriteTest1', sex='男', age=21}
读取一行,执行操作
UserData{uid=2, userName='excelwriteTest2', sex='男', age=22}
读取一行,执行操作
UserData{uid=3, userName='excelwriteTest3', sex='男', age=23}
读取一行,执行操作
UserData{uid=4, userName='excelwriteTest4', sex='男', age=24}
读取一行,执行操作
UserData{uid=5, userName='excelwriteTest5', sex='男', age=25}
读取一行,执行操作
UserData{uid=6, userName='excelwriteTest6', sex='男', age=26}
读取一行,执行操作
UserData{uid=7, userName='excelwriteTest7', sex='男', age=27}
读取一行,执行操作
UserData{uid=8, userName='excelwriteTest8', sex='男', age=28}
读取一行,执行操作
UserData{uid=9, userName='excelwriteTest9', sex='男', age=29}
读取一行,执行操作
UserData{uid=10, userName='excelwriteTest10', sex='男', age=30}
读取一行,执行操作
UserData{uid=11, userName='excelwriteTest11', sex='男', age=31}
读取一行,执行操作
UserData{uid=12, userName='excelwriteTest12', sex='男', age=32}
读取一行,执行操作
UserData{uid=13, userName='excelwriteTest13', sex='男', age=33}
读取一行,执行操作
UserData{uid=14, userName='excelwriteTest14', sex='男', age=34}
读取一行,执行操作
UserData{uid=15, userName='excelwriteTest15', sex='男', age=35}
读取一行,执行操作
UserData{uid=16, userName='excelwriteTest16', sex='男', age=36}
读取一行,执行操作
UserData{uid=17, userName='excelwriteTest17', sex='男', age=37}
读取一行,执行操作
UserData{uid=18, userName='excelwriteTest18', sex='男', age=38}
读取一行,执行操作
UserData{uid=19, userName='excelwriteTest19', sex='男', age=39}
读取一行,执行操作
UserData{uid=20, userName='excelwriteTest20', sex='男', age=40}
读取一行,执行操作

读取之后执行的操作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初夏0811

你的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值