关于EasyExcel 合并单元格方法该如何实现

在做一个业务的导出,目前遇到一个需求,如下图:
在这里插入图片描述

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.*;
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() {}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) {Workbook workbook = writeSheetHolder.getSheet().getWorkbook();CellStyle cellStyle = workbook.createCellStyle();Font cellFont = workbook.createFont();
//加粗cellFont.setBold(true);
//字体大小cellFont.setFontHeightInPoints((short) 12);
//居中cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setFont(cellFont);cell.setCellStyle(cellStyle);
//设置 自动换行cellStyle.setWrapText(true);}@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);}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在mt5上哪里可以添加指数品种?

在MT5交易平台上&#xff0c;您可以通过以下步骤添加指数品种&#xff08;如股票指数、商品指数等&#xff09;到您的市场观察窗口中&#xff1a; Exness手机登录平台学习指南 步骤一&#xff1a;打开市场观察窗口&#xff1a; 打开MT5交易平台。 在左侧的“市场观察”窗口中&…

高集成高能效FAN21SV04MPX 单输入集成同步降压调节器技术解析

FAN21SV04MPX 是一款高效、小型、可编程频率的 4 A 集成同步降压调节器。FAN21SV04MPX 采用经过优化的互联方式将同步MOSFET和控制器/驱动器包含在一个封装中&#xff0c;使得设计人员能够使用最少的外部元件&#xff0c;在较小面积中满足高电流要求&#xff0c;从而降低成本。…

Python列表去重且不改变元素顺序的代码

Python列表去重且不改变元素顺序的方法 Python列表去重&#xff0c;如果不考虑原来元素的顺序&#xff08;基本顺序&#xff09;的话&#xff0c;可以使用Python内置的set()函数对列表进行转换去重&#xff0c;然后转换会列表&#xff0c;这是因为set()集合本身就具备去重的功…

利用Spark构建房价分析与推荐系统:基于58同城数据的大数据实践

利用Spark构建房价分析与推荐系统&#xff1a;基于58同城数据的大数据实践 基于Spark的房价数据分析预测推荐系统引言技术栈功能概述项目实现1. 数据爬取与处理2. 大数据分析与可视化3. 房价预测模型4. 协同过滤推荐系统5. Web应用开发6. 数据管理与用户管理 总结与展望 基于Sp…

docker学习(十一、Redis集群存储数据方式)

文章目录 一、集群数据存储1.单机连接集群问题2.集群方式连接redis存储数据 二、 查看集群信息 docker搭建Redis集群相关知识&#xff1a; docker学习&#xff08;九、分布式存储亿级数据知识&#xff09; docker学习&#xff08;十、搭建redis集群&#xff0c;三主三从&#x…

Mysql允许局域网或外部网络访问

1、配置服务器监听 首先&#xff0c;应该让服务器监听想要共享的ip地址。 (1) windows找到安装路径下的 my.ini&#xff1b; (2) linux 找到安装路径下的 my.cnf&#xff1b; [mysqld] bind_address0.0.0.0 # 8.0.22版本之前&#xff0c;只支持设置一个地址(*, 0.0.0.0, or …

桥接和享元模式(结构型设计模式)的 C++ 代码示例模板

文章目录 前言代码仓库桥接模式&#xff08;Bridge&#xff09;享元模式&#xff08;Flyweight&#xff09;总结参考资料作者的话 前言 桥接和享元模式&#xff08;结构型设计模式&#xff09;的 C 代码示例模板。 代码仓库 yezhening/Programming-examples: 编程实例 (githu…

MAC苹果笔记本电脑如何彻底清理垃圾文件软件?

苹果电脑以其流畅的操作系统和卓越的性能而备受用户喜爱。然而&#xff0c;随着时间的推移&#xff0c;系统可能会积累大量垃圾文件&#xff0c;影响性能。本文将介绍苹果电脑怎么清理垃圾文件的各种方法&#xff0c;以提升系统运行效率。 CleanMyMac X是一款专业的Mac清理软件…

【音视频 | AAC】AAC音频编码详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

geemap学习笔记031:使用Earth Engine数据--FeatureCollection

前言 本节将会详细的介绍一下Earth Engine数据类型FeatureCollection的加载、创建、Filtering、可视化等等。 1 导入库并显示地图 import ee import geemap ee.Initialize()2 加载FeatureCollection Map geemap.Map() fc ee.FeatureCollection(TIGER/2016/Roads) #加载Ro…

re:Invent 2023技术上新|Amazon Bedrock现提供对Anthropic最新模型Claude 2.1访问权限

亚马逊云科技已在 Amazon Bedrock 中推出 Anthropic 的 Claude 2.1 基础模型&#xff08;FM&#xff09;。此前&#xff0c;Anthropic 推出了其最新模型 Claude 2.1&#xff0c;此模型为企业提供了一些关键功能&#xff0c;如业界领先的 200,000 个令牌化上下文窗口&#xff08…

vivado 约束条件效率

约束条件效率 审查约束覆盖范围编写时间约束时&#xff0c;重要的是保持约束的简单性并指定它们仅在相关网表对象上。低效的约束导致更大的运行时间和更大的内存消耗。低效的约束也可能导致设计受到不适当的约束&#xff0c;因为定时异常可能会意外地覆盖比预期更多的路径&…

谈谈微服务的Ribbon知识点

Ribbon负载均衡 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。(负载均衡RestTemplate调用)&#xff0c;在服务调用过程中的负载均衡一般使用SpringCloud的Ribbon 组件实现 , Feign的底层已经自动集成了Ribbon , 使用起来非常简单。 Configuration…

[Halcon模块] Halcon13.0查询算子模块归属

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

案例082:基于微信小程序的跑腿管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

nginx upstream 6种负载均衡策略介绍

upstream参数 参数描述service反向服务地址加端口weight权重max_fails失败多少次&#xff0c;认为主机已经挂掉&#xff0c;踢出fail_timeout踢出后重新探测时间backup备用服务max_conns允许最大连接数slow_start当节点恢复&#xff0c;不立即加入 负载均衡策略 轮询&#x…

js原生点击按钮复制内容到粘贴板/修复(事件监听之后,原页面上组合键/右键不能复制到粘贴板)

前言: 有个小需求,需要写成组件,在当前页面多次重复写的一个icon,点击复制当前内容到粘贴板,为了方便封装成组件了,具体就不在这赘述了 注意: 原生的粘贴方法里面不能去放异步操作,会失效 最好在父组件确定字段,直接一次性拿到所有内容 啰啰嗦嗦的独白: 可看可不看(因为我是详情…

HarmonyOS概述

HarmonyOS概述 HarmonyOS系统架构 内核层—系统服务层—框架层—应用层 内核层&#xff1a; 内核子系统: HarmonyOS采用多内核设计&#xff0c;支持针对不同资源受限设备 &#xff0c;选用适合的OS内核&#xff0c;为上层提供基础操作系统能力。驱动子系统: 硬件驱动框架(H…

3-10岁孩子语文能力培养里程碑

文章目录 基础能力3岁4岁5岁6-7岁&#xff08;1-2年级&#xff09;8-9岁&#xff08;3-4年级&#xff09;10岁&#xff08;5年级&#xff09; 阅读推荐&父母执行3岁4-5岁6-7岁&#xff08;1-2年级&#xff09;8-9岁&#xff08;3-4年级&#xff09;10岁&#xff08;5年级&a…

ChatGLM3-6B 的调用参数说明,chat 与stream_chat 接口函数的参数说明

ChatGLM3-6B 是一个语言大模型&#xff0c;最近在评估这个模型&#xff0c;但发现它的文档有限&#xff0c;只能从demo代码中猜测调用的参数的含义&#xff0c;准确度是有限的&#xff1b;于是&#xff0c;通过查看源代码来研究&#xff0c;目前整理笔记如下&#xff1a; Chat…