easyExcel 导入实例 (记录方便以后使用)

 

官网:https://www.yuque.com/easyexcel/doc/easyexcel

导入的excel内容 和 存入的po字段对应好就可以了

1.引入pom依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>4.1.2</version>
</dependency>

2.定义ExcelListener(官网有,改吧改吧)

public class ExcelListener extends AnalysisEventListener<Object>  {


        private static final Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class);

        private ApplicationContext applicationContext;
        /**
         * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
         */
        private static final int BATCH_COUNT = 5;
        List<Object> list = new ArrayList<Object>();
        /**
         * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
         */
        //改动:存储的时候需要,可以动态传入Dao
        private Class<?> demoDAO;
        /**
         * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
        //改动:把ApplicationContext传入,用来获取bean实例
         *
         * @param demoDAO
         */
        public ExcelListener(Class<?> demoDAO,ApplicationContext applicationContext) {
            this.demoDAO = demoDAO;
            this.applicationContext = applicationContext;
        }

        /**
         * 这个每一条数据解析都会来调用
         *
         * @param data
         *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
         * @param context
         */
        @Override
        public void invoke(Object data, AnalysisContext context) {
            LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
            list.add(data);
            // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
            if (list.size() >= BATCH_COUNT) {
                saveData();
                // 存储完成清理 list
                list.clear();
            }
        }

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

        /**
         * 加上存储数据库
         */
        private void saveData() {
            LOGGER.info("{}条数据,开始存储数据库!", list.size());
            try {
            //改动:用反射获取方法(一般解析excel都需要存储,定义统一的batchInsert方法)执行统一的batchInsert
                Method batchInsert = demoDAO.getDeclaredMethod("batchInsert",List.class);
               //改动: 不可以直接demoDAO.newInstance   得到的对象实例内 自动注入的bean都是空的
                batchInsert.invoke( applicationContext.getBean(demoDAO),list);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //   demoDAO.save(list);
            LOGGER.info("存储数据库成功!");
        }

3.业务

controller

    @PostMapping("/importData")
    @ApiOperation(value = "导入数据")
    public ResponseModel<Object> importData(MultipartFile file){
        try{

           DataInfoService.importData(file);
            return new ResponseModel<>(RESULT_SUCCESS,"录入成功",null);
        }catch (Exception e){
            log.error("录入失败",e);
            return new ResponseModel<>(RESULT_ERROR,"录入失败",null);
        }
    }

service

void importData(MultipartFile file);

serviceImpl

 @Autowired
    private ApplicationContext applicationContext;

@Override
    public void importData(MultipartFile file) {
        File toFile = null;
        if (file.equals("") || file.getSize() <= 0) {
            file = null;
        } else {
            InputStream ins = null;
            try {
                ins = file.getInputStream();
                toFile = new File(file.getOriginalFilename());
                inputStreamToFile(ins, toFile);
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    ins.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        EasyExcel.read(toFile,Data.class,new ExcelListener(DataInfoServiceImpl.class,applicationContext)).sheet().doRead();

    }



 //获取流文件
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

//批量插入

  @Override
    public int batchInsert(List<DataInfo> list) {
        Date date = new Date();
        list.stream().forEach(item->item.setCreateTime(date));
        return baseMapper.batchInsert(list);
    }

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值