[alibaba/easyexcel]请问如何验证表头?

2024-05-23 680 views
3

不符合的表头,直接返回错误,不执行导入

回答

9

AnalysisEventListener有个invokeHeadMap函数可以读取表头数据。 我个人的方法是创建一个数组用来存表头,然后再建个boolean数组判断重复和表头字段对应的数组长度。如果重复或者少表头字段的直接return跳出。 20200326171413

8

参照楼上 必须自己写个监听器。且已经开始读取文件了。

2

我是这样处理的,不过easyexcel会包装成ExcelAnalysisException异常抛出,需要自己再通过cause处理一遍

    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        //获取bo对象head名称
        List<String> expectHeadList = Optional.ofNullable(context)
                .map(AnalysisContext::currentReadHolder)
                .map(ReadHolder::excelReadHeadProperty)
                .map(ExcelReadHeadProperty::getHeadMap)
                .map(Map::values)
                .orElse(Collections.emptyList())
                .stream().map(Head::getHeadNameList)
                .flatMap(Collection::stream)
                .collect(Collectors.toList());
        //表头数量检测
        if (!Objects.equals(headMap.size(), expectHeadList.size())) {
            throw new  CustomerExp("settlement.template.error");
        }
        //表头名称检测
        for (int i = 0; i < headMap.size(); i++) {
            if (!Objects.equals(headMap.get(i), expectHeadList.get(i))) {
                throw new CustomerExp("settlement.template.error");
            }
        }
    }