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

 

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

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

1.引入pom依赖


    com.alibaba
    easyexcel
    2.1.1


    org.apache.poi
    poi
    4.1.2


   org.apache.poi
   poi-ooxml
   4.1.2

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

public class ExcelListener extends AnalysisEventListener  {


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

        private ApplicationContext applicationContext;
        /**
         * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
         */
        private static final int BATCH_COUNT = 5;
        List list = new ArrayList();
        /**
         * 假设这个是一个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 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 list) {
        Date date = new Date();
        list.stream().forEach(item->item.setCreateTime(date));
        return baseMapper.batchInsert(list);
    }

 

你可能感兴趣的:(笔记,java)