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

