熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2013-11-13 11:11:26  來源: .NET編程 

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


From:http://tw.wingwit.com/Article/program/net/201311/15360.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.