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

多级表头的导出

问题背景:

需要动态的生成自定义的多级表头

解决:

如果是表头能够一开始定义好的,那么使用easyexcl官网中的快速开始->写excl->复杂头写入就可以了,只需要一开始定义一个excel对应的实体对象,文档链接如下:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E5%A4%8D%E6%9D%82%E5%A4%B4%E5%86%99%E5%85%A5

但是我这里的需求,表头不是固定的,要动态生生成,解决代码如下:

表头代码

创建多级表头并合并空白行。

easyexcl默认的合并规则是:相邻的行或列如果同名就会合并,这个可以自己写自定义规则,我这里需求已经满足了。有的列是两行,有的列是三行甚至更多,我这里的解决方法是先找出表头的最高层级,对每一列的数据,追加同名行到最高层级,这样就实现了合并单元格。

注意:顺序很重要

List<List<String>> head;
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "铺货门店标记"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "我司冰柜", "陈列规格"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "我司冰柜", "费用"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "非自有冰柜", "陈列规格"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "非自有冰柜", "陈列位置"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "非自有冰柜", "费用"), maxLevel));private List<String> fillHraderList(List<String> list, int maxLevel) {List<String> result = new ArrayList<>(list);String lastElement = list.get(list.size() - 1);while (result.size() < maxLevel) {result.add(lastElement);}return result;
}

效果图:

表体数据填充代码

注意:顺序很重要,完全是根据列的顺序填充对应的值

// Map的key、value对应列下标,列值
List<Map<Integer, String>> dataList;dataList.forEach(data -> {// 判断列是否有值if (columnMap.containsKey(refBusinessPlanTemplateColumn)) {data.put(columnMap.get(refBusinessPlanTemplateColumn), item.getColumnValue());}else{data.put(columnMap.get(refBusinessPlanTemplateColumn),"");}             
});// 写入excl
ByteArrayOutputStream excelOut = new ByteArrayOutputStream();
ExcelWriter excelWriter = EasyExcel.write().file(excelOut).build();
WriteSheet writeSheet0 = EasyExcel.writerSheet(0).head(head).build();
excelWriter.write(dataList, writeSheet0);
excelWriter.finish();
http://www.dtcms.com/a/314367.html

相关文章:

  • 人大金仓数据库常见问题(持续更新)
  • SJW-app-1
  • [Sensors]BMI270 FIFO的使用
  • 对于类似std::shared_ptr但有可能空悬的指针使用std::weak_ptr: Effective Modern C++ 条款20
  • Shell 脚本发送信号给 C 应用程序,让 C 应用程序回收线程资源后自行退出。
  • Linux服务器管理MySQL数据库的常见命
  • Spring AI 系列之三十三 - Spring AI Alibaba-Graph框架之人类反馈
  • 区块链基础之Merkle B+树
  • 【Spring】SpringBoot自动注入原理分析,@SpringBootApplication、@EnableAutoConfiguration详解
  • Java类与对象练习题
  • 运动想象 (MI) 分类学习系列 (18) : MSVTNet
  • 一(1)关于单链表中的疑问
  • Spring AI实战:SpringBoot项目结合Spring AI开发——提示词(Prompt)技术与工程实战详解
  • SAP-ABAP:ABAP Open SQL 深度解析:核心特性、性能优化与实践指南
  • 设计模式 -> 策略模式(Strategy Pattern)
  • 2025年8月4日私鱼创作平台v1.0.4公测版更新发布-完成大部分功能包含关注创作者以及发布作品及合集功能优雅草科技
  • 06 基于sklearn的机械学习-欠拟合、过拟合、正则化、逻辑回归
  • 线程互斥锁:守护临界区的关键
  • 可编辑190页PPT | 某科技集团数字化转型SAP解决方案
  • Vue 3 版本的 JWT 单点登录 (SSO) 实现
  • 国家科学技术奖答辩PPT案例_科技进步奖ppt制作_技术发明奖ppt设计美化_自然科学奖ppt模板 | WordinPPT
  • 使用mybatis生成器生成实体类mapper和查询参数文件,实现简单增删改查。使用log4j输出日志到控制台。使用配置文件注册Bean,配置视图解析器
  • 【Java】使用模板方法模式设计EasyExcel批量导入导出
  • Apache Camel 中 ProducerTemplate
  • 刷题日志(7)——二叉树高频习题(下)
  • 高精度实战:YOLOv11交叉口目标行为全透视——轨迹追踪×热力图×滞留分析(附完整代码)
  • FrePrompter: Frequency self-prompt for all-in-one image restoration
  • Opencv[一]
  • R 语言科研绘图第 67 期 --- 箱线图-显著性
  • Spark SQL:用SQL玩转大数据