EasyExcel表头校验,表内容校验

上传excel表格时候,要求要

姓名身份证号电话地址

可用户上传的是

身份证号电话姓名地址

出现这种用户上传表格和规定模板不同的时候,就需要加上表头校验

easyExcel里的
ExcelReaderBuilder read(InputStream inputStream, Class head, ReadListener readListener)方法
中的ReadListener 可以在listener里面做校验

具体代码如下
Controller

  	@PostMapping
    @ImportExcel
    public void add(@RequestPart("file") MultipartFile file, @Validated DemoVO demo) {
        demoService.saveDemo(file, demo);
    }

Service

public void saveDemo(MultipartFile file, DemoVO demo) {
	DemoListener listener = new DemoListener();
	 try {
	 		// 这里read方法的第二个参数,是你想要入库的实体类,headRowNumber里面数字是几就是从excel表格的第几行开始读入库数据
            EasyExcel.read(file.getInputStream(), DemoVO.class, listener).sheet().headRowNumber(1).doRead();
            Map<String, String> map = listener.map;
            if (map.size() != 0){
                throw  new ExcelException(map.get("msg"));
            }
        } catch (IOException e) {
            throw new ExcelException("您上传的文件格式与模板格式不一致,请检查后重新上传");
        }
    // 此时拿到的data已经是校验通过后的集合,可对该集合进行业务需要的操作
    List<DemoVO> demoList = listener.getData();
}

read方法的listener

// 继承AnalysisEventListener,括号里放表格对应实体类
@Component
public class DemoListener extends AnalysisEventListener<DemoVO> {

    public List<DemoVO> data = new ArrayList<DemoVO>();
    // 此map用来存储错误提示
    public Map<String, String> map = new HashMap<>();

    public DemoListener() {
    }
    
   /**
     * 重写invokeHeadMap方法,校验表头
     *headMap的key是表头下标,value是内容
     */
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    	// headMap.containsKey(下标),先判空
    	// headMap.get(0).equals() 判内容是否相符
        if (!headMap.containsKey(0) || !headMap.containsKey(1) || !headMap.containsKey(2) || !headMap.containsKey(3) 
                || !headMap.get(0).equals("姓名") || !headMap.get(1).equals("身份证号") 
                || !headMap.get(2).equals("电话") || !headMap.get(3).equals("地址") ) {
            // 这里给data加1条空数据,是因为doAfterAllAnalysed方法最后有判是否是空列表
            data.add(new DemoVO());
            map.put("msg", "您上传的文件格式与模板格式不一致,请检查后重新上传");
            // 这里业务中可改为直接抛出异常,外层去捕获
            return;
        }
    }

    @Override
    public void invoke(DemoVO demo, AnalysisContext analysisContext) {
    	// 这里放具体数据校验方法,校验通过往data里面放数据,否则直接return
        if (checkValidateBlank(demo) && checkValidateLength(demo)) {
            data.add(demo);
        } else {
            return;
        }
    }

    /**
     * 字段为空校验
     *
     * @param demo
     * @return
     */
    protected boolean checkValidateBlank(DemoVO demo) {
        if (StringUtils.isEmpty(demo.getName()) || StringUtils.isEmpty(demo.getMobile())
                || StringUtils.isEmpty(demo.getIdCardNo()) || StringUtils.isEmpty(demo.getAdress())) {
            map.put("msg", "您上传的文件内容含有空白数据,请检查后重新上传");
            return false;
        }
        return true;
    }

    /**
     * 校验长度
     *
     * @param demo
     * @return
     */
    protected boolean checkValidateLength(DemoVO demo) {
        if (demo!= null) {
            if (demo.getName().length() > 30 || demo.getMobile().length() > 30 
            || demo.getIdCardNo().length() > 30 || demo.getAdress().length() > 30) {
                map.put("msg", "您上传的文件内容文字长度超出常规,请检查后重新上传");
                return false;
            }
        }
        return true;
    }
    
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        if (!CollectionUtils.isNotEmpty(data)) {
            throw new ExcelException("excel无有效数据");
        }
    }

    public List<DemoVO> getData() {
        return data;
    }
}
  • 11
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值