美文网首页
如何优雅的使用easy excel

如何优雅的使用easy excel

作者: 王小胖v9 | 来源:发表于2020-08-04 17:28 被阅读0次

    一、easy excel git地址:https://github.com/alibaba/easyexcel

    二、代码

    问题痛点:一般都过easy excel 实现导入功能,不同的业务需要写不同的listener,这显然不够优雅,那么就让我们讨论下如何优雅的使用easy excel吧,优雅永不过时!

    1、首先引入easy excel pom配置

    <!--easy excel start-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>2.2.6</version>
            </dependency>
    <!--easy excel end-->
    

    2、定义自己的function函数(不定义的话,可以使用java8 的consumer函数,但由于我们导入一般为list,使用consumer使用起来不够优雅)

    /**
     * @author :Nickels
     * @date :2020/7/27
     * @desc :
     */
    @FunctionalInterface
    public interface ExcelConsumer<E> {
    
        void excute(List<E> e);
    }
    

    3、编写listener
    ①listener基本根据git官网照抄的,唯一不同的是我们是以我们自定义的function作为一个变量

    /**
     * @author :Nickels
     * @date :2020/7/27
     * @desc :
     */
    // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
    public class ExcelListener<T> extends AnalysisEventListener<T> {
    
        /**
         * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
         */
        private static final int BATCH_COUNT = 1000;
        List<T> list = new ArrayList<T>();
        /**
         * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。这里我们传入自己的function作为参数
         */
        ExcelConsumer consumer;
    
        public ExcelListener() {
        }
    
        /**
         * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
         */
        public ExcelListener(ExcelConsumer consumer) {
            this.consumer = consumer;
        }
    
    
        @Override
        public void invoke(T t, AnalysisContext analysisContext) {
            list.add(t);
            if (list.size() > BATCH_COUNT){
                //超出界限值,保存数据库,避免oom
                //执行函数
                consumer.excute(list);
    
                // 存储完成清理 list
                list.clear();
    
            }
        }
    
        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
            // 这里也要保存数据,确保最后遗留的数据也存储到数据库
            consumer.excute(list);
        }
    
    }
    

    4、自定义导入/导出模板

    /**
     * @author :Nickels
     * @date :2020/7/27
     */
    @Getter
    @Setter
    public class SendAddressTemplate {
    
        @ExcelProperty(value = "公司名称",index = 0)
        private String companyName;
    
        @ExcelProperty(value = "姓名",index = 1)
        private String name;
    
        @ExcelProperty(value = "电话",index = 2)
        private String phone;
    
        @ExcelProperty(value = "详细地址",index = 3)
        private String addressDetail;
    
        @ExcelProperty(value = "备注",index = 4)
        private String remak;
    
    }
    

    5、导入使用

    EasyExcel.read(file.getInputStream(), SendAddressTemplate.class,new ExcelListener(p->{
                        //保存逻辑(可封装一个普通的sevice)p-为我们执行函数时传入的list
                        //sendAddressService.importExcel(p);
                    })).sheet().doRead();
    

    相关文章

      网友评论

          本文标题:如何优雅的使用easy excel

          本文链接:https://www.haomeiwen.com/subject/ghqbrktx.html