2013-08-19 17 views
9

Ich habe eine Docx-Datei aus einer Word-Vorlage erstellt, jetzt bin ich auf die kopierte docx-Datei zugreifen und möchte bestimmten Text durch einige andere Daten ersetzen.Ersetzen Sie Text in Word-Dokument mit Open Xml

Ich kann den Hinweis nicht erhalten, wie man auf den Text vom dument Hauptteil zugreift?

Jede Hilfe wäre nennenswert.

Unten ist mein Code bis jetzt.

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 
     { 
     } 
    } 

Jetzt, wie man bestimmten Text findet und das selbe ersetzt? Ich bin nicht in der Lage, über den Link zu bekommen, also wäre ein Code-Hinweis nennenswert.

Antwort

11

Nur dir die Idee zu geben, wie es zu tun, bitte versuchen Sie es:

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"); 
          } 
         } 
        } 
       } 
      } 
     } 

Bitte beachten Sie den Text Groß- und Kleinschreibung. Die Textformatierung wird nach dem Ersetzen nicht geändert. Hoffe das hilft dir.

+0

ich Sie gebeten hatte Antwort auf meine vorherige Frage sowie Ihr Link hat mir geholfen, so senden Sie beantworten auch dort zu geben. –

+0

@flowerking: Wenn du ein paar Minuten hast, könntest du mithelfen? http://stackoverflow.com/questions/26307691 – slayernoah

+4

Dies ersetzt nur Text in einem Lauf. Text kann jedoch in verschiedenen Läufen zerlegt werden, die vor dem Austausch verkettet werden müssen. – Erik

2

Vielleicht ist diese Lösung einfacher:
1. a StreamReader den gesamten Text liest,
2. Mit einem Regex Sie case-insensitiv den neuen Text anstelle des alten tex ersetzen
3. a StreamWriter wieder schreibt die Text in das Dokument geändert.

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 denkst du, dass jetzt besser ist? –

+0

Ja. Danke für das Hinzufügen einer Beschreibung zu Ihrer Antwort – MickyD

5

Neben Flowerking ‚s Antwort:

Wenn Ihre doc-Datei Textfelder in sich hat, würde der Prozess nicht funktionieren. Da das Textfeld ein TextBoxContent-Element enthält, wird es nicht in der foreach-Schleife angezeigt.

Aber wenn

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"); 
        } 
       } 
      } 

schreibt es in einer Schleife alle Texte in Dokument (ob es in Textbox ist oder nicht), so wird es die Texte ersetzen.

-1

here ist die Lösung von msdn.

Beispiel von dort:

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

Dies ist im Grunde nutzlos, wenn Word den gesuchten Text in mehrere Läufe aufteilt (oder schlechter) ... – Santhos

+0

Ich habe dieses genaue Problem @Santhos und sogar werfen die RUNs Ich weiß nicht, wo Word den Text so teilt, es gibt mir einen riesigen Kopfschmerzen. – Zorkind

+0

@Eduardo Mein Freund versuchte es zu lösen, musste aber letztendlich manuell alle Läufe durchlaufen und versuchen, den Text zu verfassen. Wenn das Wort Datei unter Ihrer Kontrolle steht, können Sie dessen XML bearbeiten und die zu ersetzenden Vorkommen korrigieren, so dass sie sich nicht über mehrere Durchläufe erstrecken. – Santhos

0

Wenn der Text, den Sie suchen in Klammern und Word Splits Ihren Text in mehreren Läufen gelegt wird ...;

Suchen Sie den Text (IEnumerable (Text))

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 = ""; 
     } 
    } 
} 
Verwandte Themen