Verschieben einer Folie an eine neue Position in einer Präsentation
In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um eine Folie programmgesteuert an eine neue Position in einer Präsentation zu verschieben.
Abrufen eines Presentation-Objekts
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. Um die Klasse instance aus dem Dokument zu erstellen, rufen Sie die Open(String, Boolean)-Methode auf, die einen Dateipfad verwendet, und einen booleschen Wert als zweiten Parameter, um anzugeben, ob ein Dokument bearbeitet werden kann. Wenn Sie die Anzahl von Folien in einer Präsentation zählen möchten, können Sie die Datei am besten mit Schreibschutz öffnen, um das versehentliche Schreiben in die Datei zu verhindern. Geben Sie hierzu den Wert false für den booleschen Parameter an, wie in der folgenden using-Anweisung gezeigt. In diesem Code handelt es sich bei dem presentationFile-Parameter um eine Zeichenfolge, die den Pfad zu der Datei darstellt, aus der Sie das Dokument öffnen möchten.
// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
{
// 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 presentationDocument.
Grundlegende Präsentationsdokumentstruktur
Die grundlegende Dokumentstruktur eines PresentationML-Dokuments besteht aus vielen Teilen, darunter der Hauptteil mit der Präsentationsdefinition. Der folgende Text aus der SPEZIFIKATION ISO/IEC 29500 stellt die Gesamtform eines PresentationML-Pakets vor.
Der Standard Teil eines PresentationML-Pakets beginnt mit einem Präsentationsstammelement. Dieses Element enthält eine Präsentation, die wiederum auf eine Folienliste, eine Folie master Liste, eine Notizen- master Liste und ein Handzettel master Liste verweist. Die Folienliste bezieht sich auf alle Folien in der Präsentation; Die Folie master Liste bezieht sich auf die gesamten Folienmaster, die in der Präsentation verwendet werden; die Notizen master enthält Informationen zur Formatierung von Notizenseiten; und die Handzettel master beschreibt, wie ein Handzettel aussieht.
Ein Handzettel ist ein gedruckter Foliensatz, der an das Publikum 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 an die Person, die die Präsentationsfolien verwaltet, gerichtete Anmerkung. Eine Notiz ist eine Erinnerung oder eine kurze Textstelle, die für den Präsentator oder das Publikum bestimmt ist.
Weitere Features, die ein PresentationML-Dokument umfassen kann: Animation, Audio, Video und Übergänge zwischen 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.
Das folgende XML-Codebeispiel 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="https://…/relationships" rel:id="rId1"/>
</p:sldMasterIdLst>
<p:notesMasterIdLst>
<p:notesMasterId
xmlns:rel="https://…/relationships" rel:id="rId4"/>
</p:notesMasterIdLst>
<p:handoutMasterIdLst>
<p:handoutMasterId
xmlns:rel="https://…/relationships" rel:id="rId5"/>
</p:handoutMasterIdLst>
<p:sldIdLst>
<p:sldId id="267"
xmlns:rel="https://…/relationships" rel:id="rId2"/>
<p:sldId id="256"
xmlns:rel="https://…/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 können Sie Dokumentstrukturen und -inhalte mithilfe stark typisierter Klassen erstellen, die PresentationML-Elementen entsprechen. Sie finden diese Klassen im DocumentFormat.OpenXml.Presentation-Namespace . Die folgende Tabelle enthält die Namen der Klassen, die den Elementen sld, sldLayout, sldMaster und notesMaster entsprechen.
PresentationML-Element | Open XML SDK-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. |
Funktionsweise des Beispielcodes
Wenn Sie eine bestimmte Folie in einer Präsentationsdatei an eine neue Position verschieben möchten, muss Ihnen zunächst die Anzahl von Folien in der Präsentation bekannt sein. Daher ist der Code in diesem Thema in zwei Teile unterteilt. Im ersten Teil wird die Anzahl der Folien berechnet, und im zweiten Teil wird eine Folie an eine neue Position verschoben.
Berechnen der Anzahl der Folien
Der Beispielcode zum Berechnen der Anzahl von Folien besteht aus zwei Überladungen der CountSlides-Methode. Die erste Überladung verwendet einen Parameter vom Typ string, die zweite einen Parameter vom Typ PresentationDocument. In der ersten CountSlides-Methode öffnet der Beispielcode das Präsentationsdokument in der using-Anweisung. Dann übergibt er das PresentationDocument-Objekt an die zweite CountSlides-Methode, die eine ganze Zahl zurückgibt, mit der die Anzahl der Folien in der Präsentation dargestellt wird.
// Pass the presentation to the next CountSlides method
// and return the slide count.
return CountSlides(presentationDocument);
In der zweiten CountSlides-Methode überprüft der Code, ob das übergebene PresentationDocument-Objekt nicht NULL ist. Andernfalls wird ein PresentationPart-Objekt aus dem PresentationDocument-Objekt abgerufen. Mithilfe der SlideParts ruft der Code den slideCount ab und gibt ihn zurück.
// Check for a null document object.
if (presentationDocument == null)
{
throw new ArgumentNullException("presentationDocument");
}
int slidesCount = 0;
// Get the presentation part of document.
PresentationPart presentationPart = presentationDocument.PresentationPart;
// Get the slide count from the SlideParts.
if (presentationPart != null)
{
slidesCount = presentationPart.SlideParts.Count();
}
// Return the slide count to the previous method.
return slidesCount;
Verschieben einer Folie von einer Position an eine andere
Wenn Sie eine Folie an eine neue Position verschieben, müssen Sie die Datei für Lese-/Schreibzugriff öffnen, indem Sie den Wert true für den booleschen Parameter angeben, wie in der folgenden using-Anweisung gezeigt. Der Code zum Verschieben einer Folie besteht aus zwei Überladungen der MoveSlide-Methode . Die erste überladene MoveSlide-Methode verwendet drei Parameter: eine Zeichenfolge, die den Namen der Präsentationsdatei und den Pfad darstellt, und zwei ganze Zahlen, die die aktuelle Indexposition der Folie und die Indexposition darstellen, an die die Folie verschoben werden soll. Es öffnet die Präsentationsdatei, ruft ein PresentationDocument-Objekt ab und übergibt dann dieses Objekt und die beiden ganzen Zahlen von und an die zweite überladene MoveSlide-Methode , die die eigentliche Verschiebung ausführt.
// Move a slide to a different position in the slide order in the presentation.
public static void MoveSlide(string presentationFile, int from, int to)
{
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
MoveSlide(presentationDocument, from, to);
}
}
In der zweiten überladenen MoveSlide-Methode wird die CountSlides-Methode aufgerufen, um die Anzahl der Folien in der Präsentation abzurufen. Der Code überprüft dann, ob sich die nullbasierten Indizes von und bis innerhalb des Bereichs befinden und sich voneinander unterscheiden.
public static void MoveSlide(PresentationDocument presentationDocument, int from, int to)
{
if (presentationDocument == null)
{
throw new ArgumentNullException("presentationDocument");
}
// Call the CountSlides method to get the number of slides in the presentation.
int slidesCount = CountSlides(presentationDocument);
// Verify that both from and to positions are within range and different from one another.
if (from < 0 || from >= slidesCount)
{
throw new ArgumentOutOfRangeException("from");
}
if (to < 0 || from >= slidesCount || to == from)
{
throw new ArgumentOutOfRangeException("to");
}
Ein PresentationPart-Objekt wird deklariert und entsprechend dem Präsentationsteil des übergebenen PresentationDocument-Zielobjekts festgelegt. Das PresentationPart-Objekt wird zum Erstellen eines Presentation-Objekts verwendet, und dann wird ein SlideIdList-Objekt erstellt, das die Liste der Folien in der Präsentation aus dem Presentation-Objekt darstellt. Es wird eine Folien-ID der Quellfolie (der zu verschiebenden Folie) zurückgegeben, und dann wird die Position der Zielfolie identifiziert (der Folie, hinter die die Quellfolie in der Folienreihenfolge verschoben werden soll).
// Get the presentation part from the presentation document.
PresentationPart presentationPart = presentationDocument.PresentationPart;
// The slide count is not zero, so the presentation must contain slides.
Presentation presentation = presentationPart.Presentation;
SlideIdList slideIdList = presentation.SlideIdList;
// Get the slide ID of the source slide.
SlideId sourceSlide = slideIdList.ChildElements[from] as SlideId;
SlideId targetSlide = null;
// Identify the position of the target slide after which to move the source slide.
if (to == 0)
{
targetSlide = null;
}
else if (from < to)
{
targetSlide = slideIdList.ChildElements[to] as SlideId;
}
else
{
targetSlide = slideIdList.ChildElements[to - 1] as SlideId;
}
Die Remove-Methode des SlideID-Objekts wird zum Entfernen der Quellfolie von der aktuellen Position verwendet, und dann wird die InsertAfter-Methode des SlideIdList-Objekts verwendet, um die Quellfolie an der Indexposition hinter der Zielfolie einzufügen. Schließlich wird die geänderte Präsentation gespeichert.
// Remove the source slide from its current position.
sourceSlide.Remove();
// Insert the source slide at its new position after the target slide.
slideIdList.InsertAfter(sourceSlide, targetSlide);
// Save the modified presentation.
presentation.Save();
Beispielcode
Es folgt der vollständige Beispielcode, den Sie zum Verschieben einer Folie von einer Position an eine andere Position in derselben Präsentationsdatei verwenden können. Für instance können Sie den folgenden Aufruf in Ihrem Programm verwenden, um eine Folie in einer Präsentationsdatei namens "Myppt11.pptx" von Position 0 an Position 1 zu verschieben.
MoveSlide(@"C:\Users\Public\Documents\Myppt11.pptx", 0, 1);
Überprüfen Sie nach Ausführung des Programms die neuen Positionen der Folien in der Präsentationsdatei.
Es folgt der vollständige Beispielcode in C# und Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using System;
using System.Linq;
CountSlides(args[0]);
// Counting the slides in the presentation.
static int CountSlides(string presentationFile)
{
// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
{
// Pass the presentation to the next CountSlides method
// and return the slide count.
return CountSlidesFromPresentation(presentationDocument);
}
}
// Count the slides in the presentation.
static int CountSlidesFromPresentation(PresentationDocument presentationDocument)
{
int slidesCount = 0;
// Get the presentation part of document.
PresentationPart? presentationPart = presentationDocument.PresentationPart;
// Get the slide count from the SlideParts.
if (presentationPart is not null)
{
slidesCount = presentationPart.SlideParts.Count();
}
// Return the slide count to the previous method.
return slidesCount;
}
// Move a slide to a different position in the slide order in the presentation.
static void MoveSlide(string presentationFile, int from, int to)
{
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
MoveSlideFromPresentation(presentationDocument, from, to);
}
}
// Move a slide to a different position in the slide order in the presentation.
static void MoveSlideFromPresentation(PresentationDocument presentationDocument, int from, int to)
{
if (presentationDocument is null)
{
throw new ArgumentNullException("presentationDocument");
}
// Call the CountSlides method to get the number of slides in the presentation.
int slidesCount = CountSlidesFromPresentation(presentationDocument);
// Verify that both from and to positions are within range and different from one another.
if (from < 0 || from >= slidesCount)
{
throw new ArgumentOutOfRangeException("from");
}
if (to < 0 || from >= slidesCount || to == from)
{
throw new ArgumentOutOfRangeException("to");
}
// Get the presentation part from the presentation document.
PresentationPart? presentationPart = presentationDocument.PresentationPart;
// The slide count is not zero, so the presentation must contain slides.
Presentation? presentation = presentationPart?.Presentation;
if (presentation is null)
{
throw new ArgumentNullException(nameof(presentation));
}
SlideIdList? slideIdList = presentation.SlideIdList;
if (slideIdList is null)
{
throw new ArgumentNullException(nameof(slideIdList));
}
// Get the slide ID of the source slide.
SlideId? sourceSlide = slideIdList.ChildElements[from] as SlideId;
if (sourceSlide is null)
{
throw new ArgumentNullException(nameof(sourceSlide));
}
SlideId? targetSlide = null;
// Identify the position of the target slide after which to move the source slide.
if (to == 0)
{
targetSlide = null;
}
else if (from < to)
{
targetSlide = slideIdList.ChildElements[to] as SlideId;
}
else
{
targetSlide = slideIdList.ChildElements[to - 1] as SlideId;
}
// Remove the source slide from its current position.
sourceSlide.Remove();
// Insert the source slide at its new position after the target slide.
slideIdList.InsertAfter(sourceSlide, targetSlide);
// Save the modified presentation.
presentation.Save();
}