2013-08-19 11 views
9

Utworzono plik docx z szablonu słowa, teraz uzyskuję dostęp do skopiowanego pliku docx i chcę zamienić określony tekst na inne dane.Zastąp tekst w dokumencie programu Word przy użyciu otwartego pliku Xml

Nie mogę uzyskać wskazówki, jak uzyskać dostęp do tekstu z głównej części?

Każda pomoc byłaby znacząca.

Poniżej znajduje się mój kod do tej pory.

private void CreateSampleWordDocument() 
    { 
     //string sourceFile = Path.Combine("D:\\GeneralLetter.dot"); 
     //string destinationFile = Path.Combine("D:\\New.doc"); 
     string sourceFile = Path.Combine("D:\\GeneralWelcomeLetter.docx"); 
     string destinationFile = Path.Combine("D:\\New.docx"); 
     try 
     { 
      // Create a copy of the template file and open the copy 
      File.Copy(sourceFile, destinationFile, true); 
      using (WordprocessingDocument document = WordprocessingDocument.Open(destinationFile, true)) 
      { 
       // Change the document type to Document 
       document.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document); 
       //Get the Main Part of the document 
       MainDocumentPart mainPart = document.MainDocumentPart; 
       mainPart.Document.Save(); 
      } 
     } 
     catch 
     { 
     } 
    } 

Teraz, jak znaleźć określony tekst i zastąpić go tym samym? Nie mogę uzyskać dostępu za pośrednictwem linku, więc wskazówka dotycząca kodu byłaby dostrzegalna.

Odpowiedz

11

Wystarczy dać pomysł jak to zrobić, spróbuj:

using (WordprocessingDocument doc = 
        WordprocessingDocument.Open(@"yourpath\testdocument.docx", true)) 
      { 
       var body = doc.MainDocumentPart.Document.Body; 
       var paras = body.Elements<Paragraph>(); 

       foreach (var para in paras) 
       { 
        foreach (var run in para.Elements<Run>()) 
        { 
         foreach (var text in run.Elements<Text>()) 
         { 
          if (text.Text.Contains("text-to-replace")) 
          { 
           text.Text = text.Text.Replace("text-to-replace", "replaced-text"); 
          } 
         } 
        } 
       } 
      } 
     } 

Należy pamiętać, że tekst jest wielkość liter. Formatowanie tekstu nie zostanie zmienione po wymianie. Mam nadzieję, że to ci pomoże.

+0

Poprosiłem, aby dać odpowiedź na moje poprzednie pytanie, jak również link pomógł mi, więc po odpowiedzieć również tam. –

+0

@flowerking: Jeśli masz kilka minut, możesz pomóc w tym? http://stackoverflow.com/questions/26307691 – slayernoah

+4

to tylko zastępuje tekst w jednym przebiegu. Jednak tekst może być posiekany w różnych seriach, które muszą być połączone przed wymianą. – Erik

2

Może to rozwiązanie jest łatwiejsze:
1. StreamReader czyta cały tekst,
2. Za pomocą Regex ty rozróżniana wielkość liter zastąpić nowy tekst zamiast starego tex
3. StreamWriter pisze ponownie zmodyfikowany tekst do dokumentu.

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true)) 
{ 
    string docText = null; 
    using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream())) 
     docText = sr.ReadToEnd(); 

    foreach (var t in findesReplaces) 
     docText = new Regex(findText, RegexOptions.IgnoreCase).Replace(docText, replaceText); 

    using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))) 
     sw.Write(docText); 
} 
+0

@Roy myślisz, że teraz jest lepiej? –

+0

Tak. Dzięki za dodanie opisu do twojej dokładnej odpowiedzi – MickyD

5

Oprócz Flowerking „s odpowiedź:

Gdy plik doc ma otaczaniem w nim, proces nie będzie działać. Ponieważ textbox ma element TextBoxContent, więc nie pojawi się w pętli foreach.

Ale pisząc

using (WordprocessingDocument doc = 
        WordprocessingDocument.Open(@"yourpath\testdocument.docx", true)) 
      { 
       var document = doc.MainDocumentPart.Document 

       foreach (var text in document.Descendants<Text>()) // <<< Here 
       { 
        if (text.Text.Contains("text-to-replace")) 
        { 
          text.Text = text.Text.Replace("text-to-replace", "replaced-text"); 
        } 
       } 
      } 

będzie to pętla wszystkie teksty w dokumencie (czy to w polu tekstowym lub nie), więc będzie zastąpić teksty.

-1

here jest rozwiązaniem z msdn.

Przykład stamtąd:

public static void SearchAndReplace(string document) 
{ 
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true)) 
    { 
     string docText = null; 
     using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream())) 
     { 
      docText = sr.ReadToEnd(); 
     } 

     Regex regexText = new Regex("Hello world!"); 
     docText = regexText.Replace(docText, "Hi Everyone!"); 

     using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create))) 
     { 
      sw.Write(docText); 
     } 
    } 
} 
+2

Jest to w zasadzie bezużyteczne, jeśli słowo dzieli szukany tekst na wiele odcinków (lub gorzej) ... – Santhos

+0

Mam ten dokładny problem @Santhos, a nawet będzie rzucać RUN-ami, nie wiem, gdzie słowo dzieli tekst, więc daje mi ogromny ból głowy. – Zorkind

+0

@Eduardo Mój przyjaciel próbował rozwiązać ten problem, ale ostatecznie musiał ręcznie przejść przez wszystkie uruchomienia i spróbować skomponować tekst. Jeśli plik ze słowem jest pod Twoją kontrolą, możesz edytować jego plik xml i naprawić wystąpienia, które należy zastąpić, aby nie obejmowały wielu przebiegów. – Santhos

0

Jeśli tekst szukasz jest umieszczone w nawiasach i słowo Dzieli swój tekst w wielu seriach ...;

Szukaj tekstu (IEnumerable (z tekstem))

for (int i = 0; i <= SearchIn.Count - 1; i++) { 

    if (!(i + 2 > SearchIn.Count - 1)) { 
     Text TXT = SearchIn(i); 
     Text TXT1 = SearchIn(i + 1); 
     Text TXT2 = SearchIn(i + 2); 

     if (Strings.Trim(TXT.Text) == "[" & Strings.Trim(TXT2.Text) == "]") { 
      TXT1.Text = TXT.Text + TXT1.Text + TXT2.Text; 

      TXT.Text = ""; 
      TXT2.Text = ""; 
     } 
    } 
} 
Powiązane problemy