来源EasyExcel(根据条件动态合并单元格的重复数据)

package com.ustcinfo.fn.comp.complain.util;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;/*** 单元格合并** @author Jamin* @date 2020/11/9 11:35*/
@Data
public class ExcelFillCellMergeStrategy implements CellWriteHandler {/*** 合并字段的下标*/private int[] mergeColumnIndex;/*** 合并几行*/private int mergeRowIndex;public ExcelFillCellMergeStrategy() {}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) {}@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 > 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);}}}
}
//使用
.registerWriteHandler(new ExcelFillCellMergeStrategy([从第几行开始],[合并哪几列]))

easyExcel自动合并单元格相关推荐

  1. easyexcel读取合并单元格

    easyexcel读取合并单元格 文章目录 easyexcel读取合并单元格 一.设置读取额外信息 二.重写Listener中的extra()方法,获取合并单元格的信息 三.遍历合并单元格的信息 四. ...

  2. easyexcel处理合并单元格数据

    一.背景 一次工作任务是要解析excel数据,采用阿里的 easyexcel 工具进行解析,由于表格有合并单元格,但是 easyexcel 读取合并单元格只会读取一次,导致下面单元格数据为空,这样会影 ...

  3. easyexcel 动态合并单元格

    easyexcel 动态合并单元格 目前操作excel文档的底层都是用poi来进行的,在早期工作开发过程中,是基于poi,然后对每一个数据单元格进行操作代码编写,后面有一些比较好的开源项目,像easy ...

  4. java poi生成word 插入表格,图片,自动合并单元格,并且可以在已存在的word上追加

    poi版本选3.10以上的 要不然插入图片 word会打不开 <dependency><groupId>org.apache.poi</groupId><ar ...

  5. 记录【vxe-table】自动合并单元格

    <vxe-table@cell-click="handleClickCell":span-method="spanMethods" //自动合并单元格:d ...

  6. easyexcel读取合并单元格内容_一周一个小技巧 | excel不会核对内容?不会填充合并单元格?7个实用的EXCEL技巧,一起来看看吧...

    上方蓝色字,获取更多就业信息~ 1 两列姓名核对  如果要核对表二中的姓名在表一中有没有出现,一个公式马上搞定.=IF(COUNTIF(A:A,C2),"是","否&qu ...

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

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

  8. easyExcel中合并单元格文件读取实现方案

    1.需求场景描述 2.问题分析与实现方案 1.需求场景描述 现在有个业务需要按照指定模板上传选择题,并进行入表处理,使用easyExcel进行文件上传并读取数据,其中涉及合并单元数据读取问题,这里简单 ...

  9. poi导出excel,行相同数据自动合并单元格

    /***excel行自动合并*listData 待导出数据*/ public void test(SXSSFSheet sheet,List<FanManagerExt> listData ...

最新文章

  1. 北大教授吴玺宏:从发声到语言,具身物理模型让NLP回到小数据时代
  2. 【转】[C# 基础知识系列]专题四:事件揭秘
  3. php mysql生日提醒_基于AIML的PHP聊天机器人
  4. iOS 11.4.1 正式版越狱
  5. php websocket 是否在线_看完让你彻底理解WebSocket原理,附实战代码(包含前端和后端)...
  6. crud-table_我个人的CRUD故事-或我如何来到CUBA平台
  7. 数据又多又散,“孤岛困境”怎样破局?
  8. sql安装弹出sqlcmd_讨论使用SQLCMD和SQL Server代理进行备份和还原自动化
  9. linux 开启allow_url_fopen,如何开启allow_url_fopen函数
  10. Windows XP下使用 whoami 命令
  11. 张一鸣宣布卸任字节跳动CEO!
  12. 土地日度交易数据2000-2022
  13. 谷歌浏览器 performance 详解
  14. vue element上传额外参数
  15. 一个简单又诡异的互联网变现思维(抖音赚钱)
  16. this关键字及 this关键字的应用
  17. python-机器学习-随机森林算法
  18. 【117】基于完全同态加密的改进计算委托
  19. 常用JS图片滚动代码大全
  20. IEC 61000系列标准及其对应国标

热门文章

  1. 《Photoshop Lightroom5经典教程》—第1课1.5节修改和编辑
  2. electron隐藏默认菜单
  3. 什么是数据传输服务DTS
  4. 高数 | 【一元函数微分学】一元函数微分的本质 导数与微分的区别
  5. vue-cli4.0 配置CDN加速
  6. [易飞]税改之后个案如何支持自定义的税率变更
  7. [4G/5G/6G专题基础-158]: 5G VoNR(Voice over NR)与VoLTE共同组成5G三大语音方案
  8. JAVA 实现《飞机大战-I》游戏
  9. 人类“捉鬼”史:一部拍了几万年的灵异真人秀
  10. 耳切法处理多边形三角划分