合并行:

import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import lombok.Data;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.List;/*** 合并单元格*/
@Data
public class ExcelFillCellMergeStrategy implements CellWriteHandler {/*** 合并字段的下标*/private int[] mergeColumnIndex;/*** 合并几行*/private int mergeRowIndex;public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) {this.mergeRowIndex = mergeRowIndex;this.mergeColumnIndex = mergeColumnIndex;}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Head head, Integer integer, Integer integer1, Boolean aBoolean) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,Head head, Integer integer, Boolean aBoolean) {}public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {//当前行int curRowIndex = cell.getRowIndex();//当前列int curColIndex = cell.getColumnIndex();if (curRowIndex > mergeRowIndex) {for (int i = 0; i < mergeColumnIndex.length; i++) {if (curColIndex == mergeColumnIndex[i]) {mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);break;}}}}private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {//获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() :cell.getNumericCellValue();Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() :preCell.getNumericCellValue();// 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行if (curData.equals(preData)) {Sheet sheet = writeSheetHolder.getSheet();List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();boolean isMerged = false;for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {CellRangeAddress cellRangeAddr = mergeRegions.get(i);// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {sheet.removeMergedRegion(i);cellRangeAddr.setLastRow(curRowIndex);sheet.addMergedRegion(cellRangeAddr);isMerged = true;}}// 若上一个单元格未被合并,则新增合并单元if (!isMerged) {CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex,curColIndex);sheet.addMergedRegion(cellRangeAddress);}}}
}

合并列:

import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.List;/*** 自定义合并某行某列*/
public class ExcelFillCellMergePrevCol implements CellWriteHandler {/*** 合并字段的下标*/private int[] mergeColumnIndex;//合并哪一行private int row;//合并多少列private  int num;public ExcelFillCellMergePrevCol(int[] mergeColumnIndex, int row, int num) {this.mergeColumnIndex = mergeColumnIndex;this.row = row;this.num = num;}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {//当前行int curRowIndex = cell.getRowIndex();//当前列int curColIndex = cell.getColumnIndex();//合并最后一行指定列if (curRowIndex == row) {for (int i = 0; i < mergeColumnIndex.length; i++) {if (curColIndex == mergeColumnIndex[i]) {// 合并最后一行 ,列mergeWithPrevCol(writeSheetHolder, cell, curRowIndex, curColIndex);}}}}private void mergeWithPrevCol(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {Sheet sheet = writeSheetHolder.getSheet();CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, curRowIndex, curColIndex, curColIndex + num);sheet.addMergedRegion(cellRangeAddress);}}

easyExcel合并单元格策略相关推荐

  1. EasyExcel合并单元格策略样例

    EasyExcel合并单元格策略样例 运行示例 处理前: 处理后: 说明 本次使用的是一次性绝对合并策略: List<OnceAbsoluteMergeStrategy> mergeStr ...

  2. Web中的EasyExcel导出Excel(不创建对象且自定义合并单元格策略)

    Web中的EasyExcel导出Excel(不创建对象且自定义合并单元格策略) 适用于多张表(只查单表数据就用创建对象那种方法) Controller @RequestMapping(value = ...

  3. EasyExcel合并单元格,通过注解方式实现自定义合并策略

    EasyExcel合并单元格,通过注解方式实现自定义合并策略 简介 今天博主探讨如何实现EasyExcel自定义实现单元格合并策略,考虑需要抽象代码.适用于更多的业务场景,提供了两个工具类,参考过很多 ...

  4. easyexcel 合并单元格

    easyexcel 合并单元格 ********************* 相关注解 ContentLoopMerge:标注在字段上 @Target({ElementType.FIELD}) @Ret ...

  5. EasyExcel合并单元格(同列相同数据合并)

    合并后效果如下: 合并策略代码: public class CustomMergeStrategy extends AbstractMergeStrategy {/*** 分组,每几行合并一次*/pr ...

  6. EasyExcel合并单元格

    文章目录 需求 思考 实现 需求 EasyExcel默认情况下写Excel是一行一行的,单元格不会自动合并,现在需求是合并这几列中相同的数据 思考 开始自己也不想做过多改动代码,经过阅读EasyExc ...

  7. EasyExcel合并单元格(一)

    前言 导出excel,介绍如何使用LoopMergeStrategy实现简单的合并 效果 每隔2行,合并一次 横向合并 横向和纵向合并 实现 导入依赖 <!-- https://mvnrepos ...

  8. 阿里开源 Easy-Excel合并单元格数据

    最终效果图 废话不多说,直接上代码 导入阿里云依赖jar包 封装实体类: 开始编写合并单元格: 组装数据的方法: 打完收工...欢迎大家来交流

  9. easyexcel 列头合并_2020-05-19:EasyExcel自定义合并单元格

    public static void writeExcelWithHeadAndData(OutputStream outputStream, List> head, List> body ...

最新文章

  1. python将图像转换为8位单通道_Python OpenCV读取16位单通道图像并转换为8位灰度图显示...
  2. 内存分配_go内存分配管理
  3. HTML的布局的小秘密
  4. Codeforces 603A Alternative Thinking
  5. 物理化学 化学 动力学(上)
  6. 关键词分词工具_快图制作工具 | 如何制作词云图?
  7. 快速入门 Jupyter notebook
  8. HTTP响应码及其含义
  9. C++ const与static
  10. html网页设计插件,适用于网页设计的Photoshop插件包
  11. 双线性对在密码学中的应用(上)
  12. java图形验证码去除干扰,使用python 对验证码图片进行降噪处理
  13. centos7安装ifconfig命令
  14. KubeEdge环境搭建(支持网络插件flannel)
  15. CentOS7 Java应用文件名乱码问题解决(文件下载和创建文件导致的文件名乱码)
  16. QQ音乐播放器-jQuery实现
  17. 笔试总结——0310华为软笔C++
  18. 世界美好与你环环相扣_吉他谱_C调简单版
  19. 微型计算机的软 硬件组成,微型计算机的软、硬件组成及主要性能指标
  20. PHP广告横幅在线制作网站源码

热门文章

  1. 天龙八部玄武岛BOSS
  2. 从3dMax导出供threeJS使用的带动作模型与加载(认真修改详尽版)
  3. Cesium实时目标跟踪最新特效教程系列1—实时发亮直线跟踪移动目标
  4. 兰州工业学院有计算机专业,兰州工业学院计算机协会
  5. python复制word段落_使用python将整个word文档(包括表)复制到另一个
  6. pica8公司和picOS
  7. 互联网从业必备-历史最全互联网黑话词汇表分享
  8. 马哥学习----李洋个人笔记--启动故障排除
  9. 企业微信批量操作工具1.0
  10. angular ngRoute