Freigeben über


Entfernen der Kopf- und Fußzeile aus einem Textverarbeitungsdokument

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um programmgesteuert alle Kopf- und Fußzeilen in einem Textverarbeitungsdokument zu entfernen. Sie enthält eine Beispielmethode RemoveHeadersAndFooters zur Veranschaulichung dieser Aufgabe.

RemoveHeadersAndFooters-Methode

Sie können die RemoveHeadersAndFooters-Methode verwenden, um alle Kopf- und Fußzeileninformationen aus einem Textverarbeitungsdokument zu entfernen. Beachten Sie, dass Sie nicht nur die Kopf- und Fußzeilenteile aus dem Dokumentspeicher löschen müssen, sie müssen auch die Verweise auf diese Teile aus dem Dokument löschen. Der Beispielcode veranschaulicht beide Schritte des Vorgangs. Die RemoveHeadersAndFooters-Methode akzeptiert einen einzelnen Parameter, eine Zeichenfolge, die den Pfad der Datei angibt, die Sie ändern möchten.

    public static void RemoveHeadersAndFooters(string filename)

Den vollständigen Codeeintrag für die Methode finden Sie im Abschnitt Beispielcode.

Aufrufen der Beispielmethode

Um die Beispielmethode aufzurufen, übergeben Sie eine Zeichenfolge für den ersten Parameter, der den Dateinamen des Dokuments enthält, das Sie ändern möchten, wie im folgenden Codebeispiel gezeigt.

    RemoveHeadersAndFooters(@"C:\Users\Public\Documents\Headers.docx");

Funktionsweise des Codes

Die RemoveHeadersAndFooters-Methode arbeitet mit dem von Ihnen angegebenen Dokument zusammen und löscht alle Kopf- und Fußzeilenteile sowie Verweise auf diese Teile. Der Code beginnt mit dem Öffnen des Dokuments mit der Open-Methode und gibt an, dass das Dokument für Lese-/Schreibzugriff geöffnet werden soll (der endgültige True-Parameter). Angesichts des geöffneten Dokuments verwendet der Code die MainDocumentPart-Eigenschaft, um zum Standard Dokument zu navigieren und den Verweis in einer Variablen namens docPart zu speichern.

    // Given a document name, remove all of the headers and footers
    // from the document.
    using (WordprocessingDocument doc = 
        WordprocessingDocument.Open(filename, true))
    {
        // Code removed here...
    }

Bestätigen der Existenz von Kopf-/Fußzeilen

Bei einem Verweis auf den Dokumentteil bestimmt der Code als Nächstes, ob er zu erledigen ist, d. h. ob das Dokument Kopf- oder Fußzeilen enthält. Zur Entscheidung ruft der Code die Count-Methode sowohl der HeaderParts - als auch der FooterParts-Eigenschaft des Dokumentteils auf, und wenn beide einen Wert größer als 0 zurückgibt, wird der Code fortgesetzt. Beachten Sie, dass die HeaderParts - und FooterParts-Eigenschaften jeweils eine IEnumerable von HeaderPart - bzw . FooterPart-Objekten zurückgeben.

    // Get a reference to the main document part.
    var docPart = doc.MainDocumentPart;

    // Count the header and footer parts and continue if there 
    // are any.
    if (docPart.HeaderParts.Count() > 0 || 
        docPart.FooterParts.Count() > 0)
    {
        // Code removed here...
    }

Bei einer Auflistung von Verweisen auf Kopf- und Fußzeilenteile können Sie Code schreiben, um jeden einzeln zu löschen. Dies ist jedoch aufgrund des Open XML SDK nicht erforderlich. Stattdessen können Sie die DeleteParts<T-Methode> aufrufen und die Auflistung der zu löschenden Teile übergeben. Diese einfache Methode stellt eine Verknüpfung zum Löschen einer Auflistung von Teilen bereit. Daher treten die folgenden Codezeilen an die Stelle der Schleife, die Sie andernfalls selbst schreiben müssten.

    // Remove the header and footer parts.
    docPart.DeleteParts(docPart.HeaderParts);
    docPart.DeleteParts(docPart.FooterParts);

Arbeiten mit dem Dokumentinhalt

An diesem Punkt hat der Code die Kopf- und Fußzeilenteile gelöscht, aber das Dokument enthält weiterhin verwaiste Verweise auf diese Teile. Bevor die verwaisten Verweise entfernt werden können, muss der Code einen Verweis auf den Inhalt des Dokuments abrufen (also auf den XML-Inhalt, der im Standard Dokumentteil enthalten ist). Später, nachdem die Änderungen vorgenommen wurden, muss der Code sicherstellen, dass sie beibehalten werden, indem sie explizit gespeichert werden. Zwischen diesen beiden Vorgängen muss der Code die verwaisten Verweise löschen, wie im Abschnitt gezeigt, der auf das folgende Codebeispiel folgt.

    // Get a reference to the root element of the main
    // document part.
    Document document = docPart.Document;
        // Code removed here...
    // Save the changes.
    document.Save();

Um die gestrandeten Verweise zu entfernen, ruft der Code zuerst eine Auflistung von HeaderReference-Elementen ab, konvertiert die Auflistung in eine List und durchläuft dann die Auflistung, wobei die Remove-Methode für jedes gefundene Element aufgerufen wird. Beachten Sie, dass der Code die von der Descendants-Methode zurückgegebene IEnumerable in eine List konvertiert, sodass Elemente aus der Liste gelöscht werden können, und dass der headerReference-Typ, der vom Open XML SDK bereitgestellt wird, es einfach macht, auf Elemente vom Typ HeaderReference im XML-Inhalt zu verweisen. (Ohne diese zusätzliche Hilfe müssten Sie direkt mit den Details des XML-Inhalts arbeiten.) Nachdem alle Header entfernt wurden, wiederholt der Code den Vorgang mit den Fußzeilenelementen.

    // Remove all references to the headers and footers.

    // First, create a list of all descendants of type
    // HeaderReference. Then, navigate the list and call
    // Remove on each item to delete the reference.
    var headers =
      document.Descendants<HeaderReference>().ToList();
    foreach (var header in headers)
    {
        header.Remove();
    }

    // First, create a list of all descendants of type
    // FooterReference. Then, navigate the list and call
    // Remove on each item to delete the reference.
    var footers =
      document.Descendants<FooterReference>().ToList();
    foreach (var footer in footers)
    {
        footer.Remove();
    }

Beispielcode

Im Folgenden finden Sie das vollständige RemoveHeadersAndFooters-Codebeispiel in C# und Visual Basic.

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

RemoveHeadersAndFooters(args[0]);

// Remove all of the headers and footers from a document.
static void RemoveHeadersAndFooters(string filename)
{
    // Given a document name, remove all of the headers and footers
    // from the document.
    using (WordprocessingDocument doc = WordprocessingDocument.Open(filename, true))
    {
        if (doc.MainDocumentPart is null)
        {
            throw new ArgumentNullException("MainDocumentPart is null.");
        }

        // Get a reference to the main document part.
        var docPart = doc.MainDocumentPart;

        // Count the header and footer parts and continue if there 
        // are any.
        if (docPart.HeaderParts.Count() > 0 ||
            docPart.FooterParts.Count() > 0)
        {
            // Remove the header and footer parts.
            docPart.DeleteParts(docPart.HeaderParts);
            docPart.DeleteParts(docPart.FooterParts);

            // Get a reference to the root element of the main
            // document part.
            Document document = docPart.Document;

            // Remove all references to the headers and footers.

            // First, create a list of all descendants of type
            // HeaderReference. Then, navigate the list and call
            // Remove on each item to delete the reference.
            var headers =
              document.Descendants<HeaderReference>().ToList();
            foreach (var header in headers)
            {
                header.Remove();
            }

            // First, create a list of all descendants of type
            // FooterReference. Then, navigate the list and call
            // Remove on each item to delete the reference.
            var footers =
              document.Descendants<FooterReference>().ToList();
            foreach (var footer in footers)
            {
                footer.Remove();
            }

            // Save the changes.
            document.Save();
        }
    }
}