当前位置: 首页 > news >正文

使用EasyExcel处理动态表头数据导入

最近在工作中遇到一个动态表头的数据导入,使用EasyExcel常规的类映射来接收是不可行的。我的解决方式是自已动态解析来处理,思路是:继承EasyExcel的AnalysisEventListener,手动处理和接收动态数据。这里主要适用表头只有一行,不适用多行复杂的表头,复杂表头可在这基础上扩展,请自行研究,哈哈。

自定义一个DynamicHeaderListener

public class DynamicHeaderListener extends AnalysisEventListener<Map<Integer, String>> {private List<String> headers = new ArrayList<>(); // 动态表头
//    private List<Map<String, String>> dataList = new ArrayList<>(); // 数据列表,每行的key值为表头名,value为数据值private List<List<String>> dataList = new ArrayList<>(); //数据列表,每个列数据和excel的位置相同@Overridepublic void invoke(Map<Integer, String> dataRow, AnalysisContext context) {if (headers.isEmpty()) {// 如果headers为空,则认为当前行为表头for (Map.Entry<Integer, String> entry : dataRow.entrySet()) {if (StrUtil.isNotBlank(entry.getValue())) {headers.add(entry.getValue().trim());} else {headers.add(entry.getValue());}}return;}// 处理数据行List<String> rowData = new ArrayList<>();for (int i = 0; i < headers.size(); i++) {
//            rowData.put(headers.get(i), dataRow.get(i));if (StrUtil.isNotBlank(dataRow.get(i))) {rowData.add(dataRow.get(i).trim());} else {rowData.add(dataRow.get(i));}}this.dataList.add(rowData);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// TODO Auto-generated method stub}public List<String> getHeaders() {return headers;}//    public List<Map<String, String>> getData() {
//        return dataList;
//    }public List<List<String>> getData() {return dataList;}}

以上代码是取excel表格的第一行为表头存入List<String> headers里面,然后每行数据存入List<List<String>> dataList,该集合的下标数据与headers下标是对应的。也可以存入List<Map<String, String>> dataList里面,代码我注释掉了,可以根据实际使用选择把数据存入不同数据结构的dataList里面。然后getHeaders()方法是获取表头,getData()方法是获取数据。

使用如下:

DynamicHeaderListener listener = new DynamicHeaderListener();EasyExcel.read(file.getInputStream(), listener).sheet().headRowNumber(0) // 第一行为表头.doRead();List<String> headers = listener.getHeaders(); //表头集合List<List<String>> importDataList = listener.getData(); ///数据集合

http://www.lryc.cn/news/575288.html

相关文章:

  • Aurora MySQL 3.05/3.06/3.07版本即将停用,全局数据库升级实战指南
  • 鸿蒙ArkUI---基础组件Tabs(Tabbar)
  • 日本生活:日语语言学校-日语作文-沟通无国界(5)-题目:我的一天
  • Boss:攻击
  • ChaCha20加密解密技术
  • 使用 Netty 实现 TCP 私有协议(解决粘包/拆包)
  • 三步实现B站缓存视频转MP4格式
  • WeakAuras Lua Script [ICC BOSS 12 - The Lich King]
  • 【笔记——李沐动手学深度学习】2.3 线性代数
  • PyTorch RNN实战:快速上手教程
  • MySQL之存储过程详解
  • IoT/HCIP实验-5/基于NB-IoT的智慧农业实验(平台侧开发+端侧编码+基础调试分析)
  • 重置 MySQL root 密码
  • python接口测试参数multipart/form-data格式不能有多余的空格或 tab 缩进
  • 计算机网络-----详解HTTPS协议
  • 可商用,可离线运行,可API接口调用的开源AI数字人项目Heygem,喂饭级安装教程
  • 专题:2025医疗AI应用研究报告|附200+份报告PDF汇总下载
  • Android14音频子系统 - 系统框架概述
  • 用户体验驱动的3D设计:从功能实现到情感共鸣的设计升级
  • Wpf的Binding
  • Deepoc大模型:精密制造智能化的“数字孪生引擎”
  • RabbitMq中使用自定义的线程池
  • 多个 Job 并发运行时共享配置文件导致上下文污染,固化 Jenkins Job 上下文
  • 联邦学习差分隐私系统的参与角色、密钥分发及攻击分析
  • 爽提配送:以专业守护校园,用匠心重塑安全
  • 理论加案例,一文读懂数据分析中的分类建模
  • 科技筑防线 智慧守平安——中物九联携硬核科技亮相四川防灾减灾盛会
  • 【MySQL】12. C语言与数据库的连接
  • 区间求最值问题高效解决方法
  • 深入理解残差网络(ResNet):原理与PyTorch实现