EasyExcel的基本使用

1,394 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

作者平台:

| CSDN:blog.csdn.net/qq\_4115394…

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

| 微信公众号:1024笔记

本文一共2149字,预计阅读7分钟

前言

在日常的开发过程中免不了需要使用到java对于excel进行一些基本的读写操作。最近在新开发一个项目的时候,使用到easyexcel,感觉非常好用,分享给大家。

什么是EasyExcel

Java解析、生成Excel最为常见的一些框架有Apache poi、jxl等。但是他们都存在耗内存的问题,一旦并发较大就一定会出现OOM或者JVM频繁的full gc。而EasyExcel重写了poi对07版Excel的解析,一个3M的excel如果使用POI进行解析需要100M左右内存,但是如果使用EasyExcel对其进行解析则对于内存的需求可以降低到只需要几兆,并且再大的excel也不会出现内存溢出的情况。

EasyExcel是阿里巴巴开源的一个基于Java的简单、省内存的读写Excel的excel解析工具,以使用简单、节省内存著称,它能够在尽可能节约内存的情况下支持读写较大的Excel文档。

EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

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

关于更多EasyExcel相关知识的官方手册地址如下:

alibaba-easyexcel.github.io/docs/curren…

如何使用EasyExcel

对于excel或者任何其他文档的基本操作无外乎写操作和读操作。先看看EasyExcel如何对excel进行写操作。

首先需要在项目中引入easyexcel相关的依赖:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>easyexcel</artifactId>
</dependency>

然后创建一个基本的entity实体类,作为基本的操作对象:

import com.alibaba.excel.annotation.ExcelProperty;
//设置表头和需要添加的数据字段
public class DemoData {
    //设置表头名称
    @ExcelProperty("编号")
    private int sno;
    //设置表头名称
    @ExcelProperty("姓名")
    private String sname;
    
    //get、set方法
    public int getSno() {
        return sno;
    }
    public void setSno(int sno) {
        this.sno = sno;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    
    @Override
    public String toString() {
        return "DemoData{" +
                "sno=" + sno +
                ", sname='" + sname + '\'' +
                '}';
    }
}

创建一个基本的方法,循环生成数据用于写入excel文件中:

//循环设置要添加的数据,最终封装到list集合中
private static List<DemoData> data() {
    List<DemoData> list = new ArrayList<DemoData>();
    for (int i = 0; i < 10; i++) {
        DemoData data = new DemoData();
        data.setSno(i);
        data.setSname("亚索"+i);
        list.add(data);
    }
    return list;
}

准备工作完成之后,那么接下来就是真正的如何使用easyexcel对数据进行写入操作了,这里的写操作主要有两种方法:

方法一:

public static void main(String[] args) throws Exception {
    // 写法1
    String fileName = "F:\\easyExcelDemo1.xlsx";
    // 这里需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
    // 如果这里想使用03 则传入excelType参数即可
    EasyExcel.write(fileName, DemoData.class).sheet("第一种写入方法").doWrite(data());
}

方法二:

public static void main(String[] args) throws Exception {
    // 写法2,这种方法需要自己手动关闭流
    String fileName = "F:\\easyExcelDemo2.xlsx";
    // 这里 需要指定写用哪个class去写
    ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
    WriteSheet writeSheet = EasyExcel.writerSheet("第二种写入方法").build();
    excelWriter.write(data(), writeSheet);
    /// 千万别忘记finish 会帮忙关闭流
    excelWriter.finish();
}

这里方法一和方法二的区别就是方法二需要自己手动关闭流。

读操作的基本操作如下:

首先需要创建一个读取操作的监听器:

//读取excel的监听器
public class ExcelListener extends AnalysisEventListener<ReadData> {
    //创建list集合用于封装最终的数据
    List<ReadData> list = new ArrayList<ReadData>();
    //一行一行读取excle内容
    //重写AnalysisEventListener的invoke方法
    @Override
    public void invoke(ReadData user, AnalysisContext analysisContext) {
        list.add(user);
    }
    //读取excel表头信息 重写AnalysisEventListener的invokeHeadMap方法
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头信息:"+headMap);
    }
    //读取操作完成后执行
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    }
}

调用方法实现最终的读取excel效果,这里的读取操作也有两种方法:

方法一:

String fileName = "F:\\01.xlsx";
EasyExcel.read(fileName, ReadData.class, new ExcelListener()).sheet().doRead();

这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭。

方法二:

        InputStream in = new BufferedInputStream(new FileInputStream("F:\\01.xlsx"));
        ExcelReader excelReader = EasyExcel.read(in, ReadData.class, new ExcelListener()).build();
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        excelReader.read(readSheet);
        excelReader.finish();
}

这里依旧需要手动关闭流,千万别忘记关闭,因为读的时候会创建临时文件,如果不关闭到时侯磁盘会崩的。

除了读写excel,还有如何对已有excel的数据进行填充,这里其实主要调用的也是easyexcel的write方法:

private static void main() {
        List list = new ArrayList();
        list.add(new DemoData("1", "亚索"));
        list.add(new DemoData("2", "李青"));
        list.add(new DemoData("3", "盖伦"));
        ExcelWriterBuilder writerBuilder = EasyExcel
                .write("F:\\01.xlsx", DemoData.class)
                .withTemplate("F:\\011.xlsx");
        WriteSheet writeSheet = writerBuilder.sheet().build();
        ExcelWriter excelWriter = writerBuilder.build();
        FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
        excelWriter.fill(list, fillConfig, writeSheet);
        Map map = new HashMap();
        map.put("total",50);
        excelWriter.fill(map, writeSheet);
        //调用finish方法
        excelWriter.finish();
    }

这里需要注意的是在填充玩多结果数据后,要强制换行,不然后续的单结果数据会发生覆盖现象,主要就是下述代码:

 FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();

总结

以上就是对于easyexcel对于excel的读写和填充操作的基本操作。使用easyexcel对excel进行操作简单,对于内存的使用较低。更多关于easyexcel的使用可以参考开发手册:

alibaba-easyexcel.github.io/docs/curren…

相关推荐

本文使用 文章同步助手 同步