2017-06-06 4 views
0

特定のテキストの文書を検索して別のテキストに置き換える代替方法を探しています。私の現在の作品は、検索と置換の方法を使用してしかし、私はこれを行うための他の方法があるのだろうかと思っていた。C#Word文書のテキストを検索して置き換える別の方法

私が試みた1つの方法は、パラグラフで段落をたどってテキストを検索し、それをスワップして新しいワードドキュメントに貼り付けて保存することでした。しかし、画像、教科書、テーブルなどになると、これはもっと複雑になりました。また、フォーマットも保存されていないので、別の問題でした。

次のように私の現在のコードは次のとおりです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Microsoft.Office.Interop.Word; 

namespace Test 
{ 
    static class Program 
    { 
     static void Main() 
     { 
      //Create a new microsoft word file 
      Microsoft.Office.Interop.Word.Application fileOpen = new Microsoft.Office.Interop.Word.Application(); 
      //Open a already existing word file into the new document created 
      Microsoft.Office.Interop.Word.Document document = fileOpen.Documents.Open(@"C:\Users\dpatel\Desktop\Test1.docx", ReadOnly: false); 
      //Make the file visible 
      fileOpen.Visible = true; 
      document.Activate(); 
      //The FindAndReplace takes the text to find under any formatting and replaces it with the 
      //new text with the same exact formmating (e.g red bold text will be replaced with red bold text) 
      FindAndReplace(fileOpen, "useless", "very useful"); 
      //Save the editted file in a specified location 
      //Can use SaveAs instead of SaveAs2 and just give it a name to have it saved by default 
      //to the documents folder 
      document.SaveAs2(@"C:\Users\dpatel\Desktop\NewFile1"); 
      //Close the file out 
      fileOpen.Quit(); 
     } 
     //Method to find and replace the text in the word document. Replaces all instances of it 
     static void FindAndReplace(Microsoft.Office.Interop.Word.Application fileOpen, object findText, object replaceWithText) 
     { 
      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 
      fileOpen.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); 
     } 
    } 
} 
+0

なぜ組み込みメソッドの代替をお探しですか? – stuartd

+0

私が書いているプログラムです。私は、私が仕事をしなければならないさまざまな選択肢を知りたいだけです。組み込みメソッドの検索と置換は機能しますが、私の場合には最適なソリューションではありません。 – Dylan

答えて

0

は、テキストの検索と置き換えへの代替はありませんが判明。唯一の方法は、文書をスキャンし、テキストを抽出し、一致する場合に置換を発行することです。 「発見して置き換える」と本質的に同じです。ただし、テキストボックスだけを検索する方法、テーブルのみなどのバリエーションがあります。

0

これまでのようにできます。可能性のある不正なコーディングのため申し訳ありませんが、素晴らしいです

using Microsoft.office.interop.word. 

var application = new Word.Application(); 
     string path = Path.GetDirectoryName(Path.GetFullPath("YourDocsName.doc")); 
     object path_YourDocsName = path + @"\folder\YourDocsName.doc"; 

     object o = Missing.Value; 
     object oFalse = false; 
     object oTrue = true; 

     Word._Application app = null; 
     Word.Documents docs = null; 
     Word.Document doc = null; 

     try 
     { 
      app = new Word.Application(); 
      app.Visible = false; 
      app.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone; 

      docs = app.Documents; 
      doc = docs.Open(ref path_YourDocsName, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o); 
      doc.Activate();   

      foreach (Word.Range range in doc.StoryRanges) 
      { 

       Word.Find find = range.Find; 
       object findText = "[Todays date]"; 
       // object findText = { "[Todays date]","[]" }; 
       object replacText = todaysdate; //gets todays date and time to doc 
       object replace = Word.WdReplace.wdReplaceAll; 
       object findWrap = Word.WdFindWrap.wdFindContinue; 
       find.Execute(ref replaceThis, ref o, ref o, ref o, ref oFalse, ref o, 
        ref o, ref findWrap, ref o, ref replaceThisWith, 
        ref replace, ref o, ref o, ref o, ref o); 

       Word.Find find1 = range.Find; 
       object findText1 = "[doc content]"; 
       object replacText1 = Name; 
       object replace1 = Word.WdReplace.wdReplaceAll; 
       object findWrap1 = Word.WdFindWrap.wdFindContinue; 
       find.Execute(ref findText1, ref o, ref o, ref o, ref oFalse, ref o, 
        ref o, ref findWrap1, ref o, ref replacText1, 
        ref replace1, ref o, ref o, ref o, ref o); 

       Word.Find find2 = range.Find; 
       object findText2 = "[doc content]"; 
       object replacText2 = Somestringyouneed; 
       object replace2 = Word.WdReplace.wdReplaceAll; 
       object findWrap2 = Word.WdFindWrap.wdFindContinue; 
       find.Execute(ref findText2, ref o, ref o, ref o, ref oFalse, ref o, 
        ref o, ref findWrap2, ref o, ref replacText2, 
        ref replace2, ref o, ref o, ref o, ref o); 

       Word.Find find3 = range.Find; 
       object findText3 = "[Doc content]"; 
       object replacText3 = somesecondstringyouneed; 
       object replace3 = Word.WdReplace.wdReplaceAll; 
       object findWrap3 = Word.WdFindWrap.wdFindContinue; 
       find.Execute(ref findText3, ref o, ref o, ref o, ref oFalse, ref o, 
        ref o, ref findWrap3, ref o, ref replacText3, 
        ref replace3, ref o, ref o, ref o, ref o); 

       Word.Find find4 = range.Find; 
       object findText4 = "[doc content]"; 
       object replacText4 = somesecondstringyouneed; 
       object replace4 = Word.WdReplace.wdReplaceAll; 
       object findWrap4 = Word.WdFindWrap.wdFindContinue; 
       find.Execute(ref findText4, ref o, ref o, ref o, ref oFalse, ref o, 
        ref o, ref findWrap4, ref o, ref replacText4, 
        ref replace4, ref o, ref o, ref o, ref o); 

       Word.Find find5 = range.Find; 
       object findText5 = "[doc content]"; 
       object replacText5 = somesecondstringyouneed; 
       object replace5 = Word.WdReplace.wdReplaceAll; 
       object findWrap5 = Word.WdFindWrap.wdFindContinue; 
       find.Execute(ref findText5, ref o, ref o, ref o, ref oFalse, ref o, 
        ref o, ref findWrap5, ref o, ref replacText5, 
        ref replace5, ref o, ref o, ref o, ref o); 

       Word.Find find6 = range.Find; 
       object findText6 = "[doc content]"; 
       object replacText6 = somesecondstringyouneed; 
       object replace6 = Word.WdReplace.wdReplaceAll; 
       object findWrap6 = Word.WdFindWrap.wdFindContinue; 
       find.Execute(ref findText6, ref o, ref o, ref o, ref oFalse, ref o, 
        ref o, ref findWrap6, ref o, ref replacText6, 
        ref replace6, ref o, ref o, ref o, ref o); 

       Word.Find find7 = range.Find; 
       object findText7 = "[doc content]"; 
       object replacText7 = somesecondstringyouneed; 
       object replace7 = Word.WdReplace.wdReplaceAll; 
       object findWrap7 = Word.WdFindWrap.wdFindContinue; 
       find.Execute(ref findText7, ref o, ref o, ref o, ref oFalse, ref o, 
        ref o, ref findWrap7, ref o, ref replacText7, 
        ref replace7, ref o, ref o, ref o, ref o); 

       Word.Find find8 = range.Find; 
       object findText8 = "[doc content]"; 
       object replacText8 = somesecondstringyouneed; 
       object replace8 = Word.WdReplace.wdReplaceAll; 
       object findWrap8 = Word.WdFindWrap.wdFindContinue; 
       find.Execute(ref findText8, ref o, ref o, ref o, ref oFalse, ref o, 
        ref o, ref findWrap8, ref o, ref replacText8, 
        ref replace8, ref o, ref o, ref o, ref o); 

       Word.Find find9 = range.Find; 
       object findText9 = "[doc content]"; 
       object replacText9 = somesecondstringyouneed; 
       object replace9 = Word.WdReplace.wdReplaceAll; 
       object findWrap9 = Word.WdFindWrap.wdFindContinue; 
       find.Execute(ref findText9, ref o, ref o, ref o, ref oFalse, ref o, 
        ref o, ref findWrap9, ref o, ref replacText9, 
        ref replace9, ref o, ref o, ref o, ref o); 

       Marshal.FinalReleaseComObject(find); 
       Marshal.FinalReleaseComObject(find1); 
       Marshal.FinalReleaseComObject(find2); 
       Marshal.FinalReleaseComObject(find3); 
       Marshal.FinalReleaseComObject(find4); 
       Marshal.FinalReleaseComObject(find5); 
       Marshal.FinalReleaseComObject(find6); 
       Marshal.FinalReleaseComObject(find7); 
       Marshal.FinalReleaseComObject(find8); 
       Marshal.FinalReleaseComObject(find9); 
       Marshal.FinalReleaseComObject(range); 
      } 
      var path_YourDocsName = path + @"\folder\YourDocsName.doc"; 
      Console.WriteLine(path_YourDocsName); 
      doc.SaveAs(path_YourDocsName); 
      ((Word._Document)doc).Close(ref o, ref o, ref o); 
      doc.Close(); 
      app.Quit(ref o, ref o, ref o); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.StackTrace); 
     } 
     finally 
     { 
      if (doc != null) Marshal.FinalReleaseComObject(doc); 

      if (docs != null) Marshal.FinalReleaseComObject(docs); 

      if (app != null) Marshal.FinalReleaseComObject(app); 
     } 
関連する問題