一、实现表格头校验
先说问题
EsayExcel默认是不校验表格头
对于数据区下方出现单元格有空格的情况,框架依旧将空格封装为一个对象放入集合中,并且,对象不为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;
}