Java采用easyexcel组件进行excel表格单元格的自动合并

本文主要是对excel文档中的所有sheet页中,将相同列的相同单元格值进行合并(按列合并),使用Java语言结合easyexcel组件实现。

监听器

采用com.alibaba.excel.write.handler.AbstractWorkbookWriteHandler进行操作

maven版本依赖

xml 复制代码
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>easyexcel</artifactId>
	<version>2.2.7</version>
</dependency>
java 复制代码
import com.alibaba.excel.write.handler.AbstractWorkbookWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.google.common.base.Objects;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

/**
 * 按列进行合并单元格
 */
public class ExcelColumnMergeListener extends AbstractWorkbookWriteHandler {

	@Override
	public void afterWorkbookDispose(WriteWorkbookHolder writeWorkbookHolder) {
		int numberOfSheets = writeWorkbookHolder.getWorkbook().getNumberOfSheets();
		for(int s = 0; s < numberOfSheets; s++) {
			Sheet sheet = writeWorkbookHolder.getWorkbook().getSheetAt(s);
			int firstRowNum = sheet.getFirstRowNum();
			int lastRowNum = sheet.getLastRowNum();
			Row row = sheet.getRow(firstRowNum);
			short firstCellNum = row.getFirstCellNum();
			short lastCellNum = row.getLastCellNum();
			for(int i = firstCellNum;i < lastCellNum; i++) {
				String value =  null;
				int startRow =  firstRowNum;
				int endRow =  firstRowNum;
				boolean findSame = false;
				for (int j = firstRowNum;j <= lastRowNum; j++) {
					sheet.getRow(j).getCell(i).getCellTypeEnum();
					String stringCellValue = sheet.getRow(j).getCell(i).getStringCellValue();
					if(Objects.equal(value, stringCellValue)) {
						endRow = j;
						findSame = true;
					} else {
						if(findSame) {
							// 说明之前是找到了相同的,则添加合并
							sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, i, i));
							findSame = false;
						}
						// 不相等
						value = stringCellValue;
						startRow = j;
						endRow = j;
					}

				}
				if(findSame) {
					// 说明之前是找到了相同的,则添加合并
					sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, i, i));
				}
			}
		}
	}
}

测试

java 复制代码
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;


public class EasyExcelMergeTest {

	public static void main(String[] args) {
		List<ValvePoint> vps2 = new ArrayList<>();
		ValvePoint vp21 = new ValvePoint();
		vp21.setName("PC");
		vp21.setDay("2025-3-1");
		vp21.setStatus("DOING");
		vps2.add(vp21);
		vps2.add(vp21);
		ValvePoint vp22 = new ValvePoint();
		vp22.setName("OTS1");
		vp22.setDay("2025-4-1");
		vp22.setStatus("TODO");
		vps2.add(vp22);
		ValvePoint vp23 = new ValvePoint();
		vp23.setName("OTS2");
		vp23.setDay("2025-4-1");
		vp23.setStatus("TODO");
		vps2.add(vp23);

		ValvePoint vp24 = new ValvePoint();
		vp24.setName("OTS3");
		vp24.setDay("2025-6-1");
		vp24.setStatus("2025-6-1");
		vps2.add(vp24);

		EasyExcel.write("D:\\test\\test1.xlsx", ValvePoint.class).sheet("测试")
				.doWrite(vps2);


		EasyExcel.write("D:\\test\\test1-merge.xlsx", ValvePoint.class).sheet("测试")
				.registerWriteHandler(new ExcelColumnMergeListener())
				.doWrite(vps2);
	}

	@Data
	public static class ValvePoint implements Serializable {
		@ExcelProperty(value = "名称")
		private String name;
		@ExcelProperty(value = "日期")
		private String day;
		@ExcelProperty(value = "状态")
		private String status;
	}
}

效果

合并前:

合并后:

相关推荐
蛋蛋的就会顺顺的8 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8268 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡8 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
死磕音视频9 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
伯恩bourne10 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_10 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs11 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲11 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog11 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户212968352616811 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm