动态表头excel导入(java)

动态表头excel导入

1. 导入依赖并设置实体

  1. 首先配置poi版本相关的maven属性

    <properties>
    		<poi.version>4.1.2poi.version>
    properties>
    
  2. 配置文件中使用Apache poi,Alibaba-easyexcel相关的依赖。

    <dependency>
    			<groupId>com.alibaba</groupId>
    			<artifactId>easyexcel</artifactId>
    			<version>2.1.6</version>
    			<exclusions>
    				<exclusion>
    					<groupId>org.apache.poi</groupId>
    					<artifactId>poi</artifactId>
    				</exclusion>
    				<exclusion>
    					<groupId>org.apache.poi</groupId>
    					<artifactId>poi-ooxml</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-ooxml</artifactId>
    			<version>${
           poi.version}</version>
    		</dependency>
    
  3. 动态读取的表单实体类内容

    @Builder
    @Data
    @TableName("t_form_template")
    public class FormTemplate {
           
    
            @TableId(type = IdType.AUTO)
            private Long id;
    		//表头名称
            private String formTitle;
    		//表名
            private String formName;
    		//是否可为空
            private Boolean isBlank;
    		//规定的数据类型
            private String dataType;
    		//规定的字段的长度
            private String dataNum;
        
            private String valueType;
    		//字段默认值
            private String defaultText;
    
            private String defaultPrompt;
    		//字段的排序
            private String formSort;
    
            private String remarks;
    
            @ApiModelProperty(value = "创建时间")
            @TableField(fill = FieldFill.INSERT)
            @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
            private LocalDateTime createTime;
    
            @TableField(exist=false)
            @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
            private LocalDateTime createTimeBegin;
            @TableField(exist=false)
            @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
            private LocalDateTime createTimeEnd;
    
    
            @ApiModelProperty(value = "更新时间")
            @TableField(fill = FieldFill.INSERT_UPDATE)
            @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
            private LocalDateTime updateTime;
    
    
    
    
    
    }
    
    

2. 数据解析

  1. 这里使用每10条数据为批次,进行存储数据库操作,实际使用中可以更大批次进行数据处理。
  2. 使用esayExcel的相关函数对数据进行批次解析。
  3. 过程为:解析数据->找到对应字段->对数据进行保存。
    private static final int BATCH_COUNT = 10;
    List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
    @Override
    public void invoke(Map<Integer, String> data, AnalysisContext context) {
     
        log.info("解析到一条数据:{}", JSON.toJSONString(data));
        list.add(data);
        if (list.size() >= BATCH_COUNT) {
     
            saveData();
            list.clear();
        }
    }
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
     
        log.info("解析到一条头数据:{}", JSON.toJSONString(headMap));
        list.add(headMap);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
     
        saveData();
        log.info("所有数据解析完成!");
    }
   

3.存入数据库

  1. 储存操作

     private void saveData() {
           
            log.info("{}条数据,开始存储数据库!", list.size());
            log.info("{}输出list!!!",list);
            //注意这里调用自己的保存方法
            signupUserinfoService.saveAll(list);
            log.info("存储数据库成功!");
        }
    
  2. 批量保存函数

    1. 原理是对获得的list转为map对象,并且进行循环插入数据库。
        @Override
        public void saveAll(List<Map<Integer, String>> list) {
           
            Map<Integer, String> map = list.get(0);
            for (int i = 1; i < list.size(); i++) {
           //行数
                Map<Integer, String> map1 = list.get(i);
                int code = refFormUserService.selectMaxCode() + 1;
                for (int j = 0; j < map.size(); j++) {
           //列数
                    SignupUserinfo signupUserinfo = new SignupUserinfo();
                    FormTemplate formTemplate = formTemplateService.selectFormTemplate(signupId, map.get(j));
                    log.info("{}j的大小", map.get(j));
                    signupUserinfo.setFormName(formTemplate.getFormName());
                    signupUserinfo.setFormTitle(map.get(j));
                    signupUserinfo.setFormValue(map1.get(j));
                    signupUserinfoService.saveOrUpdate(signupUserinfo);
                    signupUserinfo.setFormId(formTemplate.getId());
                    signupUserinfo.setCode(String.valueOf(code));
                    signupUserinfo.setFormUserId(signupUserinfo.getId());
                    refFormUserService.insertByUserInfo(signupUserinfo);
                }
            }
        }
    

你可能感兴趣的:(项目相关技术点整理)