在一样平常工作中,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 单元格的归并操作。无论是纵向归并还是横向归并,该工具类都能满足你的需求。盼望本文对你有所资助,欢迎在评论区分享你的使用体验和问题。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |