2013-10-08 56 views
6

我有一些代码可以替换单词2010 docx中的文本。c#word interop查找并替换所有内容

 object fileName = Path.Combine(System.Windows.Forms.Application.StartupPath, "document.docx"); 

     Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application { Visible = true }; 

     Microsoft.Office.Interop.Word.Document aDoc = wordApp.Documents.Open(ref fileName, ReadOnly: false, Visible: true); 

     aDoc.Activate(); 

     Microsoft.Office.Interop.Word.Find fnd = wordApp.ActiveWindow.Selection.Find; 

     fnd.ClearFormatting(); 
     fnd.Replacement.ClearFormatting(); 
     fnd.Forward = true; 

     fnd.Wrap = Microsoft.Office.Interop.Word.WdFindWrap.wdFindContinue; 

     fnd.Text = "{id}"; 
     fnd.Replacement.Text = "123456"; 
     fnd.Execute(Replace: WdReplace.wdReplaceAll); 

这种方式没有格式化。但是,{id}​​格式化后,它不会替换文本。

如何让此代码忽略格式?

回答

21

我用这个函数查找和替换。你可以指定任何选项。

private void FindAndReplace(Microsoft.Office.Interop.Word.Application doc, object findText, object replaceWithText) 
{ 
    //options 
    object matchCase = false; 
    object matchWholeWord = true; 
    object matchWildCards = false; 
    object matchSoundsLike = false; 
    object matchAllWordForms = false; 
    object forward = true; 
    object format = false; 
    object matchKashida = false; 
    object matchDiacritics = false; 
    object matchAlefHamza = false; 
    object matchControl = false; 
    object read_only = false; 
    object visible = true; 
    object replace = 2; 
    object wrap = 1; 
    //execute find and replace 
    doc.Selection.Find.Execute(ref findText, ref matchCase, ref matchWholeWord, 
     ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replaceWithText, ref replace, 
     ref matchKashida ,ref matchDiacritics, ref matchAlefHamza, ref matchControl);     
} 

而且用法是:

object fileName = Path.Combine(System.Windows.Forms.Application.StartupPath, "document.docx"); 
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application { Visible = true }; 
Microsoft.Office.Interop.Word.Document aDoc = wordApp.Documents.Open(fileName, ReadOnly: false, Visible: true); 
aDoc.Activate(); 
FindAndReplace(wordApp, "{id}", "12345"); 

而且可以反复使用的FindAndReplace功能....
希望这有助于。

+0

哇!很棒,谢谢! – Lukas

+0

乐意帮忙:) – joecop

+1

这是不一致的。有时它起作用,有时它不起作用。 –

0

你可以试试这个:

var doc = new Microsoft.Office.Interop.Word.Application().Documents.Open("document.docx"); 

doc.Content.Find.Execute("{id}", false, true, false, false, false, true, 1, false, "12345", 2, 
false, false, false, false); 
doc.Save(); 
+0

它不适用于我 –

0

在Visual Studio 2013,你可以这样做:

Word.Range range = this.Application.ActiveDocument.Content; 
range.Find.ClearFormatting(); 
range.Find.Execute(FindText: "find text", ReplaceWith: "replace text", Replace: Word.WdReplace.wdReplaceAll); 

(发布于任何人的利益,像我一样,谁遇到了这个问题,但为不一定使用与OP相同版本的工具。)

+0

Word位于以下命名空间中:Microsoft.Office.Interop – R2D2

0

如果字符串包含的字符数超过255个,则会将字符串除法。

void FindAndReplace(Microsoft.Office.Interop.Word.Application doc, string findText, string replaceWithText) 
    { 
     if (replaceWithText.Length > 255) 
     { 
      FindAndReplace(doc, findText, findText + replaceWithText.Substring(255)); 
      replaceWithText = replaceWithText.Substring(0, 255); 
     } 

     //options 
     object matchCase = false; 
     object matchWholeWord = true; 
     object matchWildCards = false; 
     object matchSoundsLike = false; 
     object matchAllWordForms = false; 
     object forward = true; 
     object format = false; 
     object matchKashida = false; 
     object matchDiacritics = false; 
     object matchAlefHamza = false; 
     object matchControl = false; 
     object read_only = false; 
     object visible = true; 
     object replace = 2; 
     object wrap = 1; 

     //execute find and replace 
     doc.Selection.Find.Execute(findText, ref matchCase, ref matchWholeWord, 
      ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, replaceWithText, ref replace, 
      ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl); 
    }