在 Word 應用程式中搜尋和取代文字是基本操作,但若要透過程式碼自動化處理,則需善用 Word 物件模型。本文將循序漸進展示如何使用 C# 實作 Word 文件文字搜尋,並分析不同方法的效能差異,最終提供適合大型文件的最佳解決方案。
Word 的物件模型文件詳細記載於 Office 安裝目錄下的 CHM 說明檔(如 VBAWD10.CHM)。透過 Document 物件的 Content 屬性可取得代表文件文字範圍的 Range 物件,這是操作文件內容的切入點。
最直觀的作法是取得完整文件文字後,使用 String.IndexOf() 判斷關鍵字是否存在:
object filename = @"C:\Doc.docx";
string strKey = "搜尋關鍵字";
object missing = Type.Missing;
Word.Application wordApp = new Word.ApplicationClass();
Word.Document doc = wordApp.Documents.Open(ref filename, ref missing, ...);
if (doc.Content.Text.IndexOf(strKey) >= 0)
{
MessageBox.Show("文件包含指定關鍵字!");
}
else
{
MessageBox.Show("文件不包含指定關鍵字!");
}
缺點:此法會一次性載入整份文件文字到記憶體,對於超大型文件(數十 MB 以上)極易造成記憶體壓力、效能低落,甚至導致程式當機。這類 Bug 在一般測試難以發現,屬於嚴重的程式級缺陷。
Word 物件模型提供專門的 Find 物件,對應「尋找」對話方塊功能,屬於 Range 成員。使用 Execute 方法可高效執行搜尋:
doc.Content.Find.Text = strKey;
bool found = doc.Content.Find.Execute(ref missing, ref missing, ...);
MessageBox.Show(found ? "找到關鍵字!" : "未找到關鍵字!");
此法由 Word 內部引擎處理,速度與穩定度遠優於字串比對,但若需搜尋多組關鍵字,仍需重複掃描全文。
針對「只要判斷是否存在」的需求,可結合 Paragraphs 集合逐段落搜尋,一旦找到即中斷迴圈,避免掃描整份文件:
int count = doc.Paragraphs.Count;
Word.Find finder;
for (int i = 1; i <= count; i++)
{
finder = doc.Paragraphs[i].Range.Find;
finder.ClearFormatting();
finder.Text = strKey;
if (finder.Execute(ref missing, ...))
{
MessageBox.Show("找到關鍵字!");
break; // 找到即停止,大幅提升效能
}
}
此策略在關鍵字位於文件前段時效能提升最明顯,最壞情況仍需掃描全文,但記憶體佔用恆定,適合超大型文件處理。
doc.Content.Text 一次載入全文進行字串比對。善用 Word 物件模型提供的原生搜尋功能,搭配適當的演算法策略,才能開發出穩健、高效的文件處理程式。