EasyExcel导出动态合并行单元格

ops/2024/10/19 15:40:08/
  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);


http://www.ppmy.cn/ops/104576.html

相关文章

Linux高级编程-进程间通信(IPC)

进程之间共享数据的方式可以通过进程通信&#xff1a; 1、古老的通信方式&#xff1a;无名管道 有名管道 信号 2、IPC对象通信 &#xff1a;消息队列(用的相对少&#xff0c;这里不讨论)、共享内存&#xff08;最高效&#xff09;、 信号量集 3、socket通信&…

SpringBoot中使用Redis-Lettuce

SpringBoot中使用Redis-Lettuce 配置pom在application.properties配置Redis参数协议参数设置序列化参数设置实现工具Redis操作工具类单条数据测试批量测试 在SpringBoot中一般直接引用spring-boot-starter-data-redis这个starter来使用Redis&#xff0c;其中具体实现方式有两种…

公司来了个大佬,把FullGC 40次/天优化为10天1次,太秀了~!

公司来了个大佬&#xff0c;把FullGC 40次/天优化为10天1次&#xff0c;太秀了~&#xff01; 本文主体内容为转载文章&#xff0c;请查看如上原文 零&#xff0c;分析与思考 如果自己遇到这个问题如何去排查问题&#xff0c;找原因&#xff0c;定最终处理方案 上文中主要说…

音视频-图像篇(YUV和RGB)

文章目录 一、图像基础概念二、YUV与RGB1.YUV分类方式2.YUV“空间-间”的数据划分1&#xff09;UV按照“空间-间”的划分方式&#xff0c;分为YUV444、YUV422、YUV4202&#xff09;YUV“空间-内”的数据划分 3.RGB 三、比较JPG、PNG、GIF、BMP图片格式 一、图像基础概念 像素&…

【精选】基于HTML5技术应用于智能宠物寻找与领养系统的设计与实现(全网独一无二,阿龙独创)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

学习记录:js算法(二十一):字符串的排列、替换后的最长重复字符

文章目录 字符串的排列我的思路网上思路 替换后的最长重复字符我的思路网上思路 总结 字符串的排列 给你两个字符串 s1 和 s2 &#xff0c;写一个函数来判断 s2 是否包含 s1 的排列。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 换句话说&#xff…

网络:IPv6

对于IPv6其实一直都不算怎么了解&#xff0c;最近在这方面遇到了些问题&#xff0c;所以特意看了一下&#xff0c;做个学习笔记。 1.ipv6地址的格式 ipv6是由128位比特组成&#xff0c;通常将其分为8组&#xff0c;每组有4个16进制数字&#xff0c;组与组之间通过":&quo…

【秋招笔试】8.21华为秋招-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…