当前位置: 首页 > 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.lqws.cn/news/520057.html

相关文章:

  • AWS WebRTC:通过shell实现多进程启动viewer
  • Object.assign()
  • 获取YARN application 应用列表的几种方法
  • 2025年Java后端最新面试场景题 + 八股文高频面试题
  • Dagster数据管道构建指南:I/O管理与数据库连接实践
  • React Native【实战范例】账号管理(含转换分组列表数据的封装,分组折叠的实现,账号的增删改查,表单校验等)
  • rules写成动态
  • syncthing忘记密码怎么办(Mac版)?
  • 成都芯谷金融中心·文化科技园打造文化科技高地
  • 微服务思想与C++服务化框架
  • 跟着AI学习C#之项目实践Day7
  • sentinel 自定义 dashboard 用户名密码
  • 第⼀个与⼤模型交互的应⽤
  • Swagger 在 Spring Boot 中的详细使用指南
  • thinkphp8之文件上传
  • 用户体验驱动的3D设计:从功能实现到情感共鸣的设计升级
  • 融合聚类与分类的退役锂电智能分选技术:助力新能源汽车产业可持续发展
  • JVM调优实战 Day 6:JVM性能监控工具实战
  • 数据结构 顺序表与链表
  • python的易家宜超市云购物系统
  • webman 利用tcp 做服务端 对接物联网
  • 使用 Spread.net将 Excel 中的文本拆分为多段
  • 注解+AOP+自动配置实现自定义starter
  • Java8 Stream流:Stream流的思想和获取Stream流
  • 深入浅出:RocketMQ与Kafka的双剑合璧,实现高可用与高吞吐
  • 服务器不支持PUT,DELETE 的解决方案
  • python爬虫框架scrapy学习记录
  • 打造属于你的AI智能体,从数据开始 —— 使用 Bright Data MCP+Trae快速构建垂直智能体
  • 量学云讲堂2025朱永海慢牛开启第58期视频课程
  • 卡萨帝发布AI深度科技:实现从守护生活到守护文明的升级