[C#] Suchen / Ersetzen in Word Dokumenten mittels Open XML SDK

Drucken
( 0 Votes ) 
Hauptkategorie: Programmieren Kategorie: C#
Erstellt am 15.05.2012 Zuletzt aktualisiert am 15.05.2012 Geschrieben von Jonny132
Dank der Open XML SDK von Microsoft ist es nicht mehr schwer Office Dokumente zu lesen, bearbeiten und wieder speichern. In diesem Tutorial zeige ich euch wie man einfach eine Suchen / Ersetzen Funktion für Word Dokumente auf dieses SDK aufbaut.

Dazu solltet ihr folgende Referenzen einbinden:
  • System.Data.Linq
  • DocumentFormat.OpenXml
  • WindowsBase

Desweiteren sind ein paar Imports um etwas Schreibarbeit zu ersparen hilfreich:

using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

Funktion SearchAndReplaceInWordDocument:
    private void SearchAndReplaceInWordDocument(string path, string toReplace, string newString)
    {
      using (WordprocessingDocument doc = WordprocessingDocument.Open(path, true))
      {
        var res = from bm in doc.MainDocumentPart.Document.Body.Descendants()
                  where bm.InnerText != string.Empty && bm.InnerText.Contains(toReplace) && bm.HasChildren == false
                  select bm;

        foreach (var item in res)
        {
          item.InsertAfterSelf(new Text(item.InnerText.Replace(toReplace, newString)));
          item.Remove();
        }
      }
    }

Diese Funktion nimmt als Parameter den Pfad zur Word-Datei, den Text der ersetzt werden soll und mit welchem Text der Text erstetzt werden soll entgegen.
Indem wir WordprocessingDocument.Open aufrufen, erzeugen wir ein neues WordprocessingDocument Object. Der zweite boolsche Wert gibt ab ob das Document zur bearbeitung geöffnet werden soll oder nur lesend.

In dem LINQ Ausdruck holen wir uns mittels der Funktion Descendants() alle Elemente des Word Documents. Die Elemente werden eingeschränkt durch die Where - Klausel des LINQ Ausdruckes. Wir holen uns nur jene Elemente welche an unterster Ebene sind (HasChilds = false) und welche den gesuchten Text (Contains) beinhalten.

Somit haben wir in der Variable res eine Liste aller Elemente die wir ersetzen müssen durch unseren neuen Text welcher sich in der Variable newString befindet.

Danach iterieren wir über alle Elemente und fügen mittels InserAfterSelf einen neuen Textbaustein ein, welcher exakt den alten Text, nur mit der Ersetzung enthält.
Zudem wird das aktuelle Item per Remove entfernt.

Aufrufbeispiel:
      SearchAndReplaceInWordDocument("@C:\temp\test.docx", "alter Text", "neuer Text");

   

 

    Veröffentlichen Sie ihre Kommentare ...