java中使用EasyExcel实现读写操作


前言

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

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

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


一、EasyExcel是什么?

EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百 M 的 Excel

easyExcel的GitHub地址:https://alibaba-easyexcel.github.io/index.html

二、使用步骤

1.创建一个java项目,引入依赖

 <!-- easyexcel 依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>

2.写操作

首先需要创建一个实体类

//设置表头和添加的数据字段
@Data
public class DemoData {
    //设置表头名称,index为读操作时列的索引,从0开始
    @ExcelProperty(value = "学生编号",index = 0)
    private Integer sno;

    //设置表头名称
    @ExcelProperty(value = "学生姓名",index = 1)
    private String sname;
}

进行写操作:

public static void main(String[] args) {
        //实现写操作
        //1.设置写入文件夹地址和excel文件名称
        String filename = "D:\\write.xlsx";

        //2.调用easyexcel里的方法实现写操作
        //write方法的两个参数:第一个参数是:文件路径,第二个参数是:实体类的class
        EasyExcel.write(filename,DemoData.class).sheet("数据列表").doWrite(TestEasyExcel.getData());
    }

    //创建方法返回list集合
    public static List<DemoData> getData(){
        List<DemoData> list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            DemoData demoData = new DemoData();
            demoData.setSno(i);
            demoData.setSname("测试"+i);
            list.add(demoData);
        }
        return list;
    }

3.写操作

创建实体类,使用index属性标记对应列的关系

//设置表头和添加的数据字段
@Data
public class DemoData {
    //设置表头名称,index为读操作时列的索引,从0开始
    @ExcelProperty(value = "学生编号",index = 0)
    private Integer sno;

    //设置表头名称
    @ExcelProperty(value = "学生姓名",index = 1)
    private String sname;
}

创建一个监听器,完成对每一行的读操作:

public class ExcelListener extends AnalysisEventListener<DemoData> {

    /*一行一行的读取excel 中的内容,从第二行读取*/
    @Override
    public void invoke(DemoData demoData, AnalysisContext analysisContext) {
        System.out.println("每一行的内容"+demoData);
    }

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

    /*读取完成之后执行的方法*/
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

使用EasyExcel进行读取


public class TestEasyExcel {
    public static void main(String[] args) {
        //1.设置写入文件夹地址和excel文件名称
        String filename = "D:\\write.xlsx";

        //2.实现读操作
        //read方法的第一个参数时:读取的文件路径,第二个参数是:实体类的class,第三个参数是:监听器
        EasyExcel.read(filename,DemoData.class,new ExcelListener()).sheet().doRead();
    }

运行结果

表头的内容为{0=学生编号, 1=学生姓名}
每一行的内容DemoData(sno=0, sname=lucc0)
每一行的内容DemoData(sno=1, sname=lucc1)
每一行的内容DemoData(sno=2, sname=lucc2)
每一行的内容DemoData(sno=3, sname=lucc3)
每一行的内容DemoData(sno=4, sname=lucc4)
每一行的内容DemoData(sno=5, sname=lucc5)
每一行的内容DemoData(sno=6, sname=lucc6)
每一行的内容DemoData(sno=7, sname=lucc7)
每一行的内容DemoData(sno=8, sname=lucc8)
每一行的内容DemoData(sno=9, sname=lucc9)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐