当前位置: 首页 > news >正文

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

easyexcel

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

监听器

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

maven版本依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version>
</dependency>
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 {@Overridepublic 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));}}}}
}

测试

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);}@Datapublic static class ValvePoint implements Serializable {@ExcelProperty(value = "名称")private String name;@ExcelProperty(value = "日期")private String day;@ExcelProperty(value = "状态")private String status;}
}

效果

合并前:
合并前
合并后:
合并后

http://www.dtcms.com/a/457058.html

相关文章:

  • 整体设计 逻辑系统程序 之18 Source 容器(Docker)承载 C/P/D 三式的完整设计与双闭环验证 之2
  • 汽车保险网站简历模板大学生
  • 基于pytest的接口测试
  • 阿里巴巴做网站需要多少钱镇江vi设计
  • 嵌入式Linux(以泰山派无 eMMC 版为例,嘉立创给的Linux镜像有问题!)系统报错磁盘不够但我用的是32G不可能不够怎么解决
  • 开源一个本地AI知识库
  • js哈哈哈哈哈哈哈哈哈哈
  • 做外汇都要看什么网站多元网站建设
  • 一些主要应用和NAT
  • AI编程开发系统028-基于Vue+SpringBoot的宠物领养系统系统(源码+部署说明+演示视频+PPT+lw)
  • MySQL连接池原理与网站数据流动(了解)
  • Hadess入门到实战(8) - 如何管理Go制品
  • 最短路径问题总结
  • 建设银行网站为什么登不上门头设计
  • NX543NX551美光SSD固态闪存NX552NX564
  • 倍增:快速幂
  • 网站关键词快速排名工具网站建设项目可行性分析
  • 开源AI智能名片链动2+1模式S2B2C商城小程序在现代营销运营中的应用与实践
  • 自然语言处理分享系列-词向量空间中的高效表示估计(二)
  • 开发Bug——U盘插入断网
  • 开源 C++ QT QML 开发(十)通讯--串口
  • BMS(电池管理系统)的主要功能和架构简述
  • asp业务网站视频链接生成器
  • Flask模板中使用React、ant-design、@ant-design/icons示例模板
  • 站长源码之家网络营销中常用的营销策略
  • JAVA算法练习题day35
  • 德州做网站施工企业准则
  • 深圳网站建设十强河北省城乡住房和城乡建设厅网站
  • 数字增量式编码器:工业自动化的“精密神经元”
  • Spring AI-流式编程