EsayExcel实现校验表头及空行校验

3,045 阅读1分钟

一、实现表格头校验

先说问题

  1. EsayExcel默认是不校验表格头

  2. 对于数据区下方出现单元格有空格的情况,框架依旧将空格封装为一个对象放入集合中,并且,对象不为null,只是对象的属性为空字符串

1. 获取应导入表头列的集合

实现方式: 通过反射获取ExcelProperty注解的值,即是表格的表头集合

此方法有局限性: 需要单独的导入实体类,并且类中的字段都应该被ExcelProperty注解标注

/**
	 * 获取导入类中属性标注的ExcelProperty注解的值
	 *
	 * @param clazz
	 * @param <T>
	 * @return excelHeadData
	 * @author hongxing
	 */
	public static <T> List<String> excelHeadData(Class<T> clazz){
        // 获取所有的私有属性
		Field[] fields = clazz.getDeclaredFields();
		// 遍历所有属性
		List<String> excelHeadData = new ArrayList<>();
		for (Field field : fields) {
			ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
			excelHeadData.add(annotation.value()[0]);
		}
		return excelHeadData;
	}

2. 重写invokeHeadMap方法

@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    // headMap是读取的excel的表头,由框架封装成map, key为列序号
    for(String key : headMap.values()){
        boolean contains = excelHeadData.contains(key);
        if (!contains) {
            throw new ServiceException("请检查表格头部数据");
        }
    }
}

二、校验空行

重写hasNext方法

@Override
public boolean hasNext(AnalysisContext context) {
    Map<Integer, Cell> cellMap =context.readRowHolder().getCellMap();
    boolean flag = Boolean.TRUE;
    for (Cell cell : cellMap.values()) {
        // 如果全部都为空字符串则后面会抛异常
        if (StringUtils.isNotBlank(cell.toString())) {
            flag = Boolean.FALSE;
        }
    }
    if (flag) {
        throw new ServiceException("请检查文件数据区或下方空格/空行");
    }
    return true;
}

拜拜~~ 越努力越幸运~