VSTO:计算所有Range.Find结果

时间:2018-05-01 18:57:50

标签: c# ms-word vsto

我使用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的工具而不是自己获取所有文本)

1 个答案:

答案 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;
  }
}