You need to enable JavaScript to run this app. EPPlus在含垂直合并单元格的Excel表中正确插入行的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

EPPlus在含垂直合并单元格的Excel表中正确插入行的实现方法

问题背景

在已加载、带有垂直合并单元格的Excel表格中执行插行操作时,直接调用EPPlus默认的InsertRow方法无法得到预期效果,当前使用的代码为:

sheet.InsertRow(3, 1);
问题根因

EPPlus默认的InsertRow逻辑仅会移动普通单元格的内容与格式,不会自动联动调整受影响的合并单元格范围,最终就会出现合并区域错位、内容显示异常的问题。

实现方案

需要在执行默认插行操作后,手动同步调整所有受影响的合并单元格范围,具体代码实现如下:

  • 定义插行参数,执行基础插行逻辑
    // 在第3行位置插入1行,原第3行及以下内容自动下移
    int insertRowPosition = 3;
    int insertRowCount = 1;
    sheet.InsertRow(insertRowPosition, insertRowCount);
    
  • 遍历所有合并单元格,同步调整合并范围
    反向遍历工作表的所有合并区域,只要合并区域的起始行号 ≥ 插入位置的行号,就将整个合并区域向下偏移对应的插入行数:
    // 反向遍历合并单元格集合,避免遍历过程中索引错位
    for (int i = sheet.MergedCells.Count - 1; i >= 0; i--)
    {
        // 解析原有合并区域的地址
        ExcelAddress oldMergeAddress = new ExcelAddress(sheet.MergedCells[i]);
        // 仅处理起始行在插入位置及更下方的合并区域
        if (oldMergeAddress.StartRow >= insertRowPosition)
        {
            // 先取消原有合并
            sheet.UnMerge(oldMergeAddress.Address);
            // 计算偏移后的新合并范围
            int newStartRow = oldMergeAddress.StartRow + insertRowCount;
            int newEndRow = oldMergeAddress.EndRow + insertRowCount;
            // 重新应用合并
            sheet.Cells[newStartRow, oldMergeAddress.StartColumn, newEndRow, oldMergeAddress.EndColumn].Merge = true;
        }
    }
    
操作注意事项
  • 必须反向遍历合并单元格集合,否则在遍历过程中修改合并列表会导致索引错乱
  • 如果插入位置落在某个垂直合并单元格的中间行范围内,需要提前拆分该合并区域,插行完成后再按新的边界重新合并,否则会出现合并范围断裂的问题
  • 该逻辑可通用到批量插入多行的场景,仅需修改insertRowCount为对应插入的行数即可

内容的提问来源于stack exchange,提问作者sada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 17:45:08