我使用Find.HitHighlight
方法标记特定单词的所有匹配项。
另外,我想向用户显示单词,或滚动到它们,甚至只计算找到的单词数。
我目前正在使用此代码:
Word.Range range = Globals.ThisAddIn.Application.ActiveDocument.Range();
range.Find.HitHighlight(
FindText: "dog",
MatchCase: false, MatchWholeWord: true,
HighlightColor: item.color);
问题是,有没有办法可以使用Find.HitHighlight
方法或使用其他方法取回我提到的其中一个请求,或者除了使用以下代码之外别无选择:
var text = range.Text.Split(' ');
text.Count(word => word.Equals("dog"));
(我不想使用此代码,因为我相信有一种方法可以使用MSWord的工具而不是自己获取所有文本)
答案 0 :(得分:1)
Word对象模型中没有任何内容可以返回所有"命中"使用HitHighlight
找到。根据任何特定的属性,它通常不是为了返回非连续的Range集合而设计的。
如果您只想要计数,那么您已经拥有的C#代码可能是执行速度最快的。您丢失了任何格式和位置信息,但计数不重要。
对于其他任何事情,您需要在循环中执行常规Find.Execute
,将每个找到的Range
添加到数组(或其他)。例如,这将允许您向周围文本的用户显示列表。
在成功使用Range.Find
(而不是Document.Content.Find
)时,Range
对象包含找到的文本。这样的诀窍是,在成功找到重置范围以便继续之后。像这样的东西(从内存中输入,所以可能是语法错误):
Word.Range rngDoc = wrdDocument.Content;
Word.Range rngFind = rngDoc.Duplicate;
bool bFound = true;
var oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
while (bFound)
{
bFound = rngFind.Find.Execute(/*params here*/);
if (bFound)
{
//Do something with rngFind
//Set the start of the Range to search AFTER what was found
rngFind.Collapse(ref oCollapseEnd);
//and extend it to the end of the original Range
// in this case the entire document
rngFind.End = rngDoc.End;
}
}