[alibaba/easyexcel]导入的代码业务逻辑都在Listener中实现的,如果想返回成功多少失败多少条,应该怎么返回?

2024-05-24 516 views
4

异常代码

   这里写你的代码

异常提示 请提供完整的异常提示,记住是全部异常! 建议描述

回答

9

以下代码来自官方教程修改:

DemoDataListener.java


// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class DemoDataListener extends AnalysisEventListener<Data> {
    private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    private List<Data> list = new ArrayList<>();
    private int successCount = 0;
    private int errorCount = 0;

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(Data data, AnalysisContext context) {
        //这里的是否成功判断条件取决于业务逻辑
        if (data.getActive()) {
            successCount++;
            list.add(data);
        } else {
            errorCount++;
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        LOGGER.info("所有数据解析完成!");
    }

    public List<Data> getList() {
        return list;
    }

    public void setList(List<Data> list) {
        this.list = list;
    }

    public int getSuccessCount() {
        return successCount;
    }

    public void setSuccessCount(int successCount) {
        this.successCount = successCount;
    }

    public int getErrorCount() {
        return errorCount;
    }

    public void setErrorCount(int errorCount) {
        this.errorCount = errorCount;
    }
}

业务逻辑部分

    /**
     * 最简单的读
     * <p>1. 创建excel对应的实体对象 参照{@link Data}
     * <p>2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
     * <p>3. 直接读即可
     */
    @Test
    public void simpleRead() {
        // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
        // 写法1:
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        final DemoDataListener readListener = new DemoDataListener();
        EasyExcel.read(fileName, Data.class, readListener).sheet().doRead();
        log.info("successCount={}", readListener.getSuccessCount());
        log.info("errorCount={}", readListener.getErrorCount());
        log.info("list={}", readListener.getList());

        // 写法2:
        final DemoDataListener readListener2 = new DemoDataListener();
        ExcelReader excelReader = EasyExcel.read(fileName, Data.class, readListener2).build();
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        excelReader.read(readSheet);
        // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
        excelReader.finish();
        log.info("successCount={}", readListener2.getSuccessCount());
        log.info("errorCount={}", readListener2.getErrorCount());
        log.info("list={}", readListener2.getList());
    }

官方提供了两种写法,取其中一种即可

1

Listener可以实例化,其中定义几个属性值,分别存放文件读取过程中的信息,文件读完后可以通过实例化的Listener拿到文件读取过程中的所有信息

8

楼上写的恒详细了。感谢。