前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasyExcel合并单元行没填不能解析数据

EasyExcel合并单元行没填不能解析数据

作者头像
SmileNicky
发布2022-05-07 18:16:15
4760
发布2022-05-07 18:16:15
举报
文章被收录于专栏:Nicky's blogNicky's blog

最近在做Excel报表开发,要开发一个一对多,合并单元行的Excel导入功能,因为开发时间比较赶,所以想到使用开源的EasyExcel组件来开发,不过在开发中遇到一个问题,就是那些合并单元格,一整行都不填的情况,使用EasyExcel去解析数据时候,是一张行数据都不能解析到,使用过EasyExcel的读者应该可以理解到我的意思,写出来分享出来,希望遇到这个问题的开发者也可以马上处理问题

在这里插入图片描述
在这里插入图片描述

自定义的AnalysisEventListener:

代码语言:javascript
复制
package com.common.excel;

import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellExtra;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

@Slf4j
public class EasyExcelListener<T> extends AnalysisEventListener<T> {

    private List<T> datas;

    private Integer rowIndex;

    private List<CellExtra> extraMergeInfoList;

    public EasyExcelListener(Integer rowIndex) {
        this.rowIndex = rowIndex;
        datas = new ArrayList<>();
        extraMergeInfoList = new ArrayList<>();
    }

    @Override
    public void invoke(T data, AnalysisContext context) {
        //log.info("解析到一条数据: {}", JSONUtil.toJsonPrettyStr(data));
        ReflectUtil.invoke(data, "setIndex", StrUtil.toString(context.readRowHolder().getRowIndex()));
        datas.add(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        log.info("所有数据解析完成!");
    }

    @Override
    public void extra(CellExtra extra, AnalysisContext context) {
        //log.info("读取到了一条额外信息:{}", JSONUtil.toJsonPrettyStr(extra));
        switch (extra.getType()) {
            case MERGE:
                if (extra.getRowIndex() >= rowIndex) {
                    extraMergeInfoList.add(extra);
                }
                break;
            default:
        }
    }

    public List<T> getData() {
        return datas;
    }


    public List<CellExtra> getExtraMergeInfoList() {
        return extraMergeInfoList;
    }


}

读取Excel表代码:

代码语言:javascript
复制
EasyExcelListener easyExcelListener = new EasyExcelListener(headRowNumber);

EasyExcel.read(file.getInputStream(), UnitIllegalExcelDto.class, easyExcelListener)
        .extraRead(CellExtraTypeEnum.MERGE)
        .sheet(sheetNo)
        .headRowNumber(headRowNumber)
        .doRead();

List<CellExtra> extraMergeInfoList = easyExcelListener.getExtraMergeInfoList();
List<UnitIllegalExcelDto> data = new ExcelMergeHelper().explainMergeData(easyExcelListener.getData(), extraMergeInfoList, headRowNumber);

使用上面EasyExcelListener去读取Excel数据,会一直将合并单元格不填的一整行数据直接忽略了,通过debug看到框架不支持这种数据的解析,其实向正常的数据导入也不影响,但是需求是要做校验的,这些合并单元格不填也要校验,数据拿不到就不能做校验,所以也烦恼了我一个上午,去GitHub也找不到对应issue

在这里插入图片描述
在这里插入图片描述

后面通过EasyExcel交流群,技术人员的回复,知道可以在invoke方法里加上context.readWorkbookHolder().setIgnoreEmptyRow(false);,经过沟通,EasyExcel默认是不读取这些合并单元格都不填的数据的,所以这样修改就可以拿到数据:

代码语言:javascript
复制
@Override
public void invoke(T data, AnalysisContext context) {
    //log.info("解析到一条数据: {}", JSONUtil.toJsonPrettyStr(data));
    context.readWorkbookHolder().setIgnoreEmptyRow(false);
    ReflectUtil.invoke(data, "setIndex", StrUtil.toString(context.readRowHolder().getRowIndex()));
    datas.add(data);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档