JAVA读取excel文件_记easyexcel的使用

本文介绍了如何使用easyExcel库来读取Excel文件,通过创建监听器和实体类,简单几步即可实现高效便捷的读取操作。监听器的invoke方法会在读取每一行时被调用,doAfterAllAnalysed方法则在读取完成后执行。示例代码展示了具体的实现过程,证明easyExcel的易用性和实用性。

之前有同学来问Excel的读取导出,那会还不知道easyExcel这玩意.只是自己封装了POI的API整了个工具类.今天试了下easyExcel人门 demo,发现easyExcel不错,在此总结一下.pom依赖:

一,Excel文件读取:

<dependency>

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

    1,自己实现一个读取的监听器,实现抽象类AnalysisEventListener<T>,监听器不使用spring管理,而是每次new对象.

        a,监听器的invoke()方法每读取一行会调用一次;

        b,监听器的doAfterAllAnalysed()读取完后会调用,仅仅一次.

    2,一个实体类:与excel表每一列对应的实体类.

    监听器代码:(确保指定的文件有demo.xlsx文件)

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class DemoDataListener extends AnalysisEventListener<DemoData> {
    //每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
    private static final int BATCH_COUNT = 5;
    List<DemoData> list = new ArrayList<DemoData>();
    //假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。或者你其他功能的Service来处理读取的数据。
    private DemoDAO demoDAO;
    public DemoDataListener() {
        // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
        demoDAO = new DemoDAO();
    }
    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     */
    public DemoDataListener(DemoDAO demoDAO) {
        this.demoDAO = demoDAO;
    }
    //     * 这个每一条数据解析都会来调用
    @Override
    public void invoke(DemoData data, AnalysisContext context) {
        System.out.println("解析到一条数据:" + data.toString());
        list.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            System.out.println("分批存入数据:" + list.size());
            // 存储完成清理 list
            list.clear();
        }
    }
    // 所有数据解析完成了 都会来调用
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        System.out.println("所有数据解析完成后调用doAfterAllAnalysed:" + list.size());
    }
    // 假设业务就是存入数据库
    private void saveData() {
        demoDAO.save(list);
        System.out.println("存储数据库成功");
    }

    public static void main(String[] args) {
        String fileName = TestFileUtil.getPath() + "demo.xlsx";
         //如果报错.查看这个路径是否有文件,放一个上去
        System.out.println("在这个文件夹上放个demo.xlsx:" + fileName);
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
    }
    //为了方便运行,使用了内部类
    class DemoDAO {
        public void save(List<DemoData> list) {
            // 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchInsert,所有数据一次性插入
        }
    }
     public static String getPath() {
        return DemoDataListener.class.getResource("/").getPath();
    }
}

    实体类:

public class DemoData {

    //get  set 方法自己加上
    private String string;
    private Date date;
    private Double doubleData;
}

demo.xlsx

真心超简单,超好用.easy不是能随便叫的.(导出的后面发)

更多功能可以访问:https://www.yuque.com/easyexcel/doc/easyexcel

 

#欢迎关注-- ☆或许能帮你解决JAVA问题☆.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值