C#: Поиск текста в Word и получение диапазона результата

Я могу найти текст в файле Word через:

Word.Range range = wordApp.ActiveDocument.Content;
Word.Find find = range.Find;
find.Text = "xxx";
find.ClearFormatting();
find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing, ref missing, ref missing);

Это говорит мне, если текст найден. Но мне нужен диапазон найденного текстового фрагмента.


person simon    schedule 25.10.2010    source источник
comment
Ранее в коде: частный объект отсутствует = Type.Missing;   -  person simon    schedule 25.10.2010
comment
Не уверен насчет вас, ребята/девушки, но поначалу этот API показался мне немного запутанным. Я бы ожидал, что range.Find.Execute(..) вернет новый объект диапазона, а не изменит тот, что находится в корне (Document.Content).   -  person The Muffin Man    schedule 14.07.2015


Ответы (5)


Вы пробовали это:

 range.Find.Execute(
      ref missing, ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, ref missing,
      ref missing, ref missing, ref missing, ref missing, ref missing);


 while (range.Find.Found) 
{ 
   //Get selected index.
   // Do as you please with range...
   //Positions:  range.Start... range.End
   //search again
   range.Find.Execute(
      ref missing, ref missing, ref missing, ref missing, ref missing, 
      ref missing, ref missing, ref missing, ref missing, ref missing,
      ref missing, ref missing, ref missing, ref missing, ref missing);
} 
person Nix    schedule 25.10.2010
comment
Вы говорите в своем коде //Получить выбранный индекс. Можете ли вы опубликовать код здесь? Вы предполагаете, что люди знают, как получить выбранный индекс. - person Joe Almore; 02.08.2014

Объект диапазона следует изменить, выполнив для него поиск.

Так что, скорее всего, вы бы использовали range.Start и range.End для получения позиций символов. Справочник

person Kevin Stricker    schedule 25.10.2010

Получает диапазон от слова, используя метод поиска, и форматирует его.

//Parameter contains what you want to find.
_wordApp.Selection.Find.Execute(title); 

Word.Range range = _wordApp.Selection.Range;
if (range.Text.Contains(title))
{
     //gets desired range here it gets last character to make superscript in range 
     Word.Range temprange = _document.Range(range.End - 1, range.End);          
     temprange.Select();
     Word.Selection currentSelection = _wordApp.Selection;
     currentSelection.Font.Superscript = 1;
}
person prashant    schedule 24.03.2014

range.Find.Execute возвращает true, если найдено, и устанавливает range в найденный диапазон:

var range = doc.Range();
while ( range.Find.Execute("xxx") ) 
    Debug.Print( range.Text );

Обратите внимание, что range.Find.Execute будет искать диапазон после range, если range уже соответствует условиям поиска (после первого range.Find.Execute).

Например, этот макрос VBA найдет только вторую букву «b»:

Sub Macro1()
    ActiveDocument.Range.Text = "abba"
    Dim r As Range
    Set r = ActiveDocument.Range(1, 2) ' the first "b"
    Debug.Print r.Start; r.End      ' prints " 1  2 "

    Debug.Print r.Find.Execute("b") ' prints "True"
    Debug.Print r.Start; r.End      ' prints " 2  3 "

    Debug.Print r.Find.Execute("b") ' prints "False" (if r.Find.Wrap = wdFindStop)
    Debug.Print r.Start; r.End      ' prints " 2  3 "
End Sub
person Slai    schedule 22.04.2016

Можно решить следующим образом:

    /// <summary>
    /// Find all
    /// </summary>
    /// <param name="range"></param>
    /// <param name="findText">Find content</param>
    public static List<Range> FindAll(this Range range, string findText)
    {
        int start = range.Start;
        int end = range.End;

        List<Range> ranges = new List<Range>();

        range.Find.Execute(FindText: findText, MatchCase: true);
        while (range.Find.Found)
        {
            //The search will change the range, here is an out-of-range judgment
            if (range.Start > end)
                break;

            ranges.Add(range.Document.Range(range.Start, range.End));
            range.Find.Execute(FindText: findText, MatchCase: true);
        }

        //Restore the original range
        range.SetRange(start, end);
        return ranges;
    }

Вы также можете создать метод расширения:

        /// <summary>
    /// 查找第一个
    /// </summary>
    /// <param name="range"></param>
    /// <param name="findText">查找内容</param>
    /// <returns>没有找到为空</returns>
    public static Range FindFirst(this Range range, string findText)
    {
        int start = range.Start;
        int end = range.End;

        bool isOk = range.Find.Execute(FindText: findText, MatchCase: true);
        if (isOk)
        {
            var newRange = range.Document.Range(range.Start, range.End);
            range.SetRange(start, end);
            return newRange;
        }
        else
            return null;
    }
person ping9719    schedule 23.12.2020
comment
Пожалуйста, помните, что это английский сайт - person Cleptus; 23.12.2020