VSTO:计算所有 Range.Find 个结果
VSTO: Count all Range.Find results
我使用 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 的工具而不是自己拿走所有的文本)
Word 对象模型中没有任何东西可以 return 使用 HitHighlight
找到的所有 "hits"。它根本不是为 return 不连续的范围集合而设计的,一般来说,根据任何特定的属性。
如果您只想计数,您已有的 C# 代码可能是执行速度最快的。您会丢失任何格式和位置信息,但这些信息并不重要。
对于其他任何事情,您需要在循环中执行常规 Find.Execute
,将找到的每个 Range
添加到数组(或其他)。例如,这将允许您向用户显示带有周围文本的列表。
当您使用 Range.Find
(相对于 Document.Content.Find
)成功查找时,Range
对象包含找到的文本。类似这样的技巧是,在成功查找后,必须重置范围才能继续。像这样的东西(凭记忆输入,所以可能有语法错误):
Word.Range rngDoc = wrdDocument.Content;
Word.Range rngFind = rngDoc.Duplicate;
bool bFound = true;
object 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;
}
}
我使用 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 的工具而不是自己拿走所有的文本)
Word 对象模型中没有任何东西可以 return 使用 HitHighlight
找到的所有 "hits"。它根本不是为 return 不连续的范围集合而设计的,一般来说,根据任何特定的属性。
如果您只想计数,您已有的 C# 代码可能是执行速度最快的。您会丢失任何格式和位置信息,但这些信息并不重要。
对于其他任何事情,您需要在循环中执行常规 Find.Execute
,将找到的每个 Range
添加到数组(或其他)。例如,这将允许您向用户显示带有周围文本的列表。
当您使用 Range.Find
(相对于 Document.Content.Find
)成功查找时,Range
对象包含找到的文本。类似这样的技巧是,在成功查找后,必须重置范围才能继续。像这样的东西(凭记忆输入,所以可能有语法错误):
Word.Range rngDoc = wrdDocument.Content;
Word.Range rngFind = rngDoc.Duplicate;
bool bFound = true;
object 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;
}
}