c#

位置:IT落伍者 >> c# >> 浏览文章

用C#在Word文档中搜索文本


发布日期:2019年04月28日
 
用C#在Word文档中搜索文本

在word应用程序中搜索和替换文本是举手之劳的事情通过word的对象模型我们也可以使用编程方式来实现

Word的对象模型有比较详细的帮助文档放在 Office 安装程序目录office 是在Program Files\Microsoft Office\OFFICE\文档本身是为VBA提供的在这个目录下还可以看到所有的office应用程序的VBA帮助

打开VBAWDCHM看到word的对象模型根据以往的使用经验很容易在Document对象下找到Content属性该属性会返回一个文 档文字部分的Range对象从这个对象中不难取到所有的文档内容再用string的IndexOf()方法很容易达到目标

object filename=; //要打开的文档路径

string strKey=; //要搜索的文本

object MissingValue=TypeMissing;

WordApplication wp=new WordApplicationClass();

WordDocument wd=wpDocumentsOpen(ref filenameref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue);

if (wdContentTextIndexOf(strKey)>=)

{

MessageBoxShow(文档中包含指定的关键字!搜索结果MessageBoxButtonsOK);

}

else

{

MessageBoxShow(文档中没有指定的关键字!搜索结果MessageBoxButtonsOK);

}

不过这种做法是很勉强的对小文档来说不存在问题对超长超大的文档来说这样的实现方法已经暗埋bug了而且是程序级的bug因为正常的测试会很难发现问题在使用中导致程序出现什么样的结果也很难量化描述

其实在word中已经提供了可以用作搜索的对象Find在对象模型上也比较容易找到对应的说明是这样的该对象代表查找操作的执行条件Find 对象的属性和方法与替换对话框中的选项一致从模型上看Find对象是Selection的成员从示例代码来看似乎也是Range的成员查找 Range的属性果然如此于是修改上面的代码

wdContentFindText=strKey;

if (wdContentFindExecute(ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValue))

{

MessageBoxShow(文档中包含指定的关键字!搜索结果MessageBoxButtonsOK);

}

else

{

MessageBoxShow(文档中没有指定的关键字!搜索结果MessageBoxButtonsOK);

}

这样似乎也不是最好因为我只要判断指定的文本是不是在文档中而不需要知道它出现了几次如果有多个要搜索的文本难道每次都进行全文档搜索?假设我要 搜索的文本包含在文档中最好的情况是在文档开头就包含我要查找的文本最坏的情况是在文档的最后包含要查找的文本如果每次取一部分文档进行判断符合 条件就结束本次搜索就可以避免每次搜索整个文档了模型中的Paragraphs对象现在派上用场了再修改一下代码

int i=iCount=;

WordFind wfnd;

if (wdParagraphs!=null && wdParagraphsCount>)

{

iCount=wdParagraphsCount;

for(i=;i<=iCount;i++)

{

wfnd=wdParagraphs[i]RangeFind;

wfndClearFormatting();

wfndText=strKey;

if (wfndExecute(ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValueref MissingValue

ref MissingValue))

{

MessageBoxShow(文档中包含指定的关键字!搜索结果MessageBoxButtonsOK);

break;

}

}

}

               

上一篇:C#多线程学习—生产者和消费者(1)

下一篇:RAD Studio 2009通过Mono提供.NET应用跨平台开发