Я использую метод 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 и не брать весь текст сам)
Да, конечно, я это знаю! Мне просто нужно было сделать это программным способом.
Хорошо - не все, кто работает на стороне C#, всегда знают эти вещи :-) Просто хотел убедиться, что вы действительно хотите «заново изобрести колесо»!
В объектной модели 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;
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;
}
}
Ммм, на самом деле в Word этот инструмент уже встроен в более поздних версиях. Нажмите Ctrl + F, чтобы открыть панель поиска. Введите термин, который вы хотите найти, вверху, и Word покажет вам весь список - выберите тот, который интересует из списка ...