当前位置: 代码网 > it编程>编程语言>Java > 使用Apache POI在Java中实现Excel单元格的合并

使用Apache POI在Java中实现Excel单元格的合并

2025年03月05日 Java 我要评论
在日常工作中,excel 是一个不可或缺的工具,尤其是在处理大量数据时。为了提升数据的可读性和美观性,我们经常需要对 excel 中的单元格进行合并操作。本文将介绍如何使用 apache poi 库在

在日常工作中,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 单元格的合并操作。无论是纵向合并还是横向合并,该工具类都能满足你的需求。

到此这篇关于使用apache poi在java中实现excel单元格的合并的文章就介绍到这了,更多相关apache poi合并excel单元格内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com