VSTO: считать все Range.Find результаты - PullRequest
0 голосов
/ 01 мая 2018

Я использую метод 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 голосов
/ 02 мая 2018

В объектной модели 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;
  }
}
...