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 verwenden, um eine neue Folie programmgesteuert in eine Präsentation einzufügen.
Abrufen eines PresentationDocument-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. Um ein Dokument für Lese-/Schreibzugriff zu öffnen, geben Sie den Wert true
für diesen Parameter an, wie in der folgenden using
Anweisung gezeigt.
In diesem Codesegment ist der presentationFile
Parameter eine Zeichenfolge, die den vollständigen Pfad für die Datei darstellt, aus der Sie das Dokument öffnen möchten.
// 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 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
Der Beispielcode besteht aus zwei Überladungen der InsertNewSlide
-Methode. Die erste überladene Methode akzeptiert drei Parameter: den vollständigen Pfad zur Präsentationsdatei, der Sie eine Folie hinzufügen möchten, eine ganze Zahl, welche die auf 0 basierende Folienindexposition in der Präsentation darstellt, an der Sie die Folie hinzufügen, und die Zeichenfolge, die den Titel der neuen Folie darstellt. Sie öffnet die Präsentationsdatei als Lese-/Schreibzugriff, ruft ein PresentationDocument
-Objekt ab und übergibt dieses Objekt dann an die zweite überladene InsertNewSlide
Methode, die die Einfügung durchführt.
// Insert a slide into the specified presentation.
public static void InsertNewSlide(string presentationFile, int position, string slideTitle)
{
// Open the source document as read/write.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
// Pass the source document and the position and title of the slide to be inserted to the next method.
InsertNewSlide(presentationDocument, position, slideTitle);
}
}
Die zweite überladene InsertNewSlide
Methode erstellt ein neues Slide
-Objekt, legt dessen Eigenschaften fest und fügt es dann in die Folienreihenfolge in der Präsentation ein. Im ersten Abschnitt der Methode werden die Folie erstellt und ihre Eigenschaften festgelegt.
// Insert the specified slide into the presentation at the specified position.
public static SlidePart InsertNewSlide(PresentationDocument presentationDocument, int position, string slideTitle)
{
PresentationPart? presentationPart = presentationDocument.PresentationPart;
// Verify that the presentation is not empty.
if (presentationPart is null)
{
throw new InvalidOperationException("The presentation document is empty.");
}
// Declare and instantiate a new slide.
Slide slide = new Slide(new CommonSlideData(new ShapeTree()));
uint drawingObjectId = 1;
// Construct the slide content.
// Specify the non-visual properties of the new slide.
CommonSlideData commonSlideData = slide.CommonSlideData ?? slide.AppendChild(new CommonSlideData());
ShapeTree shapeTree = commonSlideData.ShapeTree ?? commonSlideData.AppendChild(new ShapeTree());
NonVisualGroupShapeProperties nonVisualProperties = shapeTree.AppendChild(new NonVisualGroupShapeProperties());
nonVisualProperties.NonVisualDrawingProperties = new NonVisualDrawingProperties() { Id = 1, Name = "" };
nonVisualProperties.NonVisualGroupShapeDrawingProperties = new NonVisualGroupShapeDrawingProperties();
nonVisualProperties.ApplicationNonVisualDrawingProperties = new ApplicationNonVisualDrawingProperties();
// Specify the group shape properties of the new slide.
shapeTree.AppendChild(new GroupShapeProperties());
Der nächste Abschnitt der zweiten überladenen InsertNewSlide
Methode fügt der Folie eine Titelform hinzu und legt deren Eigenschaften einschließlich text fest.
// Declare and instantiate the title shape of the new slide.
Shape titleShape = shapeTree.AppendChild(new Shape());
drawingObjectId++;
// Specify the required shape properties for the title shape.
titleShape.NonVisualShapeProperties = new NonVisualShapeProperties
(new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Title" },
new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Type = PlaceholderValues.Title }));
titleShape.ShapeProperties = new ShapeProperties();
// Specify the text of the title shape.
titleShape.TextBody = new TextBody(new Drawing.BodyProperties(),
new Drawing.ListStyle(),
new Drawing.Paragraph(new Drawing.Run(new Drawing.Text() { Text = slideTitle })));
Der nächste Abschnitt der zweiten überladenen InsertNewSlide
Methode fügt der Folie eine Textform hinzu und legt deren Eigenschaften einschließlich text fest.
// Declare and instantiate the body shape of the new slide.
Shape bodyShape = shapeTree.AppendChild(new Shape());
drawingObjectId++;
// Specify the required shape properties for the body shape.
bodyShape.NonVisualShapeProperties = new NonVisualShapeProperties(new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Content Placeholder" },
new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Index = 1 }));
bodyShape.ShapeProperties = new ShapeProperties();
// Specify the text of the body shape.
bodyShape.TextBody = new TextBody(new Drawing.BodyProperties(),
new Drawing.ListStyle(),
new Drawing.Paragraph());
Der letzte Abschnitt der zweiten überladenen InsertNewSlide
Methode erstellt einen neuen Folienteil, sucht die angegebene Indexposition, an der die Folie eingefügt werden soll, und fügt sie dann ein und weist die neue Folie dem neuen Folienteil zu.
// Create the slide part for the new slide.
SlidePart slidePart = presentationPart.AddNewPart<SlidePart>();
// Assign the new slide to the new slide part
slidePart.Slide = slide;
// Modify the slide ID list in the presentation part.
// The slide ID list should not be null.
SlideIdList? slideIdList = presentationPart.Presentation.SlideIdList;
// Find the highest slide ID in the current list.
uint maxSlideId = 1;
SlideId? prevSlideId = null;
OpenXmlElementList slideIds = slideIdList?.ChildElements ?? default;
foreach (SlideId slideId in slideIds)
{
if (slideId.Id is not null && slideId.Id > maxSlideId)
{
maxSlideId = slideId.Id;
}
position--;
if (position == 0)
{
prevSlideId = slideId;
}
}
maxSlideId++;
// Get the ID of the previous slide.
SlidePart lastSlidePart;
if (prevSlideId is not null && prevSlideId.RelationshipId is not null)
{
lastSlidePart = (SlidePart)presentationPart.GetPartById(prevSlideId.RelationshipId!);
}
else
{
string? firstRelId = ((SlideId)slideIds[0]).RelationshipId;
// If the first slide does not contain a relationship ID, throw an exception.
if (firstRelId is null)
{
throw new ArgumentNullException(nameof(firstRelId));
}
lastSlidePart = (SlidePart)presentationPart.GetPartById(firstRelId);
}
// Use the same slide layout as that of the previous slide.
if (lastSlidePart.SlideLayoutPart is not null)
{
slidePart.AddPart(lastSlidePart.SlideLayoutPart);
}
// Insert the new slide into the slide list after the previous slide.
SlideId newSlideId = slideIdList!.InsertAfter(new SlideId(), prevSlideId);
newSlideId.Id = maxSlideId;
newSlideId.RelationshipId = presentationPart.GetIdOfPart(slidePart);
Beispielcode
Es folgt der vollständige Beispielcode in C# und Visual Basic.
// Insert a slide into the specified presentation.
public static void InsertNewSlide(string presentationFile, int position, string slideTitle)
{
// Open the source document as read/write.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
// Pass the source document and the position and title of the slide to be inserted to the next method.
InsertNewSlide(presentationDocument, position, slideTitle);
}
}
// Insert the specified slide into the presentation at the specified position.
public static SlidePart InsertNewSlide(PresentationDocument presentationDocument, int position, string slideTitle)
{
PresentationPart? presentationPart = presentationDocument.PresentationPart;
// Verify that the presentation is not empty.
if (presentationPart is null)
{
throw new InvalidOperationException("The presentation document is empty.");
}
// Declare and instantiate a new slide.
Slide slide = new Slide(new CommonSlideData(new ShapeTree()));
uint drawingObjectId = 1;
// Construct the slide content.
// Specify the non-visual properties of the new slide.
CommonSlideData commonSlideData = slide.CommonSlideData ?? slide.AppendChild(new CommonSlideData());
ShapeTree shapeTree = commonSlideData.ShapeTree ?? commonSlideData.AppendChild(new ShapeTree());
NonVisualGroupShapeProperties nonVisualProperties = shapeTree.AppendChild(new NonVisualGroupShapeProperties());
nonVisualProperties.NonVisualDrawingProperties = new NonVisualDrawingProperties() { Id = 1, Name = "" };
nonVisualProperties.NonVisualGroupShapeDrawingProperties = new NonVisualGroupShapeDrawingProperties();
nonVisualProperties.ApplicationNonVisualDrawingProperties = new ApplicationNonVisualDrawingProperties();
// Specify the group shape properties of the new slide.
shapeTree.AppendChild(new GroupShapeProperties());
// Declare and instantiate the title shape of the new slide.
Shape titleShape = shapeTree.AppendChild(new Shape());
drawingObjectId++;
// Specify the required shape properties for the title shape.
titleShape.NonVisualShapeProperties = new NonVisualShapeProperties
(new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Title" },
new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Type = PlaceholderValues.Title }));
titleShape.ShapeProperties = new ShapeProperties();
// Specify the text of the title shape.
titleShape.TextBody = new TextBody(new Drawing.BodyProperties(),
new Drawing.ListStyle(),
new Drawing.Paragraph(new Drawing.Run(new Drawing.Text() { Text = slideTitle })));
// Declare and instantiate the body shape of the new slide.
Shape bodyShape = shapeTree.AppendChild(new Shape());
drawingObjectId++;
// Specify the required shape properties for the body shape.
bodyShape.NonVisualShapeProperties = new NonVisualShapeProperties(new NonVisualDrawingProperties() { Id = drawingObjectId, Name = "Content Placeholder" },
new NonVisualShapeDrawingProperties(new Drawing.ShapeLocks() { NoGrouping = true }),
new ApplicationNonVisualDrawingProperties(new PlaceholderShape() { Index = 1 }));
bodyShape.ShapeProperties = new ShapeProperties();
// Specify the text of the body shape.
bodyShape.TextBody = new TextBody(new Drawing.BodyProperties(),
new Drawing.ListStyle(),
new Drawing.Paragraph());
// Create the slide part for the new slide.
SlidePart slidePart = presentationPart.AddNewPart<SlidePart>();
// Assign the new slide to the new slide part
slidePart.Slide = slide;
// Modify the slide ID list in the presentation part.
// The slide ID list should not be null.
SlideIdList? slideIdList = presentationPart.Presentation.SlideIdList;
// Find the highest slide ID in the current list.
uint maxSlideId = 1;
SlideId? prevSlideId = null;
OpenXmlElementList slideIds = slideIdList?.ChildElements ?? default;
foreach (SlideId slideId in slideIds)
{
if (slideId.Id is not null && slideId.Id > maxSlideId)
{
maxSlideId = slideId.Id;
}
position--;
if (position == 0)
{
prevSlideId = slideId;
}
}
maxSlideId++;
// Get the ID of the previous slide.
SlidePart lastSlidePart;
if (prevSlideId is not null && prevSlideId.RelationshipId is not null)
{
lastSlidePart = (SlidePart)presentationPart.GetPartById(prevSlideId.RelationshipId!);
}
else
{
string? firstRelId = ((SlideId)slideIds[0]).RelationshipId;
// If the first slide does not contain a relationship ID, throw an exception.
if (firstRelId is null)
{
throw new ArgumentNullException(nameof(firstRelId));
}
lastSlidePart = (SlidePart)presentationPart.GetPartById(firstRelId);
}
// Use the same slide layout as that of the previous slide.
if (lastSlidePart.SlideLayoutPart is not null)
{
slidePart.AddPart(lastSlidePart.SlideLayoutPart);
}
// Insert the new slide into the slide list after the previous slide.
SlideId newSlideId = slideIdList!.InsertAfter(new SlideId(), prevSlideId);
newSlideId.Id = maxSlideId;
newSlideId.RelationshipId = presentationPart.GetIdOfPart(slidePart);
return slidePart;
}