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

EasyExcel导出动态合并行单元格

  1. 继承RowWriteHandler
    import com.alibaba.excel.write.handler.RowWriteHandler;
    import com.alibaba.excel.write.handler.context.RowWriteHandlerContext;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import org.apache.poi.ss.util.CellRangeAddress;
    import java.util.List;
    import java.util.Map;@Data
    @AllArgsConstructor
    public class MergeRowSheetWriteHandler implements RowWriteHandler {// 合并的起始行:key:开始,value;结束private Map<Integer, Integer> map;// 要合并的列,如果需要合并的列不是每行都一样,针对此参数做调整;private List<Integer> cols;@Overridepublic void afterRowDispose(RowWriteHandlerContext context) {// 如果是head或者当前行不是合并的起始行,跳过if (context.getHead() || !map.containsKey(context.getRowIndex())) {return;}Integer endRow = map.get(context.getRowIndex());if (!context.getRowIndex().equals(endRow)) {// 编列合并的列,合并行for (Integer col : cols) {// CellRangeAddress(起始行,结束行,起始列,结束列)context.getWriteSheetHolder().getSheet().addMergedRegionUnsafe(new CellRangeAddress(context.getRowIndex(), endRow, col, col));}}}}
    
  2. 调用方法
    // 获取需要合并的行
    Map<Integer, Integer> mergeMap = new HashMap<>();
    List<DTO> dtoList= pageResult.getList();
    // 要合并的起始行
    int index = 2;
    for (DTO dto: dtoList) {for (SubDTO subDTO : dto.getSubList()) {mergeMap.put(index, index + dto.getSubList().getAccessoryList().size() - 1);index += dto.getSubList().size();}
    }
    // Arrays.asList(0, 1, 2, 3, 7, 8, 9) 是需要合并的列
    ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), clazz);write.registerWriteHandler(new MergeRowSheetWriteHandler(mapMerge, Arrays.asList(0, 1, 2, 3, 7, 8, 9)).sheet(sheetName).doWrite(dataList);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 原生冻结进程分析(U)
  • 数据仓库系列19:数据血缘分析在数据仓库中有什么应用?
  • 基础服务安装部署教程
  • UE 【材质编辑】自定义ShadingMode
  • [Labview]图片叠加下的表格视图拖拽功能:挖坑粗糙版
  • IP SSL证书——为IP升级加密
  • 力扣1235.规划兼职工作
  • 住宅代理将如何保护您的品牌?
  • 如何在 MySQL 中匹配列
  • 微电网光储充用什么电能表?
  • SpringBoot教程(二十七) | SpringBoot集成AOP实现异常处理
  • Kubernetes 1.20 上将容器从 Docker Engine 改为 Containerd
  • 视频智能分析打手机检测算法安防监控打手机检测算法应用场景、算法源码、算法模型介绍
  • 【杭州】目前就业情况-自述
  • Docker安装Neo4j图数据库和APOC插件
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Lsb图片隐写
  • Python十分钟制作属于你自己的个性logo
  • sessionStorage和localStorage
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Vim 折腾记
  • 力扣(LeetCode)21
  • 浅谈web中前端模板引擎的使用
  • 入口文件开始,分析Vue源码实现
  • 山寨一个 Promise
  • 什么软件可以剪辑音乐?
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 提醒我喝水chrome插件开发指南
  • 转载:[译] 内容加速黑科技趣谈
  • 自动记录MySQL慢查询快照脚本
  • Prometheus VS InfluxDB
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • # SpringBoot 如何让指定的Bean先加载
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #565. 查找之大编号
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (6)STL算法之转换
  • (7)svelte 教程: Props(属性)
  • (day18) leetcode 204.计数质数
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原)Matlab的svmtrain和svmclassify
  • (转)visual stdio 书签功能介绍
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • (自用)仿写程序
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net mvc总结
  • .NET 常见的偏门问题