Löschen einer Folie aus einer Präsentation
In diesem Thema wird gezeigt, wie Sie das Open XML SDK für Office verwenden, um eine Folie programmgesteuert aus einer Präsentation zu löschen. Außerdem wird gezeigt, wie alle Verweise auf die Folie aus allen benutzerdefinierten Shows gelöscht werden, die möglicherweise vorhanden sind. Um eine bestimmte Folie in einer Präsentationsdatei zu löschen, müssen Sie zuerst die Anzahl der Folien in der Präsentation kennen. Daher ist der Code in dieser Anleitung in zwei Teile unterteilt. Die erste Zählung ist die Anzahl der Folien, und die zweite Löschung einer Folie an einem bestimmten Index.
Hinweis
Zum Löschen einer Folie aus komplexeren Präsentationen, z. B. aus denjenigen, die Gliederungsansichtseinstellungen enthalten, sind ggf. zusätzliche Schritte erforderlich.
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 eine der Open
Methodenüberladungen auf. Der Code in diesem Thema verwendet die Open -Methode, die einen Dateipfad als ersten Parameter verwendet, um die zu öffnende Datei anzugeben, und einen booleschen Wert als zweiten Parameter, um anzugeben, ob ein Dokument bearbeitet werden kann. Legen Sie diesen zweiten Parameter auf fest false
, um die Datei für schreibgeschützten Zugriff zu öffnen, oder true
wenn Sie die Datei für Lese-/Schreibzugriff öffnen möchten. Der Code in diesem Thema öffnet die Datei zweimal, einmal zum Berechnen der Anzahl von Folien und einmal zum Löschen einer bestimmten Folie. Zum Zählen der Anzahl von Folien in einer Präsentation wird empfohlen, dass Sie die Datei mit Schreibschutz öffnen, um das versehentliche Schreiben in die Datei zu verhindern. Die folgende using
Anweisung öffnet die Datei für den schreibgeschützten Zugriff. In diesem Codebeispiel 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))
Um eine Folie aus der Präsentationsdatei zu löschen, öffnen Sie sie für Lese-/Schreibzugriff, wie in der folgenden using
Anweisung gezeigt.
// Open the source document as read/write.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
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 -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. |
Berechnen der Anzahl der Folien
Der Beispielcode besteht aus zwei Überladungen der CountSlides
-Methode. 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 CountSlide 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. Mithilfe des SlideParts
ruft der Code den slideCount ab und gibt ihn zurück.
if (presentationDocument is 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 is not null)
{
slidesCount = presentationPart.SlideParts.Count();
}
// Return the slide count to the previous method.
return slidesCount;
Löschen einer bestimmten Folie
Der Code zum Löschen einer Folie verwendet zwei Überladungen der DeleteSlide
-Methode. Die erste überladene DeleteSlide
Methode akzeptiert zwei Parameter: eine Zeichenfolge, die den Namen der Präsentationsdatei und den Pfad darstellt, und eine ganze Zahl, die die nullbasierte Indexposition der zu löschenden Folie darstellt. Es öffnet die Präsentationsdatei für Lese-/Schreibzugriff, ruft ein PresentationDocument
-Objekt ab und übergibt dann dieses Objekt und die Indexnummer an die nächste überladene DeleteSlide
Methode, die den Löschvorgang ausführt.
// Get the presentation object and pass it to the next DeleteSlide method.
static void DeleteSlide(string presentationFile, int slideIndex)
{
// Open the source document as read/write.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
// Pass the source document and the index of the slide to be deleted to the next DeleteSlide method.
DeleteSlide(presentationDocument, slideIndex);
}
}
Im ersten Abschnitt der zweiten überladenen DeleteSlide
Methode wird die CountSlides
-Methode verwendet, um die Anzahl der Folien in der Präsentation abzurufen. Anschließend wird die Liste der Folien-IDs in der Präsentation abgerufen, die angegebene Folie in der Folienliste bestimmt und die Folie aus der Folienliste entfernt.
// Delete the specified slide from the presentation.
static void DeleteSlide(PresentationDocument presentationDocument, int slideIndex)
{
if (presentationDocument is null)
{
throw new ArgumentNullException(nameof(presentationDocument));
}
// Use the CountSlides sample to get the number of slides in the presentation.
int slidesCount = CountSlides(presentationDocument);
if (slideIndex < 0 || slideIndex >= slidesCount)
{
throw new ArgumentOutOfRangeException("slideIndex");
}
// Get the presentation part from the presentation document.
PresentationPart? presentationPart = presentationDocument.PresentationPart;
// Get the presentation from the presentation part.
Presentation? presentation = presentationPart?.Presentation;
// Get the list of slide IDs in the presentation.
SlideIdList? slideIdList = presentation?.SlideIdList;
// Get the slide ID of the specified slide
SlideId? slideId = slideIdList?.ChildElements[slideIndex] as SlideId;
// Get the relationship ID of the slide.
string? slideRelId = slideId?.RelationshipId;
// If there's no relationship ID, there's no slide to delete.
if (slideRelId is null)
{
return;
}
// Remove the slide from the slide list.
slideIdList!.RemoveChild(slideId);
Im nächsten Abschnitt der zweiten überladenen DeleteSlide
Methode werden alle Verweise auf die gelöschte Folie aus benutzerdefinierten Shows entfernt. Dazu werden die Liste der zielgruppenorientierten Präsentationen und die Liste der Folien in jeder zielgruppenorientierten Präsentation durchlaufen.
Dann wird eine verknüpfte Liste der Folienlisteneinträge deklariert und instanziiert, und anhand der Beziehungs-ID dieser Folie wird nach Verweisen auf die gelöschte Folie gesucht. Diese Verweise werden der Liste der Folienlisteneinträge hinzugefügt, und alle diese Verweise werden aus der Folienliste der entsprechenden zielgruppenorientierten Präsentation entfernt.
// Remove references to the slide from all custom shows.
if (presentation!.CustomShowList is not null)
{
// Iterate through the list of custom shows.
foreach (var customShow in presentation.CustomShowList.Elements<CustomShow>())
{
if (customShow.SlideList is not null)
{
// Declare a link list of slide list entries.
LinkedList<SlideListEntry> slideListEntries = new LinkedList<SlideListEntry>();
foreach (SlideListEntry slideListEntry in customShow.SlideList.Elements())
{
// Find the slide reference to remove from the custom show.
if (slideListEntry.Id is not null && slideListEntry.Id == slideRelId)
{
slideListEntries.AddLast(slideListEntry);
}
}
// Remove all references to the slide from the custom show.
foreach (SlideListEntry slideListEntry in slideListEntries)
{
customShow.SlideList.RemoveChild(slideListEntry);
}
}
}
}
Schließlich löscht der Code den Folienteil für die gelöschte Folie.
// Get the slide part for the specified slide.
SlidePart slidePart = (SlidePart)presentationPart!.GetPartById(slideRelId);
// Remove the slide part.
presentationPart.DeletePart(slidePart);
Beispielcode
Nachstehend ist der vollständige Beispielcode in C# und Visual Basic aufgeführt.
// Get the presentation object and pass it to the next CountSlides method.
static int CountSlides(string presentationFile)
{
// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
{
// Pass the presentation to the next CountSlide method
// and return the slide count.
return CountSlides(presentationDocument);
}
}
// Count the slides in the presentation.
static int CountSlides(PresentationDocument presentationDocument)
{
if (presentationDocument is 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 is not null)
{
slidesCount = presentationPart.SlideParts.Count();
}
// Return the slide count to the previous method.
return slidesCount;
}
// Get the presentation object and pass it to the next DeleteSlide method.
static void DeleteSlide(string presentationFile, int slideIndex)
{
// Open the source document as read/write.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
// Pass the source document and the index of the slide to be deleted to the next DeleteSlide method.
DeleteSlide(presentationDocument, slideIndex);
}
}
// Delete the specified slide from the presentation.
static void DeleteSlide(PresentationDocument presentationDocument, int slideIndex)
{
if (presentationDocument is null)
{
throw new ArgumentNullException(nameof(presentationDocument));
}
// Use the CountSlides sample to get the number of slides in the presentation.
int slidesCount = CountSlides(presentationDocument);
if (slideIndex < 0 || slideIndex >= slidesCount)
{
throw new ArgumentOutOfRangeException("slideIndex");
}
// Get the presentation part from the presentation document.
PresentationPart? presentationPart = presentationDocument.PresentationPart;
// Get the presentation from the presentation part.
Presentation? presentation = presentationPart?.Presentation;
// Get the list of slide IDs in the presentation.
SlideIdList? slideIdList = presentation?.SlideIdList;
// Get the slide ID of the specified slide
SlideId? slideId = slideIdList?.ChildElements[slideIndex] as SlideId;
// Get the relationship ID of the slide.
string? slideRelId = slideId?.RelationshipId;
// If there's no relationship ID, there's no slide to delete.
if (slideRelId is null)
{
return;
}
// Remove the slide from the slide list.
slideIdList!.RemoveChild(slideId);
// Remove references to the slide from all custom shows.
if (presentation!.CustomShowList is not null)
{
// Iterate through the list of custom shows.
foreach (var customShow in presentation.CustomShowList.Elements<CustomShow>())
{
if (customShow.SlideList is not null)
{
// Declare a link list of slide list entries.
LinkedList<SlideListEntry> slideListEntries = new LinkedList<SlideListEntry>();
foreach (SlideListEntry slideListEntry in customShow.SlideList.Elements())
{
// Find the slide reference to remove from the custom show.
if (slideListEntry.Id is not null && slideListEntry.Id == slideRelId)
{
slideListEntries.AddLast(slideListEntry);
}
}
// Remove all references to the slide from the custom show.
foreach (SlideListEntry slideListEntry in slideListEntries)
{
customShow.SlideList.RemoveChild(slideListEntry);
}
}
}
}
// Get the slide part for the specified slide.
SlidePart slidePart = (SlidePart)presentationPart!.GetPartById(slideRelId);
// Remove the slide part.
presentationPart.DeletePart(slidePart);
}