1.需求场景描述
2.问题分析与实现方案

1.需求场景描述

现在有个业务需要按照指定模板上传选择题,并进行入表处理,使用easyExcel进行文件上传并读取数据,其中涉及合并单元数据读取问题,这里简单记录一下实现过程,希望对有同样需求的同学有所帮助.下面贴一下文件上传的模板:

其中每个选择题的题干部分是合并单元格,每个选择题的四个固定选项分别占一行。入表之前期望读取的数据格式为:

2.问题分析与实现方案

对于此种场景,根据easy excel读取原理,每行读取完成都支持进行监听回调(可自定义监听器执行invoke中获取所有行数读取信息),所有行数读取完成之后将组装数据进行输出(所有行数读取完成会执行自定义监听器中doAfterAllAnalysed)。按照一般读取操作发现都是按照合并前的行数进行读取。以展示模板信息为例说讲,表格中8行数据,就是进行了8次读取,对于合并单元格所在的列,只有第一行进行了实体类属性数据映射,对于合并过的单元格对应的实体类属性值均为null。以下为代码调试展示说明:
每道题第一行读取的实体类属性值:
每道题第一行之外读取的实体类属性值:
所以可以将每行读取完成之后的数据进行组装即可,这里添加了一下目标数据格式类: ExamInfo.java
下面贴一下案例代码:
easy excel文件读取类(与模板文件对应):

public class ExamMsg {@ExcelProperty("题目描述")private String answer;@ExcelProperty("考试答案")private String stem;@ExcelProperty("考试答案分析")private String analyse;@ExcelProperty("题目单项分数")private Integer singleScore;@ExcelProperty("选项")private String choiceType;@ExcelProperty("选项内容")private String optionContent;// 省略get/set
}

目标数据组装类(入表之前的最终数据格式):

public class ExamInfo {private String answer;private String stem;private String analyse;private Integer singleScore;private List<EaxmChoiceInfo> eaxmChoiceInfoList=new ArrayList<>();
// 省略get/set
}

每个选择题的四个选择项实体类:

public class EaxmChoiceInfo {private String choiceType;private String optionContent;// 省略get/set
}

自定义监听器

public class ExamListener implements ReadListener<ExamMsg> {// 自定义消费者函数接口用于自定义监听器中数据组装private final Consumer<List<ExamInfo>> consumer;public ExamListener(Consumer<List<ExamInfo>> consumer) {this.consumer = consumer;}// easy excel读取参数private List<ExamMsg> examMsgList=new ArrayList<>();// 封装读取对象private List<ExamInfo> examInfoList=new ArrayList<>();// 每行读取完成之后会执行@Overridepublic void invoke(ExamMsg data, AnalysisContext context) throws IllegalAccessException {// 按照格式组装数据if(data.getStem() != null){ExamInfo examInfo = new ExamInfo();BeanUtils.copyProperties(data,examInfo);examInfo.getEaxmChoiceInfoList().add(new EaxmChoiceInfo(data.getChoiceType(),data.getOptionContent()));examInfoList.add(examInfo);}else {// 倒序添加选择题信息,只对最后一个进行添加选项数据信息examInfoList.get(examInfoList.size() - 1).getEaxmChoiceInfoList().add(new EaxmChoiceInfo(data.getChoiceType(),data.getOptionContent()));}}// 每行读取完成之后执行@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {if (CollectionUtils.isNotEmpty(examInfoList)) {consumer.accept(examInfoList);}}
}

文件读取测试类:

public class PersonalExcel {public static void main(String[] args) {List<ExamInfo> examInfoList=new ArrayList<>();String fileName = "E:\\项目汇总\\选择题录入模板" + ".xlsx";EasyExcel.read(fileName, ExamMsg.class, new ExamListener(examInfos -> {for (ExamInfo examInfo : examInfos) {examInfoList.add(examInfo);}})).sheet().doRead();System.out.println(examInfoList);}}

控制台打印读取数据:

[ExamInfo{answer='新冠肺炎起源于哪一年?', stem='A', analyse='经验得知', singleScore=2, eaxmChoiceInfoList=[EaxmChoiceInfo{choiceType='A', optionContent='2019'}, EaxmChoiceInfo{choiceType='B', optionContent='2022'},EaxmChoiceInfo{choiceType='C', optionContent='2021'},EaxmChoiceInfo{choiceType='D', optionContent='2003'}]},ExamInfo{answer='刘备的最好的朋友是谁?', stem='B', analyse='猜的', singleScore=2, eaxmChoiceInfoList=[EaxmChoiceInfo{choiceType='A', optionContent='关羽'},EaxmChoiceInfo{choiceType='B', optionContent='诸葛亮'},EaxmChoiceInfo{choiceType='C', optionContent='张飞'}, EaxmChoiceInfo{choiceType='D', optionContent='曹操'}]}]

以上为处理合并单元格文件读取的实现方案,如果对你有帮助欢迎点赞收藏!
更多easy excel实战文章:
    Easy excel实战:读取文件自定义转化器不生效问题处理方案
     EasyExcel实战:实现导入文件参数校验并记录异常信息

easyExcel中合并单元格文件读取实现方案相关推荐

  1. easyexcel 动态合并单元格

    easyexcel 动态合并单元格 目前操作excel文档的底层都是用poi来进行的,在早期工作开发过程中,是基于poi,然后对每一个数据单元格进行操作代码编写,后面有一些比较好的开源项目,像easy ...

  2. Excel 中合并单元格的快捷键(ALT+H+M+M)

    要在 excel 中合并单元格,首先选择要合并到一个单元格中的单元格,然后可以使用从ALT开始的快捷键,然后同时按H+M+M. 一旦我们使用快捷键执行该函数,它将弹出一条警告消息"合并单元格 ...

  3. php如何读取excel合并单元格_PHP读取excel中合并的单元格的值

    RT 在做的一个东西,需要读取excel中个别列的内容,之前用的php excelreader,但是合并的单元格都是空的值,而且我的excel也不好判断只要是空的就用数组中上个的值这种方法,本身exc ...

  4. EasyExcel导出自定义合并单元格文件

    目标 需要使用阿里的EasyExcel库来导出excel,并要自定义合并单元格. 思路 这里自定义的CellWriteHandler需要将数据进行如下处理: 1.Excel每一行数据必须对应一个对象: ...

  5. easyexcel 列头合并_2020-05-19:EasyExcel自定义合并单元格

    public static void writeExcelWithHeadAndData(OutputStream outputStream, List> head, List> body ...

  6. easyexcel处理合并单元格数据

    一.背景 一次工作任务是要解析excel数据,采用阿里的 easyexcel 工具进行解析,由于表格有合并单元格,但是 easyexcel 读取合并单元格只会读取一次,导致下面单元格数据为空,这样会影 ...

  7. python xlwt 合并单元格_python3读取Excel(包含合并单元格)

    概述 使用python3读取Excel内容,包含读取纵向合并单元格和横向合并单元格. pyexcel.png 其中,在D2.D3.D4单元格为合并单元格,我们希望第3行和第4行都可以用"诸葛 ...

  8. markdown表格在github/gitee中合并单元格

    markdown表格合并单元格只能是在.md文件中使用html   代码 github/gitee中的显示效果 横向合并 <table>   <tr>     <td&g ...

  9. POI-获取Excel中合并单元格问题

    项目需要读取上传的excel中的合并单元格.于是找到POI包: 主要是poi-x.x.jar 和 poi-ooxml-x.x.jar包 首先是判断当前sheet页是否存在合并单元格,使用getNumM ...

最新文章

  1. 微信小程序获取text的值与获取input的输入的值
  2. [小改进]Blog页面导航调整
  3. Nginx使用SSL配置HTTPS
  4. 安装scss_React Native + Typescript + Scss开发配置过程
  5. Android系统信息获取 之九:TelephonyManager类
  6. dubbo安装和使用
  7. MAC 上的 Live Writer : ecto
  8. linux自己写摄像头驱动,详解linux 摄像头驱动编写
  9. 前端在H5页面唤起微信支付(H5支付)
  10. Vue 2.0 华丽的音乐搜索播放 Demo
  11. linux安装rmp格式文件,在CentOS Linux上使用yum、dnf和rpm安装RPM文件(Packages)
  12. 扫码枪扫描多个二维码在明细行自动增行自动定位输入框
  13. 光刻厚胶 Thick Resist(SU-8 GM10xx,SU-8 Microchem,SPR220,NR26-25000P)
  14. Python3-pandas
  15. 常数乘以无穷大等于多少_无穷加减一个常数等于多少
  16. 曲线长、旋转图形表面积、旋转图形体积
  17. centos7 查看multipath服务状态是start condition failed,/etc/multipath.conf was not met
  18. Person [id=1, p_name=null, age=29, sex=女, idCard=IdCard [id=1, code=123453188908572121]]
  19. 数据库的基本常用命令
  20. 我的世界 1.12.2 Idea 开发包构建教程

热门文章

  1. 图像修复:Object Removal by Exemplar-Based Inpainting 学习笔记
  2. SEO必看的免费推广渠道
  3. nobup 与 后台运行命令
  4. 求解输入参数的立方根
  5. 【uniapp 动态设置 起始页 默认展示页面 】
  6. 利用canvas开发一个绘图板
  7. js: 动画 筋斗云导航栏 仿淘宝关闭二维码
  8. 【Godot】节点的碰撞与碰撞掩码的计算
  9. tortoiseGit管理的文件没有绿色红色等图标
  10. Cover Letter Response Letter