EasyExcel 简单使用教程

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

前言

传统Excel操作或者解析都是利用Apach POI进行操作,但是使用过这个框架的人都知道,这个框架并不完美,有较多的缺陷:

  • 使用步骤繁琐
  • 动态写出Excel操作非常麻烦
  • 对于新手来说,很难在短时间内上手
  • 读写时需要占用较大的内容,当数据量大时容器发生OOM

基于上述原因,阿里开源出一款易上手,且比较节省内存的Excel操作框架:EasyExcel

官网链接:www.yuque.com/easyexcel

image-20210826172938877

对比

从上图可知:

  • 当利用POI去读取Excel时,首先会将数据全部加载到内存中,然后返回给调用者;当数据量比较大时,及其容易发生OOM

  • POI 不用的是,EasyExcel主要是采用sax模式一行一行解析,并将一行的解析结果以观察者的模式通知处理,即使数据量较大时也不会发生OOM

以下是EasyExcel读取数据原理图:

下面就来演示一下官网的例子,具体的可以去看官网,链接地址:www.yuque.com/easyexcel/d…

写excel

添加依赖包

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.2.6</version>
</dependency>
    
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>
复制代码

对象创建

package excel;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

import java.util.Date;

@Data
public class DemoData {
    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}
复制代码

测试代码

package excel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Test01 {

    private static List<DemoData> data() {
        List<DemoData> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setString("字符串" + i);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }

    public static void main(String[] args) {
        // 写法2
        String fileName = "D:\\code\\javaSE\\EasyTest.xlsx";
        // 这里 需要指定写用哪个class去写
        ExcelWriter excelWriter = null;
        try {
            excelWriter = EasyExcel.write(fileName, DemoData.class).build();
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
            excelWriter.write(data(), writeSheet);
        } finally {
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }

        }
    }
}
复制代码

运行程序,打开文件结果:

image-20210826180422035

读excel

对象创建

package excel;

import lombok.Data;

import java.util.Date;

@Data
public class DemoData02 {
    private String string;
    private Date date;
    private Double doubleData;
}
复制代码

测试代码

package excel;

import com.alibaba.excel.EasyExcel;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;

public class Test02 {

    public static void main(String[] args) throws FileNotFoundException {
        //同步读取文件内容
        FileInputStream inputStream = new FileInputStream(new File("D:\\code\\javaSE\\EasyTest.xlsx"));
        List<DemoData02> list = EasyExcel.read(inputStream).head(DemoData02.class).sheet().doReadSync();
        list.forEach(System.out::println);
    }
}
复制代码

输出结果:

DemoData02(string=字符串0, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串1, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串2, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串3, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串4, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串5, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串6, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串7, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串8, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
DemoData02(string=字符串9, date=Thu Aug 26 18:02:48 CST 2021, doubleData=0.56)
复制代码

总结

这里只是简单的介绍了一下EasyExcel 的基本使用,详细介绍可以去看官方文档。养成一个好的学习习惯,多看看官方的文档。关注我,一个专注分享Java知识的新时代农民工

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享