Freigeben über


Ersetzen der Kopfzeile in einem Textverarbeitungsdokument

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um die Kopfzeile im Textverarbeitungsdokument programmgesteuert zu ersetzen.

Struktur des Kopfzeilenverweiselements

In diesem Beispiel löschen Sie den Kopfzeilenteil aus der Zieldatei und erstellen einen anderen Kopfzeilenteil. Sie löschen auch den Verweis auf die vorhandene Kopfzeile und erstellen einen Verweis auf die neue Kopfzeile. Daher sollten Sie Kopfzeilen und das Kopfzeilenverweiselement näher kennenlernen. Im folgenden Text aus der ISO/IEC 29500-Spezifikation wird das Kopfzeilenverweiselement erläutert.

headerReference (Kopfzeilenverweis)

Mit diesem Element wird eine einzelne Kopfzeile angegeben, die dem aktuellen Abschnitt im Dokument zugeordnet werden soll. Auf diese Kopfzeile soll über das id -Attribut zugegriffen werden, das eine explizite Beziehung zum entsprechenden Kopfzeilenteil im WordprocessingML-Paket angibt.

Falls der Beziehungstyp der durch dieses Element angegebenen Beziehung nichthttps://schemas.openxmlformats.org/officeDocument/2006/header lautet, nicht vorhanden ist oder keinen TargetMode-Attributwert von Internal besitzt, dann soll das Dokument als nicht kompatibel betrachtet werden.

In jedem Abschnitt eines Dokuments kann es bis zu drei unterschiedliche Arten von Kopfzeilen geben:

  • Kopfzeile für die erste Seite

  • Kopfzeile für ungerade Seiten

  • Kopfzeile für gerade Seiten

Der vom aktuellen headerReference -Element angegebene Kopfzeilentyp wird über das type -Attribut angegeben.

Falls ein Kopfzeilentyp für einen bestimmten Abschnitt nicht angegeben ist, dann gelten die nachfolgenden Regeln.

  • Wenn kein headerReference für die erste Seitenüberschrift angegeben und das titlePg-Element angegeben ist, wird die erste Seitenüberschrift vom vorherigen Abschnitt geerbt, oder, wenn dies der erste Abschnitt im Dokument ist, wird eine neue leere Kopfzeile erstellt. Wenn das titlePg-Element nicht angegeben ist, wird kein erster Seitenkopf angezeigt, und der ungerade Seitenkopf wird an seiner Stelle verwendet.

  • Wenn kein headerReference für den geraden Seitenkopf angegeben und das evenAndOddHeaders-Element angegeben ist, wird der gerade Seitenkopf vom vorherigen Abschnitt geerbt, oder, wenn dies der erste Abschnitt im Dokument ist, wird eine neue leere Kopfzeile erstellt. Wenn das evenAndOddHeaders-Element nicht angegeben ist, wird kein gerader Seitenkopf angezeigt, und der ungerade Seitenkopf wird an seiner Stelle verwendet.

  • Falls kein headerReference -Element für die Kopfzeile auf ungeraden Seiten angegeben ist, wird die Kopfzeile für gerade Seiten aus dem vorherigen Abschnitt geerbt. Falls es sich aber um den ersten Abschnitt im Dokument handelt, wird eine neue leere Kopfzeile erstellt.

Ein Beispiel: Stellen Sie sich ein dreiseitiges Dokument vor, für das verschiedene Kopfzeilen für die erste, die ungeraden und die geraden Seiten wie folgt definiert sind:

Dreiseitiges Dokument mit verschiedenen Kopfzeilen

In diesem Dokument sind drei Kopfzeilen definiert, wobei jede dieser Kopfzeilen eine Beziehung aus dem Dokumentteil mit einer eindeutigen Beziehungs-ID wie im folgenden Paketmarkup gezeigt besitzt:

    <Relationships xmlns=https://schemas.openxmlformats.org/package/2006/relationships>
      …
      <Relationship Id="rId2" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header1.xml" />
      <Relationship Id="rId3" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header2.xml" />
      <Relationship Id="rId5" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header3.xml" />
      …
    </Relationships>

Auf diese Beziehungen wird dann in den Eigenschaften des Abschnitts mithilfe des folgenden WordprocessingML-Codes verwiesen:

    <w:sectPr>  
      …  
      <w:headerReference r:id="rId3" w:type="first" />  
      <w:headerReference r:id="rId5" w:type="default" />  
      <w:headerReference r:id="rId2" w:type="even" />  
      …  
    </w:sectPr>  

Im resultierenden Abschnitt soll der Kopfzeilenteil mit Beziehungs-ID rId3 für die erste Seite, der Kopfzeilenteil mit Beziehungs-ID rId2 für alle nachfolgenden geraden Seiten und der Kopfzeilenteil mit Beziehungs-ID rId5 für alle nachfolgenden ungeraden Seiten verwendet werden. Ende des Beispiels]

© ISO/IEC29500: 2008.

Beispielcode

Im folgenden Codebeispiel wird veranschaulicht, wie Sie die Kopfzeile in einem vorhandenen Textverarbeitungsdokument durch die Kopfzeile eines anderen Textverarbeitungsdokuments ersetzen können. Zum Aufrufen der AddHeaderFromTo-Methode können Sie das folgende Codesegment als Beispiel verwenden.

    string filepathFrom = @"C:\Users\Public\Documents\Word15a.docx";
    string filepathTo=@"C:\Users\Public\Documents\Word15b.docx";
    AddHeaderFromTo(filepathFrom, filepathTo);

Nachstehend ist der vollständige Beispielcode in C# und Visual Basic aufgeführt.

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

AddHeaderFromTo(args[0], args[1]);

static void AddHeaderFromTo(string filepathFrom, string filepathTo)
{
    // Replace header in target document with header of source document.
    using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(filepathTo, true))
    using (WordprocessingDocument wdDocSource = WordprocessingDocument.Open(filepathFrom, true))
    {
        if (wdDocSource.MainDocumentPart is null || wdDocSource.MainDocumentPart.HeaderParts is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or HeaderParts is null.");
        }

        if (wdDoc.MainDocumentPart is null)
        {
            throw new ArgumentNullException("MainDocumentPart is null.");
        }

        MainDocumentPart mainPart = wdDoc.MainDocumentPart;

        // Delete the existing header part.
        mainPart.DeleteParts(mainPart.HeaderParts);

        // Create a new header part.
        DocumentFormat.OpenXml.Packaging.HeaderPart headerPart = mainPart.AddNewPart<HeaderPart>();

        // Get Id of the headerPart.
        string rId = mainPart.GetIdOfPart(headerPart);

        // Feed target headerPart with source headerPart.

        DocumentFormat.OpenXml.Packaging.HeaderPart? firstHeader = wdDocSource.MainDocumentPart.HeaderParts.FirstOrDefault();

        wdDocSource.MainDocumentPart.HeaderParts.FirstOrDefault();

        if (firstHeader is not null)
        {
            headerPart.FeedData(firstHeader.GetStream());
        }

        if (mainPart.Document.Body is null)
        {
            throw new ArgumentNullException("Body is null.");
        }

        // Get SectionProperties and Replace HeaderReference with new Id.
        IEnumerable<DocumentFormat.OpenXml.Wordprocessing.SectionProperties> sectPrs = mainPart.Document.Body.Elements<SectionProperties>();
        foreach (var sectPr in sectPrs)
        {
            // Delete existing references to headers.
            sectPr.RemoveAllChildren<HeaderReference>();

            // Create the new header reference node.
            sectPr.PrependChild<HeaderReference>(new HeaderReference() { Id = rId });
        }
    }
}