使用EasyExcel轻松在Java操作表格,不来看看?

230 阅读3分钟

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

一、Excel应用场景

1、数据导入:减轻录入工作量

2、数据导出:统计信息归档

3、数据传输:异构系统之间数据传输

二、EasyExcel简介

easyexcel 是一个 JAVA 解析 Excel 工具。Java 解析、生成 Excel 比较有名的框架有 Apache poi、jxl 。但他们都存在一个严重的问题就是非常的耗内存,poi 有一套 SAX 模式的 API 可以一定程度的解决一些内存溢出的问题,但 POI 还是有一些缺陷,比如 07 版 Excel 解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel 重写了 poi 对 07 版 Excel 的解析,能够原本一个 3M 的 excel 用 POI sax 依然需要 100M 左右内存降低到 KB 级别,并且再大的 excel 不会出现内存溢出,03 版依赖 POI 的 sax 模式。在上层做了模型转换的封装,让使用者更加简单方便。

EasyExcel特点

  • Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。

  • EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

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

三、具体使用

    //easyexcel依赖
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.1.1</version>
    </dependency>

实现easyExcel对Excel表格的写操作

1、创建实体类

设置表头和添加的数据字段

    //设置表头和添加的数据字段
    public class DemoData {
        //设置表头名称
        @ExcelProperty("学生编号")
        private int sno;
        //设置表头名称
        @ExcelProperty("学生姓名")
        private String sname;
        
        getter/setter/toString方法...
    }

2 、实现写操作

(1)创建方法循环设置要添加到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;
    }

(2)实现最终的添加操作

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

实现EasyExcel对Excel读操作

1、创建实体类

public class ReadData {

    //设置列对应的属性
    @ExcelProperty(index = 0)
    private int sid;
    //设置列对应的属性
    @ExcelProperty(index = 1)
    private String sname;
    
    getter/setter/toString方法...
}

2、创建读取操作的监听器

public class ExcelListener extends AnalysisEventListener<ReadData> {

    //创建list集合封装最终的数据
    List<ReadData> list = new ArrayList<ReadData>();
    //一行一行去读取excle内容
    @Override
    public void invoke(ReadData user, AnalysisContext analysisContext) {
        System.out.println("***"+user);
        list.add(user);
    }

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

    //读取完成后执行
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    System.out.println("读取完毕...");
    }
}

3、调用实现最终的读取

   public static void main(String[] args) throws Exception {
        String fileName = "F:\01.xlsx";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭

        EasyExcel.read(fileName, ReadData.class, new ExcelListener()).sheet().doRead();

至此结束!希望本文能帮到你。