zoukankan      html  css  js  c++  java
  • easyexcel导入获取表头并且表头为不固定列

    Controller

    @PostMapping("upload")
        @ResponseBody
        public HashMap<String, Object> upload(@RequestParam(value = "file") MultipartFile file,
                                              @RequestParam(value = "ztId") int ztId,
                                              @RequestParam(value = "qj") String qj,
                                              @RequestParam(value = "gzlbId") String gzlbId) throws IOException {
          
            gzdrService.init(ztId, qj, gzlbId);
            //生成uuid
            String uuid = UUID.randomUUID().toString();
            GzdrListener gzdrListener = new GzdrListener(ztId, gzdrService, uuid, qj, gzlbId);
            EasyExcel.read(file.getInputStream(), gzdrListener).sheet("导入模板").doReadSync();
            HashMap<String, Object> hashMap = new HashMap<>();
            List<String> errMessage = gzdrListener.getErrMessage();
            if (errMessage.isEmpty()) {
                hashMap.put("success", true);
            } else {
                hashMap.put("success", false);
                hashMap.put("errMessage", errMessage);
            }
            return hashMap;
        }
    GzdrListener 

    public class GzdrListener extends AnalysisEventListener<Map<Integer, String>> {
    
        /**
         * 每隔128条存储数据库,然后清理list ,方便内存回收
         */
    
        private static final int BATCH_COUNT = 128;
        private int ztId;
        private List<String> errMessage;
        private GzdrService gzdrService;
        List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
        private String uuid;
        private String qj;
        private String gzlbId;
    
        public GzdrListener(int ztId, GzdrService gzdrService, String uuid, String qj, String gzlbId) {
            this.ztId = ztId;
            this.gzdrService = gzdrService;
            this.uuid = uuid;
            this.qj = qj;
            this.gzlbId = gzlbId;
            errMessage = new ArrayList<>();
        }
    
        @Override
        public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
            logger.info("解析到一条头数据:{}, currentRowHolder: {}", headMap.toString(), context.readRowHolder().getRowIndex());
            list.add(headMap);
        }
    
        @Override
        public void invoke(Map<Integer, String> data, AnalysisContext context) {
            logger.info("解析到一条数据:{}, currentRowHolder: {}", data.toString(), context.readRowHolder().getRowIndex());
            list.add(data);
            // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
            if (list.size() >= BATCH_COUNT) {
                errMessage.addAll(saveData());
                // 存储完成清理 list
                list.clear();
            }
        }
    
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            // 这里也要保存数据,确保最后遗留的数据也存储到数据库
            errMessage.addAll(saveData());
            logger.info("所有数据解析完成!");
        }
    
        /**
         * 加上存储数据库
         */
        private List<String> saveData() {
            logger.info("{}条数据,开始存储数据库!,ztId:{}  ", list.size(), ztId);
            return gzdrService.save(list, ztId, uuid, qj, gzlbId);
        }
    
        public List<String> getErrMessage() {
            return errMessage;
        }
    
        public void setErrMessage(List<String> errMessage) {
            this.errMessage = errMessage;
        }
    
        public GzdrService getGzdrService() {
            return gzdrService;
        }
    
        public void setGzdrService(GzdrService gzdrService) {
            this.gzdrService = gzdrService;
        }
    
        private final static Logger logger = LoggerFactory.getLogger(GzdrListener.class);
    }
    gzdrService的save做对应的校验和保存就行了。
  • 相关阅读:
    Theano入门笔记1:Theano中的Graph Structure
    [译博文]CUDA是什么
    一天一经典Efficient Estimation of Word Representations in Vector Space
    Generating a Random Sample from discrete probability distribution
    关于representation的理解
    git代码管理——克隆项目到本地仓库及上传本地项目到仓库
    yum管理——linux字符界面安装图形化及两种界面的切换(3)
    yum管理——yum常用配置(2)
    yum管理——搭建iso镜像私有yum源仓库(1)
    apche编译安装
  • 原文地址:https://www.cnblogs.com/pzw23/p/13354908.html
Copyright © 2011-2022 走看看