欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EasyExcel读取文件-同步处理数据

程序员文章站 2023-11-10 22:13:10
读取代码 解析对象 Listener ......

读取代码

// 前端传过来的文件
multipartfile file;
inputstream inputstream = file.getinputstream();
// 读取excel数据,边读取边处理;
easyexcel.read(inputstream, importskuidlist.class, new skuidexcelistener(sendcouponcusrecordservice)).sheet().doread();

解析对象

public class importskuidlist{
    @excelproperty(index = 0)
    /** 商品编号*/
    private long skuid;
    // 省略get set
    ....
}

listener

public class skuidexcelistener extends analysiseventlistener<importskuidlist> {
    private static final logger logger = loggerfactory.getlogger(skuidexcelistener.class);
    // spring的方式需要通过构造函数传进来
    private sendcouponcusrecordservice sendcouponcusrecordservice;
    /**
     * 每隔100条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int batch_count = 100;
    private volatile int totalcount = 0;
    list<importskuidlist> list = new arraylist<>();
    /**
     * 如果使用了spring,请使用这个构造方法。每次创建listener的时候需要把spring管理的类传进来
     *
     */
    public skuidexcelistener(sendcouponcusrecordservice sendcouponcusrecordservice) {
        this.sendcouponcusrecordservice = sendcouponcusrecordservice;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     *            one row value. is is same as {@link analysiscontext#readrowholder()}
     * @param context
     */
    @override
    public void invoke(importskuidlist data, analysiscontext context) {
        totalcount ++;
        list.add(data);
        // 达到batch_count了,需要去存储一次数据库,防止数据几万条数据在内存,容易oom
        if (list.size() >= batch_count) {
            dealdata(context);
            // 存储完成清理 list
            list.clear();
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     * @param context
     */
    @override
    public void doafterallanalysed(analysiscontext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        dealdata(context);
        logger.info("所有数据解析完成!");
    }

    /**
     * 加上存储数据库
     */
    private void dealdata(analysiscontext context) {
        logger.info("当前正在处理第[{}]行数据,本次处理[{}]条数据,总共有:{}条数据",context.readrowholder().getrowindex(),list.size(),totalcount);
        // 实际处理逻辑
        sendcouponcusrecordservice.dealuploaddata(list);
    }
}