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

相关文章:

  • 如何使用EF框架操作Sqlite
  • 多租户字典管理系统完整设计
  • TCP 协议的“无消息边界”(No Message Boundaries)特性
  • shell脚本tcpdump抓取数据解析执行关机指令
  • PyCharm代码规范与代码格式化插件安装与使用:pylint和autopep8
  • 质押和抵押有什么区别
  • 【Java】一篇详解HashMap的扩容机制!!
  • 2025年8月4日私鱼创作平台v1.0.4公测版更新发布-完成大部分功能包含关注创作者以及发布作品及合集功能优雅草科技
  • 音视频学习笔记
  • 深入解析 Apache Tomcat 配置文件
  • Planner 5D v2.29.0 安卓高级解锁版,手机3D家装,全套家具免费
  • 鸿蒙开发-端云一体化--云数据库
  • [spring-cloud: 负载均衡]-源码分析
  • Nginx服务做负载均衡网关
  • 【项目实践】在系统接入天气api,根据当前天气提醒,做好plan
  • 基于Java的AI工具和框架
  • 【异常案例分析】使用空指针调用函数(非虚函数)时,没有崩溃在函数调用处,而是崩在被调用函数内部
  • Android Telephony 框架与横向支撑层
  • Android JUnit 测试框架详解:从基础到高级实践
  • Flask + HTML 项目开发思路
  • 开源的现代数据探索和可视化平台:Apache Superset 快速指南 Quickstart
  • Android的UI View是如何最终绘制成一帧显示在手机屏幕上?
  • 阿里云-通义灵码:解锁云原生智能开发新能力,让云开发更“灵”~
  • 福彩双色球第2025089期篮球号码分析
  • 理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事
  • 超急评估:用提前计算分摊性能成本
  • go学习笔记:panic是什么含义
  • 工作流绑定卡片优化用户体验-练习我要找工作智能体
  • 豆包1.6+PromptPilot实战:构建智能品牌评价情感分类系统的技术探索
  • 基于Spring Cloud Gateway和Resilience4j的微服务容错与流量控制实战经验分享