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

使用 Apache POI 实现 Excel 单元格合并

在日常工作中,Excel 是一个不可或缺的工具,尤其是在处理大量数据时。为了提升数据的可读性和美观性,我们经常需要对 Excel 中的单元格进行合并操作。本文将介绍如何使用 Apache POI 库在 Java 中实现 Excel 单元格的合并,并提供一个现成的工具类供大家使用。

工具类介绍

我们提供了一个名为 ExcelMergeUtility 的工具类,它可以帮助你轻松地合并 Excel 中的单元格。该类支持纵向合并(按行合并)和横向合并(按列合并),并且可以指定需要合并的列。

工具类代码

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.stereotype.Component;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;@Component
public class ExcelMergeUtility {/*** 合并Excel中内容相同的单元格** @param workbook       工作簿* @param sheetName      工作表名称* @param columnsToMerge 需要合并的列索引列表* @param isRowMerge     是否按行合并(纵向合并)* @param isColumnMerge  是否按列合并(横向合并)*/public void mergeCells(Workbook workbook, String sheetName, List<Integer> columnsToMerge,boolean isRowMerge, boolean isColumnMerge) {Sheet sheet = workbook.getSheet(sheetName);if (sheet == null) {throw new IllegalArgumentException("工作表 " + sheetName + " 不存在");}// 记录第一列的合并行数int firstColMergeEndRow = 0;for (int colIndex : columnsToMerge) {for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {Row currentRow = sheet.getRow(rowIndex);if (currentRow == null) continue;Cell currentCell = currentRow.getCell(colIndex);if (currentCell == null) continue;String currentValue = currentCell.getStringCellValue();if (isRowMerge) {// 纵向合并int mergeStartRow = rowIndex;while (rowIndex + 1 <= sheet.getLastRowNum()) {Row nextRow = sheet.getRow(rowIndex + 1);if (nextRow == null) break;Cell nextCell = nextRow.getCell(colIndex);if (nextCell == null || !nextCell.getStringCellValue().equals(currentValue)) break;// 如果当前列不是第一列,且合并行数超过前一列的合并行数,则停止合并if (colIndex > 0 && rowIndex + 1 > getMergeEndRow(sheet, mergeStartRow, colIndex - 1)) break;// 如果合并行数超过第一列的合并行数,则停止合并if (colIndex > 0 && rowIndex + 1 > firstColMergeEndRow) break;rowIndex++;}if (mergeStartRow != rowIndex) {sheet.addMergedRegion(new CellRangeAddress(mergeStartRow, rowIndex, colIndex, colIndex));}// 如果是第一列,记录合并的最后一行if (colIndex == 0) {firstColMergeEndRow = rowIndex;}}if (isColumnMerge) {// 横向合并int mergeStartCol = colIndex;while (colIndex + 1 < currentRow.getLastCellNum()) {Cell nextCell = currentRow.getCell(colIndex + 1);if (nextCell == null || !nextCell.getStringCellValue().equals(currentValue)) break;colIndex++;}if (mergeStartCol != colIndex) {sheet.addMergedRegion(new CellRangeAddress(rowIndex, rowIndex, mergeStartCol, colIndex));}}}}}/*** 获取指定单元格的合并的最后一行** @param sheet     工作表* @param rowIndex  行索引* @param colIndex  列索引* @return 合并的最后一行*/private int getMergeEndRow(Sheet sheet, int rowIndex, int colIndex) {int numMergedRegions = sheet.getNumMergedRegions();for (int i = 0; i < numMergedRegions; i++) {CellRangeAddress mergedRegion = sheet.getMergedRegion(i);if (mergedRegion.isInRange(rowIndex, colIndex)) {return mergedRegion.getLastRow();}}
//        for (CellRangeAddress mergedRegion : sheet.getMergedRegions()) {
//            if (mergedRegion.isInRange(rowIndex, colIndex)) {
//                return mergedRegion.getLastRow();
//            }
//        }return rowIndex; // 如果没有合并,则返回当前行}/*** 示例:生成Excel并合并单元格*/public void generateAndMergeExcel(String filePath, String sheetName, List<Integer> columnsToMerge,boolean isRowMerge, boolean isColumnMerge) throws IOException {// 打开现有的Excel文件Workbook workbook = WorkbookFactory.create(new FileInputStream(filePath));// 合并单元格mergeCells(workbook, sheetName, columnsToMerge, isRowMerge, isColumnMerge);// 写入文件try (FileOutputStream fileOut = new FileOutputStream(filePath)) {workbook.write(fileOut);}workbook.close();}
}

调用示例

List<Integer> columnsToMerge = Arrays.asList(0, 1, 2, 3, 4, 5); // 合并第1列和第2列
boolean isRowMerge = true; // 启用纵向合并
boolean isColumnMerge = false; // 禁用横向合并excelMergeUtility.generateAndMergeExcel("C:\\Users\\xxxx\\Downloads\\汇总记录2025-03-04%2B10_38_30.xls", "汇总", columnsToMerge, isRowMerge, isColumnMerge);

依赖配置

为了使用这个工具类,你需要在你的项目中添加 Apache POI 的依赖:

<!-- Apache POI 核心库 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency>
<!-- Apache POI OOXML 库,用于处理 .xlsx 文件 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>

在这里插入图片描述
在这里插入图片描述

总结

通过 ExcelMergeUtility 工具类,你可以轻松地实现 Excel 单元格的合并操作。无论是纵向合并还是横向合并,该工具类都能满足你的需求。希望本文对你有所帮助,欢迎在评论区分享你的使用体验和问题。


http://www.mrgr.cn/news/93138.html

相关文章:

  • 二百八十五、华为云PostgreSQL——建分区表并设置主键
  • 算法 并查集
  • 20道Redis面试题
  • 深入理解三色标记、CMS、G1垃圾回收器
  • LLM实践——DeepSeek技术报告学习(含实现逻辑梳理)
  • zipformer语音识别的部署
  • GPU/CUDA 发展编年史:从 3D 渲染到 AI 大模型时代
  • Kubernetes教程(三)Docker容器命令
  • 自学嵌入式第27天------TCP和UDP,URL爬虫
  • LeetCode 链表章节
  • Open3D 教程学习指南 (持续整理)
  • 基于 BERT 的抽取式摘要
  • DeepSeek-R1国产化系统gpu驱动+cuda+ollama+webui可视化离线私有化部署
  • BUU44 [BJDCTF2020]ZJCTF,不过如此1 [php://filter][正则表达式get输入数据][捕获组反向引用][php中单双引号]
  • 【c语言指针精选题】
  • stable-diffusion-webui 加载模型文件
  • 计算机网络——子网掩码
  • 解锁MacOS开发:环境配置与应用开发全攻略
  • 【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey
  • 专业 英语