You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#读取含合并行的Word表格内容时枚举器无法访问问题求助

解决C#读取Word显示合并行的问题

核心问题分析

你遇到的枚举器异常,本质是Word对象模型中,显示设置合并的行(非手动合并单元格的行)实际处于隐藏/行高为0的特殊状态,直接遍历tbl.Rows集合时,Word的COM对象会因行的异常状态触发集合访问错误。而手动合并行属于单元格层面的结构合并,不属于特殊状态,所以能正常遍历。

可行解决方案

1. 先将行集合转为数组,规避枚举器异常

直接遍历Rows集合时,Word的COM对象可能因行状态的隐性变化抛出异常,先把所有行转成强类型数组,再遍历数组就能解决这个问题:

using Microsoft.Office.Interop.Word;
using System.Linq;

// 假设tbl是你的目标Table对象
Row[] allRows = tbl.Rows.Cast<Row>().ToArray();

foreach (Row row in allRows)
{
    // 遍历行内单元格
    foreach (Cell cell in row.Cells)
    {
        // 去除Word单元格末尾自带的特殊换行/结束符
        string cellContent = cell.Range.Text.TrimEnd('\r', '\a');
        // 处理单元格内容,比如输出或存储
        Console.WriteLine(cellContent);
    }
}

2. 直接读取隐藏/显示合并的行

这类显示合并的行通常是被设置了Hidden属性或行高为0,无需修改显示设置,代码可以直接读取内容:

  • 可通过row.Hidden属性判断行是否被隐藏(返回bool值)
  • 无论行是否隐藏,直接访问row.Range.Text或单元格内容即可获取数据

3. 处理跨多行合并的单元格

如果是单元格跨多行合并导致视觉上行合并,可通过Cell.RowSpan属性判断单元格的跨行范围,避免重复读取内容:

foreach (Row row in allRows)
{
    foreach (Cell cell in row.Cells)
    {
        if (cell.RowSpan > 1)
        {
            // 仅在单元格所在的第一行读取内容
            if (cell.RowIndex == row.Index)
            {
                string cellContent = cell.Range.Text.TrimEnd('\r', '\a');
                Console.WriteLine(cellContent);
            }
        }
        else
        {
            string cellContent = cell.Range.Text.TrimEnd('\r', '\a');
            Console.WriteLine(cellContent);
        }
    }
}

额外注意

  • 确保引用正确的Microsoft.Office.Interop.Word程序集,推荐通过NuGet安装对应包
  • 操作完成后务必释放Word COM对象,避免内存泄漏:
using System.Runtime.InteropServices;

// 依次释放单元格、行、表格、文档、Word应用对象
Marshal.ReleaseComObject(cell);
Marshal.ReleaseComObject(row);
Marshal.ReleaseComObject(tbl);
Marshal.ReleaseComObject(doc);
Marshal.ReleaseComObject(app);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:32:56