在Excel导入的时候, 也避免不了有些用户不按照流程, 去导入一些奇奇怪怪的Excel模板, 来导致后端系统500报错, 这个时候就需要校验Excel的表头来判断模板是否正确
其实读取表头并不难, 我们可以直接去继承AnalysisEventListener<导入的exce实体类>, 并实现里面的方法, 其中invokeHeadMap方法就能实现获取表头的功能
/**
* 读取表头
*/
@Slf4j
public class EasyExcelListener extends AnalysisEventListener {
@Override
public void invoke(ImportLocationInfor data, AnalysisContext context) {
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
@Override
public void invokeHeadMap(Map headMap, AnalysisContext context) {
log.info("表头数据 excelHead= {}", headMap);
}
}
业务层读取Excel代码
EasyExcel.read(file.getInputStream(), ImportLocationInfor.class, new EasyExcelListener() {
}).sheet().headRowNumber(3).doRead();
上述就是获取表头的方法, 虽然很简单, 但是如果有更复杂的业务逻辑, 放在这个类就尤为不合适了, 这里我们采取重写invokeHeadMap的方式实现在业务层中(impl)来校验表头
/**
* 表头校验
*
* @param file 文件
* @throws IOException
*/
public void checkHeader(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), ImportLocationInfor.class, new EasyExcelListener() {
@Override
public void invokeHeadMap(Map headMap, AnalysisContext context) {
//headRowNumber(3)应该是循环到第三行, 在遍历的时候readRowHolder也会先读取0,1 所以这里指定为index3
if (context.readRowHolder().getRowIndex() == 2) {
headMap.forEach((index, item) -> {
if (!HEAD.contains(item)) {
log.info("第三行表头参数>>{}", headMap);
throw new BaseServiceException("模板格式错误, 请下载地点信息导入模板!");
}
});
}
}
}).sheet().headRowNumber(3).doRead();
}
因为表头的参数时写死的我们可以采用静态的方式存储, 这样只会加载一次
public final static HashSet HEAD = new HashSet() {{
add("所属场景[*]");
add("1级地点名称[*]");
add("2级地点名称");
add("3级地点名称");
add("4级地点名称");
add("5级地点名称");
add("6级地点名称");
add("7级地点名称");
}};
EsayExcel在业务层中获取表头源码(0积分下载)-Java文档类资源-CSDN下载业务场景: 更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_45481709/86542177?spm=1001.2014.3001.5503