如何使用

// 0,1 表示 对1,2列启用合并策略
 EasyExcel.write(fileName, Model.class)
          .registerWriteHandler(new MergeStrategy(data().size(),0,1)) 
          .sheet("通用合并行策略")
          .doWrite(data());

代码实现

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import org.apache.commons.collections.map.HashedMap;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.*;public class MergeStrategy extends AbstractMergeStrategy {// 合并的列编号,从0开始,指定的index或自己按字段顺序数private Set<Integer> mergeCellIndex = new HashSet<>();// 数据集大小,用于区别结束行位置private Integer maxRow = 0;// 禁止无参声明private MergeStrategy() {}public MergeStrategy(Integer maxRow, int... mergeCellIndex) {Arrays.stream(mergeCellIndex).forEach(item -> {this.mergeCellIndex.add(item);});this.maxRow = maxRow;}// 记录上一次合并的信息private Map<Integer, MergeRange> lastRow = new HashedMap();// 每行每列都会进入,绝对不要在这写循环@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {int currentCellIndex = cell.getColumnIndex();// 判断该行是否需要合并if (mergeCellIndex.contains(currentCellIndex)) {String currentCellValue = cell.getStringCellValue();int currentRowIndex = cell.getRowIndex();if (!lastRow.containsKey(currentCellIndex)) {// 记录首行起始位置lastRow.put(currentCellIndex, new MergeRange(currentCellValue, currentRowIndex, currentRowIndex, currentCellIndex, currentCellIndex));return;}//有上行这列的值了,拿来对比.MergeRange mergeRange = lastRow.get(currentCellIndex);if (!(mergeRange.lastValue != null && mergeRange.lastValue.equals(currentCellValue))) {// 结束的位置触发下合并.// 同行同列不能合并,会抛异常if (mergeRange.startRow != mergeRange.endRow || mergeRange.startCell != mergeRange.endCell) {sheet.addMergedRegionUnsafe(new CellRangeAddress(mergeRange.startRow, mergeRange.endRow, mergeRange.startCell, mergeRange.endCell));}// 更新当前列起始位置lastRow.put(currentCellIndex, new MergeRange(currentCellValue, currentRowIndex, currentRowIndex, currentCellIndex, currentCellIndex));}// 合并行 + 1mergeRange.endRow += 1;// 结束的位置触发下最后一次没完成的合并if (relativeRowIndex.equals(maxRow - 1)) {MergeRange lastMergeRange = lastRow.get(currentCellIndex);// 同行同列不能合并,会抛异常if (lastMergeRange.startRow != lastMergeRange.endRow || lastMergeRange.startCell != lastMergeRange.endCell) {sheet.addMergedRegionUnsafe(new CellRangeAddress(lastMergeRange.startRow, lastMergeRange.endRow, lastMergeRange.startCell, lastMergeRange.endCell));}}}}
}class MergeRange {public int startRow;public int endRow;public int startCell;public int endCell;public String lastValue;public MergeRange(String lastValue, int startRow, int endRow, int startCell, int endCell) {this.startRow = startRow;this.endRow = endRow;this.startCell = startCell;this.endCell = endCell;this.lastValue = lastValue;}
}

easyExcel 使用策略实现 单元格 合并相关推荐

  1. easyexcel内容追加与单元格合并

    这里的需求是,如果表格不存在,则新建表格,并填入数据,如果表格存在,那么就追加内容,并且支持单元格合并. 内容追加,需要分两种方式插入,第一种就是没有表格,需要生成表头,并且插入内容,第二种就是已经有 ...

  2. EasyExcel 动态表头 + 数据单元格合并

    前言 本文想要达到以及最终实现的效果: 要实现这种效果,包含两个部分的操作: 1. 动态表头 EasyExcel 生成 Excel 时要使表头有合并效果,可以采用**注解和非注解(动态表头)**的方法 ...

  3. easyexcel复杂表格---包含单元格合并,表格标题,以及自定义字段写入

    工作当中,遇到一个需要复杂表格的设计,第一次用easyexcel,在这里记录一下,看到的小伙伴大家一起进步. 需求 话不多说直接上图,大概就是需要这种格式的excel,根据选择下载的个数分成多个she ...

  4. 关于使用EasyExcel进行单元格合并的问题

    关于使用EasyExcel进行单元格合并的问题 1.项目场景: 简介:报销单导出要根据指定的excel模板去自动替换对应,然后重新生成一份新的excel.在给定的excel模板中,有部分字段进行了单元 ...

  5. 【EasyExcel】EasyExcel列表填充数据时指定单元格合并

    EasyExcel列表填充数据时指定单元格合并 package com.susing.security.handler;import com.alibaba.excel.metadata.CellDa ...

  6. EasyExcel对列同类项进行单元格合并

    EasyExcel对列同类项进行单元格合并 <dependency><groupId>com.alibaba</groupId><artifactId> ...

  7. EasyExcel:利用模板进行填充字段,生成公式处理,监听单元格填充后触发事件,相同日期单元格合并

    EasyExcel EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址:https://github.c ...

  8. 阿里 easyExcel 动态写入数据,多级表头,单元格合并示例

    excel写入流程 public static void main(String[] args) throws Exception {//标题List<List<String>> ...

  9. EasyExcel v2.1.6单元格样式设置

    EasyExcel v2.1.6单元格样式设置 1.实体类代码 2.注解类 3.自定义注解类实现 4.导出Excel文件实现类 使用AlibabaEasyExcel v2.1.6导出excel文件,的 ...

最新文章

  1. jquery 实现表单验证功能代码(简洁)
  2. windows terminal 笔记
  3. #4604. The kth maximum number(整体二分 + 树套树)
  4. PE文件感染和内存驻留
  5. matlab如何用代码导入文件_20+行Matlab代码实现文件扫描
  6. 使用NAS动态存储卷创建有状态应用
  7. Java基础---认识抽象类
  8. bootstrap-multiselect.js多选下拉框初始化时默认选中初始值
  9. 20150823 命令练习总结
  10. 刘逖:ETF市场迎来发展时机 可从产品创新等方面推动
  11. 【优化算法】世界杯优化算法(WCOA)【含Matlab源码 1427期】
  12. 【Android Audio 入门 五】--- AudioSW介绍
  13. 数据库索引原理及优化
  14. python之字符串(str)和编码
  15. elementUI 日 周 月 季 年 时间选择控件封装
  16. Linux运维学习路线
  17. SDK manger中只有几个配置????
  18. [爱情智慧]爱作的女人,最后都不怎么好!学会述情才能婚姻幸福!
  19. 一文彻底理解评分卡开发中——Y的确定(Vintage分析、滚动率分析等)
  20. 深度学习实战(六):从零开始实现表情识别

热门文章

  1. 2022年广东省房地产经纪人(房地产经纪业务操作)练习题及答案
  2. 身份证 护照等js校验
  3. RocksDB参数调优
  4. 显示器从30赫兹升60赫兹_吉赫兹ghz到底是什么意思
  5. system函数阻塞问题
  6. 第1本《如何才能快速阅读一本书?》
  7. WXB,柠檬什么时候熟的?
  8. 阿里云推荐码(wzrd94)
  9. linux学习需要什么基础,学linux需要什么基础?
  10. haskell入门教程[持续更新]