Anleitung: Anwenden eines Desigs auf eine Präsentation

In diesem Thema wird erklärt, wie Sie die Klassen im Open XML SDK 2.0 für Microsoft Office zum programmgesteuerten Anwenden des Designs einer Präsentation auf eine andere Präsentation verwenden.

Die folgenden Assemblydirektiven sind zum Kompilieren des Codes in diesem Thema erforderlich.

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

Im Open XML SDK stellt die PresentationDocument-Klasse ein Präsentationsdokumentpaket dar. Zum Arbeiten mit einem Präsentationsdokument müssen Sie zuerst eine Instanz der PresentationDocument-Klasse erstellen und anschließend mit dieser Instanz arbeiten. Rufen Sie zum Erstellen der Klasseninstanz aus dem Dokument die Open(String, Boolean)-Methode auf, die einen Dateipfad und als zweiten Parameter einen booleschen Wert verwendet, um anzugeben, ob das Dokument bearbeitet werden kann. Geben Sie zum Öffnen eines Dokuments mit Schreibschutz den Wert false für diesen Parameter an. Geben Sie zum Öffnen eines Dokuments mit Lese-/Schreibzugriff den Wert true für diesen Parameter an. In der folgenden using-Anweisung werden zwei Präsentationsdateien geöffnet: die Zielpräsentation, auf die ein Design angewendet werden soll, und die Quellpräsentation, auf die das Design bereits angewendet wurde. Die Quellpräsentationsdatei wird mit Schreibschutz geöffnet, und die Zielpräsentationsdatei wird mit Lese-/Schreibzugriff geöffnet. In diesem Code ist der themePresentation-Parameter eine Zeichenfolge, die den Pfad für das Quellpräsentationsdokument darstellt, und der presentationFile-Parameter ist eine Zeichenfolge, die den Pfad für das Zielpräsentationsdokument darstellt.

using (PresentationDocument themeDocument = PresentationDocument.Open(themePresentation, false))
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
    // Insert other code here.
}

Die using-Anweisung ist eine empfohlene Alternative zur herkömmlichen Reihenfolge ".Open, .Save, .Close". Sie stellt sicher, dass die Dispose-Methode (vom Open XML SDK verwendete interne Methode zum Bereinigen von Ressourcen) bei Erreichen der schließenden Klammer automatisch aufgerufen wird. Der auf die using-Anweisung folgende Block richtet einen Bereich für das Objekt ein, das in der using-Anweisung erstellt oder benannt wird, in diesem Fall themeDocument und presentationDocument.

Die grundlegende Dokumentstruktur eines PresentationML-Dokuments besteht aus dem Hauptteil, der die Präsentationsdefinition enthält. In dem folgenden Text aus der -Spezifikation wird das Gesamtformat eines PresentationML-Pakets erläutert.

Der Hauptteil eines PresentationML-Pakets beginnt mit dem Stammelement der Präsentation. Dieses Element enthält eine Präsentation, die wiederum auf eine Folienliste, eine Folienmasterliste, eine Notizenmasterliste und eine Handzettelmasterliste verweist. Die Folienliste verweist auf alle Folien in der Präsentation. Die Folienmasterliste verweist auf sämtliche in der Präsentation verwendeten Folienmaster. Der Notizenmaster enthält Informationen zur Formatierung der Notizenseiten. Und der Handzettelmaster beschreibt das Aussehen eines Handzettels.
Ein Handzettel ist ein gedruckter Foliensatz, der an die Zielgruppe zur späteren Bezugnahme verteilt werden kann.
Neben Text und Grafiken kann jede Folie Kommentare und Notizen enthalten, ein Layout aufweisen und Teil mindestens einer zielgruppenorientierten Präsentation sein. (Ein Kommentar ist eine Anmerkung der Person, die die Foliengruppe der Präsentation verwaltet. Eine Notiz ist eine Erinnerung oder eine kurze Textstelle, die für den Präsentator oder die Zielgruppe bestimmt ist.)
Andere Features, die in einem PresentationML-Dokument enthalten sein können, sind Animationen, Audio, Video und Überblendungen zwischen den Folien.
Ein PresentationML-Dokument wird nicht als ein großer Textkörper in einem einzelnen Teil gespeichert. Die Elemente, mit deren Hilfe bestimmte Funktionsgruppierungen erfolgen, sind stattdessen in mehreren Teilen gespeichert. Beispielsweise sind alle Kommentare in einem Dokument in einem Kommentarteil gespeichert, wobei jede Folie über einen eigenen Teil verfügt.
© ISO/IEC29500: 2008. Die oben aufgeführten Textauszüge wurden von Microsoft (und/oder den Microsoft-Vendoren) von Englisch nach Deutsch übersetzt, und im Rahmen von ISO wird keinerlei Verantwortung für diese Übersetzungen übernommen.

Das folgende XML-Codesegment stellt eine Präsentation dar, die zwei Folien mit den IDs 267 und 256 enthält.

<p:presentation xmlns:p=“…” … > 
   <p:sldMasterIdLst>
      <p:sldMasterId
         xmlns:rel=“http://…/relationships” rel:id=“rId1”/>
   </p:sldMasterIdLst>
   <p:notesMasterIdLst>
      <p:notesMasterId
         xmlns:rel=“http://…/relationships” rel:id=“rId4”/>
   </p:notesMasterIdLst>
   <p:handoutMasterIdLst>
      <p:handoutMasterId
         xmlns:rel=“http://…/relationships” rel:id=“rId5”/>
   </p:handoutMasterIdLst>
   <p:sldIdLst>
      <p:sldId id=“267”
         xmlns:rel=“http://…/relationships” rel:id=“rId2”/>
      <p:sldId id=“256”
         xmlns:rel=“http://…/relationships” rel:id=“rId3”/>
   </p:sldIdLst>
       <p:sldSz cx=“9144000” cy=“6858000”/>
   <p:notesSz cx=“6858000” cy=“9144000”/>
</p:presentation>

Mit dem Open XML SDK 2.0 können Sie eine Dokumentstruktur und Inhalte erstellen, indem Sie stark typisierte Klassen verwenden, die PresentationML-Elementen entsprechen. Diese Klassen sind im DocumentFormat.OpenXml.Presentation-Namespace enthalten. Die folgende Tabelle enthält die Namen der Klassen, die den Elementen sld, sldLayout, sldMaster und notesMaster entsprechen.

PresentationML-Element

Open XML SDK 2.0-Klasse

Beschreibung

sld

Slide

Präsentationsfolie. Das SlidePart-Stammelement.

sldLayout

SlideLayout

Das Folienlayout. Das SlideLayoutPart-Stammelement.

sldMaster

SlideMaster

Der Folienmaster. Das SlideMasterPart-Stammelement.

notesMaster

NotesMaster

Notizenmaster (oder Handzettelmaster). Das NotesMasterPart-Stammelement.

Im folgenden Text aus der -Spezifikation erhalten Sie hierzu nützliche Informationen.

Dieses Element definiert den komplexen Typ auf Stammebene, der einem freigegebenen Stylesheet (oder Design) zugeordnet ist. Es enthält alle verschiedenen Formatierungsoptionen, die für ein Dokument über ein Design verfügbar sind, und es definiert das gesamte Aussehen und Verhalten des Dokuments, wenn Objekte mit Designs innerhalb des Dokuments verwendet werden. [Ein Beispiel: Stellen Sie sich das folgende Bild als ein Beispiel für verschiedene Designs vor, die auf eine Präsentation angewendet sind.
Designbeispiel
In diesem Beispiel wird gezeigt, wie ein Design die Schriftart, Farben, Hintergründe, Füllungen und Effekte für verschiedene Objekte in einer Präsentation beeinflussen kann. Ende des Beispiels]
© ISO/IEC29500: 2008. Die oben aufgeführten Textauszüge wurden von Microsoft (und/oder den Microsoft-Vendoren) von Englisch nach Deutsch übersetzt, und im Rahmen von ISO wird keinerlei Verantwortung für diese Übersetzungen übernommen.

In der folgenden Tabelle sind die möglichen untergeordneten Typen der Theme-Klasse aufgeführt.

PresentationML-Element

Open XML SDK 2.0-Klasse

Beschreibung

custClrLst

CustomColorList

Benutzerdefinierte Farbliste

extLst

ExtensionList

Erweiterungsliste

extraClrSchemeLst

ExtraColorSchemeList

Liste zusätzlicher Farbschemata

objectDefaults

ObjectDefaults

Objektstandardwerte

themeElements

ThemeElements

Designelemente

Das folgende XML-Schemafragment definiert vier Teile des Designelements. Das themeElements-Element enthält die wichtigste Formatierung, die innerhalb des Designs definiert ist. Die anderen Teile stellen Überschreibungen, Standardwerte und Ergänzungen zu den Informationen in themeElements bereit. Der komplexe Typ, mit dem ein Design definiert ist (CT_OfficeStyleSheet) wird wie folgt definiert:

<complexType name=“CT_OfficeStyleSheet”>
   <sequence>
       <element name=“themeElements” type=“CT_BaseStyles” minOccurs=“1” maxOccurs=“1”/>
       <element name=“objectDefaults” type=“CT_ObjectStyleDefaults” minOccurs=“0” maxOccurs=“1”/>
       <element name=“extraClrSchemeLst” type=“CT_ColorSchemeList” minOccurs=“0” maxOccurs=“1”/>
       <element name=“custClrLst” type=“CT_CustomColorList” minOccurs=“0” maxOccurs=“1”/>
       <element name=“extLst” type=“CT_OfficeArtExtensionList” minOccurs=“0” maxOccurs=“1”/>
   </sequence>
   <attribute name=“name” type=“xsd:string” use=“optional” default=““/>
</complexType>

Dieser komplexe Typ umfasst auch ein CT_OfficeArtExtensionList-Element, das für die zukünftige Erweiterbarkeit dieses komplexen Typs verwendet wird.

Der Beispielcode besteht aus zwei Überladungen der ApplyThemeToPresentation-Methode und der GetSlideLayoutType-Methode. Das folgende Codesegment zeigt die erste überladene Methode, in der die beiden Präsentationsdateien themePresentation und presentationFile geöffnet und an die zweite überladene Methode als Parameter übergeben werden.

// Apply a new theme to the presentation. 
public static void ApplyThemeToPresentation(string presentationFile, string themePresentation)
{
    using (PresentationDocument themeDocument = PresentationDocument.Open(themePresentation, false))
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
        ApplyThemeToPresentation(presentationDocument, themeDocument);
    }
}

In der zweiten überladenen Methode wird zunächst überprüft, ob eine der Präsentationen leer ist. In diesem Fall würde eine Ausnahme ausgegeben. Der Code ruft dann den Präsentationsteil des Präsentationsdokuments ab, indem ein PresentationPart-Objekt deklariert wird und gleich dem Präsentationsteil des übergebenen PresentationDocument-Zielobjekts festgelegt wird. Dann werden die Folienmasterteile aus den Präsentationsteilen der beiden übergebenen Objekte und die Beziehungs-ID des Folienmasterteils der Zielpräsentation abgerufen.

// Apply a new theme to the presentation. 
public static void ApplyThemeToPresentation(PresentationDocument presentationDocument, PresentationDocument themeDocument)
{
    if (presentationDocument == null)
    {
        throw new ArgumentNullException(“presentationDocument”);
    }
    if (themeDocument == null)
    {
        throw new ArgumentNullException(“themeDocument”);
    }

    // Get the presentation part of the presentation document.
    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // Get the existing slide master part.
    SlideMasterPart slideMasterPart = presentationPart.SlideMasterParts.ElementAt(0);
    string relationshipId = presentationPart.GetIdOfPart(slideMasterPart);

    // Get the new slide master part.
    SlideMasterPart newSlideMasterPart = themeDocument.PresentationPart.SlideMasterParts.ElementAt(0);

Der Code entfernt dann den vorhandenen Designteil und den Folienmasterteil aus der Zielpräsentation. Durch die Wiederverwendung der alten Beziehungs-ID wird der neue Folienmasterteil aus der Quellpräsentation der Zielpräsentation hinzugefügt. Zudem wird der Designteil der Zielpräsentation hinzugefügt.

// Remove the existing theme part.
presentationPart.DeletePart(presentationPart.ThemePart);

// Remove the old slide master part.
presentationPart.DeletePart(slideMasterPart);

// Import the new slide master part, and reuse the old relationship ID.
newSlideMasterPart = presentationPart.AddPart(newSlideMasterPart, relationshipId);

// Change to the new theme part.
presentationPart.AddPart(newSlideMasterPart.ThemePart);

Der Code durchläuft alle Folienlayoutteile im Folienmasterteil und fügt sie der Liste der neuen Folienlayouts hinzu. Er gibt den Standardlayouttyp an. Für dieses Beispiel lautet der Code für den Standardlayouttyp Title and Content.

Dictionary<string, SlideLayoutPart> newSlideLayouts = new Dictionary<string, SlideLayoutPart>();

foreach (var slideLayoutPart in newSlideMasterPart.SlideLayoutParts)
{
    newSlideLayouts.Add(GetSlideLayoutType(slideLayoutPart), slideLayoutPart);
}

string layoutType = null;
SlideLayoutPart newLayoutPart = null;

// Insert the code for the layout for this example.
string defaultLayoutType = “Title and Content”;

Der Code durchläuft alle Folienteile in der Zielpräsentation und entfernt die Folienlayoutbeziehung in allen Folien. Er verwendet die GetSlideLayoutType-Methode, um nach dem Layouttyp des Folienlayoutteils zu suchen. Für jede Folie mit vorhandenem Folienlayoutteil wird ein neuer Folienlayoutteil entsprechend dem Typ hinzugefügt, der zuvor vorhanden war. Für jede Folie ohne vorhandenen Folienlayoutteil wird ein neuer Folienlayoutteil entsprechend dem Standardtyp hinzugefügt.

// Remove the slide layout relationship on all slides. 
foreach (var slidePart in presentationPart.SlideParts)
{
    layoutType = null;

    if (slidePart.SlideLayoutPart != null)
    {
        // Determine the slide layout type for each slide.
        layoutType = GetSlideLayoutType(slidePart.SlideLayoutPart);

        // Delete the old layout part.
        slidePart.DeletePart(slidePart.SlideLayoutPart);
    }

    if (layoutType != null && newSlideLayouts.TryGetValue(layoutType, out newLayoutPart))
    {
        // Apply the new layout part.
        slidePart.AddPart(newLayoutPart);
    }
    else
    {
        newLayoutPart = newSlideLayouts[defaultLayoutType];

        // Apply the new default layout part.
        slidePart.AddPart(newLayoutPart);
    }
}
' Remove the slide layout relationship on all slides. 
For Each slidePart In presentationPart.SlideParts
    layoutType = Nothing

    If slidePart.SlideLayoutPart IsNot Nothing Then
        ' Determine the slide layout type for each slide.
        layoutType = GetSlideLayoutType(slidePart.SlideLayoutPart)

        ' Delete the old layout part.
        slidePart.DeletePart(slidePart.SlideLayoutPart)
    End If

    If layoutType IsNot Nothing AndAlso newSlideLayouts.TryGetValue(layoutType, newLayoutPart) Then
        ' Apply the new layout part.
        slidePart.AddPart(newLayoutPart)
    Else
        newLayoutPart = newSlideLayouts(defaultLayoutType)

        ' Apply the new default layout part.
        slidePart.AddPart(newLayoutPart)
    End If
Next slidePart

Zum Abrufen des Folienlayouttyps verwendet der Code die GetSlideLayoutType-Methode, die den Folienlayoutteil als Parameter enthält, und gibt an die zweite überladene ApplyThemeToPresentation-Methode eine Zeichenfolge zurück, die den Namen des Folienlayouttyps darstellt.

// Get the slide layout type.
public static string GetSlideLayoutType(SlideLayoutPart slideLayoutPart)
{
    CommonSlideData slideData = slideLayoutPart.SlideLayout.CommonSlideData;

    // Remarks: If this is used in production code, check for a null reference.

    return slideData.Name;}

Es folgt der vollständige Beispielcode, den Sie zum Kopieren eines Designs aus einer Präsentation in eine andere verwenden können. Zur Verwendung des Programms müssen Sie zwei Präsentationen erstellen: eine Quellpräsentation mit dem Design, das Sie kopieren möchten (z. B. Myppt9-theme.pptx), und eine Zielpräsentation (z. B. Myppt9.pptx). Für den Kopiervorgang können Sie den folgenden Aufruf im Programm verwenden.

string presentationFile=@”C:\Users\Public\Documents\myppt2.pptx”;
string themePresentation = @”C:\Users\Public\Documents\myppt2-theme.pptx”;
ApplyThemeToPresentation(presentationFile, themePresentation);

Nach Durchführung dieses Aufrufs können Sie die Datei Myppt2.pptx überprüfen, und es sollte dasselbe Design angezeigt werden wie in der Datei Myppt9-theme.pptx.

// Apply a new theme to the presentation. 
public static void ApplyThemeToPresentation(string presentationFile, string themePresentation)
{
    using (PresentationDocument themeDocument = PresentationDocument.Open(themePresentation, false))
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
        ApplyThemeToPresentation(presentationDocument, themeDocument);
    }
}

// Apply a new theme to the presentation. 
public static void ApplyThemeToPresentation(PresentationDocument presentationDocument, PresentationDocument themeDocument)
{
    if (presentationDocument == null)
    {
        throw new ArgumentNullException(“presentationDocument”);
    }
    if (themeDocument == null)
    {
        throw new ArgumentNullException(“themeDocument”);
    }

    // Get the presentation part of the presentation document.
    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // Get the existing slide master part.
    SlideMasterPart slideMasterPart = presentationPart.SlideMasterParts.ElementAt(0);
    string relationshipId = presentationPart.GetIdOfPart(slideMasterPart);

    // Get the new slide master part.
    SlideMasterPart newSlideMasterPart = themeDocument.PresentationPart.SlideMasterParts.ElementAt(0);

    // Remove the existing theme part.
    presentationPart.DeletePart(presentationPart.ThemePart);

    // Remove the old slide master part.
    presentationPart.DeletePart(slideMasterPart);

    // Import the new slide master part, and reuse the old relationship ID.
    newSlideMasterPart = presentationPart.AddPart(newSlideMasterPart, relationshipId);

    // Change to the new theme part.
    presentationPart.AddPart(newSlideMasterPart.ThemePart);

    Dictionary<string, SlideLayoutPart> newSlideLayouts = new Dictionary<string, SlideLayoutPart>();

    foreach (var slideLayoutPart in newSlideMasterPart.SlideLayoutParts)
    {
        newSlideLayouts.Add(GetSlideLayoutType(slideLayoutPart), slideLayoutPart);
    }

    string layoutType = null;
    SlideLayoutPart newLayoutPart = null;

    // Insert the code for the layout for this example.
    string defaultLayoutType = “Title and Content”;

    // Remove the slide layout relationship on all slides. 
    foreach (var slidePart in presentationPart.SlideParts)
    {
        layoutType = null;

        if (slidePart.SlideLayoutPart != null)
        {
            // Determine the slide layout type for each slide.
            layoutType = GetSlideLayoutType(slidePart.SlideLayoutPart);

            // Delete the old layout part.
            slidePart.DeletePart(slidePart.SlideLayoutPart);
        }

        if (layoutType != null && newSlideLayouts.TryGetValue(layoutType, out newLayoutPart))
        {
            // Apply the new layout part.
            slidePart.AddPart(newLayoutPart);
        }
        else
        {
            newLayoutPart = newSlideLayouts[defaultLayoutType];

            // Apply the new default layout part.
            slidePart.AddPart(newLayoutPart);
        }
    }
}

// Get the slide layout type.
public static string GetSlideLayoutType(SlideLayoutPart slideLayoutPart)
{
    CommonSlideData slideData = slideLayoutPart.SlideLayout.CommonSlideData;

    // Remarks: If this is used in production code, check for a null reference.

    return slideData.Name;
}
Anzeigen:
© 2014 Microsoft