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
相关产品推荐
相关产品推荐

