Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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. Um mit einem Präsentationsdokument zu arbeiten, erstellen Sie zuerst eine instance der PresentationDocument
Klasse, und arbeiten Sie dann mit diesem instance. Um die Klasse instance aus dem Dokument zu erstellen, rufen Sie die Open -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 dazu den Wert false
für den booleschen Parameter an, wie in der folgenden using
Anweisung gezeigt. In diesem Code ist der presentationFile
Parameter eine Zeichenfolge, die den Pfad für die Datei darstellt, aus der Sie das Dokument öffnen möchten.
{
// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
Mit v3.0.0 und höher wurde die Close() -Methode entfernt, um sich auf die using-Anweisung zu verlassen.
Dadurch wird sichergestellt, dass die Dispose() -Methode automatisch aufgerufen wird, wenn die schließende Klammer erreicht ist. Der Block, der auf die using
-Anweisung folgt, 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 einer Reihe von Teilen, darunter der Standard Teil, der die Präsentationsdefinition enthält. Der folgende Text aus der SPEZIFIKATION ISO/IEC 29500 stellt die Gesamtform eines Pakets vor PresentationML
.
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 Text in einem einzelnen Teil gespeichert. Die Elemente, mit deren Hilfe bestimmte Funktionsgruppierungen erfolgen, sind stattdessen in mehreren Teilen gespeichert. Beispielsweise werden alle Autoren in einem Dokument in einem Autorenteil gespeichert, während jede Folie über einen eigenen Teil verfügt.ISO/IEC 29500: 2016
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. In der folgenden Tabelle sind die Klassennamen der Klassen aufgeführt, die den sld
Elementen , 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 Zählen der Anzahl von Folien besteht aus zwei Überladungen der -Methode CountSlides
. Die erste Überladung verwendet einen string
Parameter und die zweite Überladung einen PresentationDocument
-Parameter. In der ersten CountSlides
Methode öffnet der Beispielcode das Präsentationsdokument in der using
-Anweisung. Anschließend wird das PresentationDocument
Objekt an die zweite CountSlides
Methode übergeben, die eine ganze Zahl zurückgibt, die die Anzahl der Folien in der Präsentation darstellt.
// 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 PresentationDocument
übergebene Objekt nicht null
ist. Andernfalls wird ein PresentationPart
-Objekt aus dem PresentationDocument
-Objekt abgerufen. Mit dem SlideParts
ruft der Code ab slideCount
und gibt ihn zurück.
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;
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 akzeptiert 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 und from
to
an die zweite überladene MoveSlide
Methode, die die eigentliche Verschiebung durchfü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, from
ob sich die nullbasierten Indizes und to
innerhalb des Bereichs befinden und sich voneinander unterscheiden.
// Move a slide to a different position in the slide order in the presentation.
static void MoveSlide(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 = 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 gleich dem Präsentationsteil des PresentationDocument
übergebenen Objekts festgelegt. Das PresentationPart
-Objekt wird verwendet, um ein Presentation
-Objekt und dann ein SlideIdList
-Objekt zu erstellen, 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;
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;
}
Die Remove
-Methode des SlideID
-Objekts wird verwendet, um die Quellfolie von ihrer aktuellen Position zu entfernen, und dann wird die InsertAfter
-Methode des SlideIdList
-Objekts verwendet, um die Quellfolie an der Indexposition nach 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);
Beispielcode
Im Folgenden finden Sie den vollständigen Beispielcode, mit dem Sie eine Folie in derselben Präsentationsdatei in C# und Visual Basic von einer Position an eine andere verschieben können.
// Counting the slides in the presentation.
public 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 CountSlides(presentationDocument);
}
}
// Count the slides in the presentation.
static int CountSlides(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.
public static void MoveSlide(string presentationFile, int from, int to)
{
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
MoveSlide(presentationDocument, from, to);
}
}
// Move a slide to a different position in the slide order in the presentation.
static void MoveSlide(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 = 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");
}
// 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);
}