C#:在Word中搜索文本并获取结果范围

C#:在Word中搜索文本并获取结果范围,c#,ms-word,find,C#,Ms Word,Find,我可以通过以下方式在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 missi

我可以通过以下方式在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);

这告诉我是否找到了文本。但是我需要找到的文本块的范围。

应该通过对其执行find来更改范围对象

因此,您可能会使用
range.Start
range.End
来获取角色位置。

您是否尝试过以下方法:

 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);
} 

使用“查找”方法从word中获取一个范围,并将其格式化

//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;
}

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”:


可以这样解决:

    /// <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;
    }
//
///找到所有
/// 
/// 
///查找内容
公共静态列表FindAll(此范围,字符串findText)
{
int start=range.start;
int end=范围.end;
列表范围=新列表();
range.Find.Execute(FindText:FindText,MatchCase:true);
while(range.Find.Find)
{
//搜索将改变范围,这是一个超出范围的判断
如果(range.Start>end)
打破
ranges.Add(range.Document.range(range.Start,range.End));
range.Find.Execute(FindText:FindText,MatchCase:true);
}
//恢复原始范围
范围。设置范围(开始、结束);
返回范围;
}
您还可以创建扩展方法:

        /// <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;
    }
//
/// 查找第一个
/// 
/// 
/// 查找内容
/// 没有找到为空
公共静态范围FindFirst(此范围,字符串findText)
{
int start=range.start;
int end=范围.end;
bool isOk=range.Find.Execute(FindText:FindText,MatchCase:true);
if(isOk)
{
var newRange=range.Document.range(range.Start,range.End);
范围。设置范围(开始、结束);
返回新范围;
}
其他的
返回null;
}

前面的代码:private object missing=Type.missing;我不确定你们这些家伙/女孩,但我发现这个API一开始有点混乱。我希望
range.Find.Execute(..)
返回一个新的range对象,而不是更改根(
Document.Content
)上的对象。您可以在代码中说“//Get selected index”。您能在这里发布代码吗?你假设人们知道如何获取所选索引。请记住,这是一个英文网站
        /// <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;
    }