Freigeben über


Suchen und Ersetzen von Text in einem Dokumentteil

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um einen Textwert in einem Textverarbeitungsdokument programmgesteuert zu durchsuchen und zu ersetzen.


Pakete und Dokumentteile

Ein Open XML-Dokument wird als Paket gespeichert, dessen Format durch die Spezifikation ISO/IEC 29500-2 definiert ist. Das Paket kann mehrere Teile enthalten, die untereinander in Beziehung stehen. Durch die Beziehung zwischen den Teilen wird die Kategorie des Dokuments gesteuert. Ein Dokument kann als Textverarbeitungsdokument definiert sein, falls sein Paketbeziehungselement eine Beziehung zu einem Hauptdokumentteil besitzt. Falls das Paketbeziehungselement eine Beziehung zu einem Präsentationsteil hat, kann es als Präsentationsdokument definiert sein. Falls das Paketbeziehungselement eine Beziehung zu einem Arbeitsmappenteil hat, ist es als Tabellenkalkulationsdokument definiert. In diesem Thema vom Typ "Gewusst wie" wird ein Textverarbeitungsdokument-Paket verwendet.


Abrufen eines WordprocessingDocument-Objekts

In dem Beispielcode beginnen Sie mit dem Öffnen der Textverarbeitungsdatei, indem Sie die WordprocessingDocument-Klasse wie in der folgenden using-Anweisung gezeigt instanziieren. Sie öffnen in der gleichen Anweisung die Textverarbeitungsdatei document mithilfe der Open-Methode, wobei der boolesche Parameter auf true festgelegt ist, um die Bearbeitung des Dokuments zu aktivieren.

    using (WordprocessingDocument wordDoc = 
            WordprocessingDocument.Open(document, true))
    {
        // Insert other code here.
    }

Die using-Anweisung ist eine empfohlene Alternative zur herkömmlichen Reihenfolge ".Open, .Save, .Close". Mit dieser wird sichergestellt, dass die Dispose-Methode (interne vom Open XML SDK zum Bereinigen von Ressourcen verwendete Methode) automatisch aufgerufen wird, wenn die schließende Klammer erreicht ist. Der Block, der auf die using-Anweisung folgt, legt einen Bereich für das Objekt fest, das in der using-Anweisung erstellt oder benannt wird, in diesem Fall wordDoc. Da die WordprocessingDocument-Klasse des Open XML SDK automatisch das Objekt als Teil der System.IDisposable-Implementierung speichert und schließt, und da Dispose automatisch beim Beenden des Blocks aufruft, müssen Sie nicht explizit Speichern und Schließen aufrufen, solange Sie using verwenden.


Beispielcode

Im folgenden Beispiel ist eine schnelle und einfache Möglichkeit zum Suchen und Ersetzen dargestellt. Diese ist möglicherweise nicht zuverlässig, da das XML-Dokument im Zeichenfolgenformat abgerufen wird. Je nach dem regulären Ausdruck könnten Sie möglicherweise versehentlich XML-Tags ersetzen und das Dokument beschädigen. Wenn Sie einfach ein Dokument durchsuchen, jedoch nicht den Inhalt ersetzen möchten, können Sie MainDocumentPart.Document.InnerText verwenden.

Dieses Beispiel zeigt auch, wie Sie einen regulären Ausdruck verwenden, um den Textwert "Hello world!" in einer Textverarbeitungsdatei namens "MyPkg8.docx" durch den Wert "Hallo Alle!" zu suchen und zu ersetzen. Zum Aufrufen der SearchAndReplace-Methode können Sie das folgende Beispiel verwenden.

    SearchAndReplace(@"C:\Users\Public\Documents\MyPkg8.docx");

Nach Ausführung des Programms können Sie die Datei überprüfen, um den geänderten Text "Hello world!" anzuzeigen.

Es folgt der vollständige Beispielcode in C# und Visual Basic.

using DocumentFormat.OpenXml.Packaging;
using System;
using System.IO;
using System.Text.RegularExpressions;

SearchAndReplace(args[0]);

// To search and replace content in a document part.
static void SearchAndReplace(string document)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        string? docText = null;


        if (wordDoc.MainDocumentPart is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body is 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);
        }
    }
}

Siehe auch

Reguläre Ausdrücke