VSTO中使用Range.Find遍历Word文档时如何跳过表格?
解决方案:跳过Word表格内容进行Range.Find遍历排版
首先,我注意到你代码里的一个关键拼写错误——你用了WdInformation.wdWithInTable,但正确的枚举值应该是WdInformation.wdWithinTable(是Within而不是WithIn),这就是你之前的判断失效的主要原因!
修正这个拼写问题后,就能正确识别表格内的Range并跳过排版操作。下面是调整后的完整代码:
Range sRange = Globals.ThisAddIn.Application.Selection.Range; Range fR = wordDoc.Range(sRange.Start, sRange.End); fR.Find.ClearFormatting(); fR.Find.Text = "[a-zA-Z0-9]{1,}"; fR.Find.Replacement.ClearFormatting(); fR.Find.MatchWildcards = true; fR.Find.Forward = true; object missing = Type.Missing; // 首次执行查找 fR.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); while (fR.Find.Found) { int rs = fR.Start; int re = fR.End; if (rs > sRange.End || re < sRange.Start) break; // 修正拼写错误,正确判断当前Range是否在表格内 if (fR.Information[WdInformation.wdWithinTable]) { // 跳过表格内容,直接执行下一次查找 fR.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); continue; } // 对非表格内的文本执行排版操作 fR.Font.Size = (float)tsd.content.enfont.size; fR.Font.Name = tsd.content.enfont.face; // 执行下一次查找 fR.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); }
额外的严谨性优化(可选)
如果你的查找规则可能匹配到跨表格边界的文本(比如部分在表格内,部分在表格外),可以进一步检查Range的起始和结束位置是否都不在表格内:
// 创建两个小Range分别检查起始和结束位置 Range startRange = wordDoc.Range(rs, rs); Range endRange = wordDoc.Range(re, re); if (startRange.Information[WdInformation.wdWithinTable] || endRange.Information[WdInformation.wdWithinTable]) { fR.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); continue; }
这样可以确保只有完全位于表格外的文本才会被排版,避免部分跨越表格的文本被错误修改。
内容的提问来源于stack exchange,提问作者Qiang.Peng
相关产品推荐
相关产品推荐

