Ändern der Füllfarbe einer Form in einer Präsentation
In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK verwenden, um die Füllfarbe einer Form auf der ersten Folie in einer Präsentation programmgesteuert zu ändern.
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. Rufen Sie zum Erstellen der Klasseninstanz anhand des Dokuments die Open-Methode auf, die einen Dateipfad und als zweiten Parameter einen booleschen Wert verwendet, um anzugeben, ob ein Dokument bearbeitet werden kann. Zum Öffnen eines Dokuments mit Lese-/Schreibzugriff geben Sie den Wert true für diesen Parameter an (siehe die folgende using-Anweisung). In diesem Code ist der Dateiparameter eine Zeichenfolge, die den Pfad der Datei darstellt, aus der Sie das Dokument öffnen möchten.
using (PresentationDocument ppt = PresentationDocument.Open(docName, 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 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 ppt.
Die Struktur der Formstruktur
Die Grunddokumentstruktur eines PresentationML-Dokuments besteht aus zahlreichen Teilen, darunter das Formstrukturelement (sp Tree).
Der folgende Text aus der SPEZIFIKATION ISO/IEC 29500 stellt die Gesamtform eines PresentationML-Pakets vor.
Mit diesem Element werden alle Formen innerhalb einer Folie angegeben. Dies schließt alle Formen ein, ob gruppiert oder nicht, auf die in einer bestimmten Folie verwiesen werden kann. Da die meisten Objekte innerhalb einer Folie Formen sind, wird hiermit ein Großteil des Inhalts einer Folie dargestellt. Text und Effekte werden an Formen angefügt, die im spTree**-Element enthalten sind.
[Beispiel: Betrachten Sie Folgendes :PresentationML**-Folie
<p:sld>
<p:cSld>
<p:spTree>
<p:nvGrpSpPr>
..
</p:nvGrpSpPr>
<p:grpSpPr>
..
</p:grpSpPr>
<p:sp>
..
</p:sp>
</p:spTree>
</p:cSld>
..
</p:sld>
Im Beispiel oben werden alle Formeigenschaften für diese Folie von der Formstruktur angegeben. Ende des Beispiels]
© ISO/IEC29500: 2008.
In der folgenden Tabelle sind die untergeordneten Elemente der Formstruktur jeweils mit einer Beschreibung aufgeführt.
Element | Beschreibung |
---|---|
cxnSp | Verbindungsform |
extLst | Erweiterungsliste mit Änderungskennzeichen |
graphicFrame | Grafikrahmen |
grpSp | Gruppenform |
grpSpPr | Gruppenformeigenschaften |
nvGrpSpPr | Nicht sichtbare Eigenschaften für eine Gruppenform |
Pic | Bild |
Sp | Shape |
Das folgende XML-Schemafragment definiert den Inhalt dieses Elements.
<complexType name="CT_GroupShape">
<sequence>
<element name="nvGrpSpPr" type="CT_GroupShapeNonVisual" minOccurs="1" maxOccurs="1"/>
<element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/>
<choice minOccurs="0" maxOccurs="unbounded">
<element name="sp" type="CT_Shape"/>
<element name="grpSp" type="CT_GroupShape"/>
<element name="graphicFrame" type="CT_GraphicalObjectFrame"/>
<element name="cxnSp" type="CT_Connector"/>
<element name="pic" type="CT_Picture"/>
</choice>
<element name="extLst" type="CT_ExtensionListModify" minOccurs="0" maxOccurs="1"/>
</sequence>
</complexType>
Funktionsweise des Beispielcodes
Nach dem Öffnen der Präsentationsdatei für den Lese-/Schreibzugriff in der using-Anweisung ruft der Code den Präsentationsteil aus dem Präsentationsdokument ab. Dann werden die Beziehungs-ID der ersten Folie und der Folienteil aus der Beziehungs-ID abgerufen.
Hinweis
Die Testdatei muss eine gefüllte Form als erste Form auf der ersten Folie besitzen.
using (PresentationDocument ppt = PresentationDocument.Open(docName, true))
{
// Get the relationship ID of the first slide.
PresentationPart part = ppt.PresentationPart;
OpenXmlElementList slideIds = part.Presentation.SlideIdList.ChildElements;
string relId = (slideIds[0] as SlideId).RelationshipId;
// Get the slide part from the relationship ID.
SlidePart slide = (SlidePart)part.GetPartById(relId);
Der Code ruft dann die Shape-Struktur ab, die die Form enthält, deren Füllfarbe geändert werden soll, und ruft die erste Form in der Formstruktur ab. Anschließend ruft sie den Stil der Form und den Füllbezug der Formatvorlage ab und weist der Form eine neue Füllfarbe zu. Schließlich wird die geänderte Präsentation gespeichert.
if (slide != null)
{
// Get the shape tree that contains the shape to change.
ShapeTree tree = slide.Slide.CommonSlideData.ShapeTree;
// Get the first shape in the shape tree.
Shape shape = tree.GetFirstChild<Shape>();
if (shape != null)
{
// Get the style of the shape.
ShapeStyle style = shape.ShapeStyle;
// Get the fill reference.
Drawing.FillReference fillRef = style.FillReference;
// Set the fill color to SchemeColor Accent 6;
fillRef.SchemeColor = new Drawing.SchemeColor();
fillRef.SchemeColor.Val = Drawing.SchemeColorValues.Accent6;
// Save the modified slide.
slide.Slide.Save();
}
}
Beispielcode
Im Folgenden finden Sie den vollständigen Beispielcode, mit dem Sie die Füllfarbe einer Form in einer Präsentation ändern können. In Ihrem Programm können Sie die SetPPTShapeColor-Methode aufrufen, um die Füllfarbe in der Datei "Myppt3.pptx" mithilfe des folgenden Aufrufs zu ändern.
string docName = @"C:\Users\Public\Documents\Myppt3.pptx";
SetPPTShapeColor(docName);
Untersuchen Sie nach dem Ausführen des Programms die Datei "Myppt3.pptx", um die Änderung der Füllfarbe zu sehen.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using Drawing = DocumentFormat.OpenXml.Drawing;
SetPPTShapeColor(args[0]);
// Change the fill color of a shape.
// The test file must have a filled shape as the first shape on the first slide.
static void SetPPTShapeColor(string docName)
{
using (PresentationDocument ppt = PresentationDocument.Open(docName, true))
{
// Get the relationship ID of the first slide.
PresentationPart presentationPart = ppt.PresentationPart ?? ppt.AddPresentationPart();
SlideIdList slideIdList = presentationPart.Presentation.SlideIdList ?? presentationPart.Presentation.AppendChild(new SlideIdList());
SlideId? slideId = slideIdList.GetFirstChild<SlideId>();
if (slideId is not null)
{
string? relId = slideId.RelationshipId;
if (relId is not null)
{
// Get the slide part from the relationship ID.
SlidePart slidePart = (SlidePart)presentationPart.GetPartById(relId);
if (slidePart is not null && slidePart.Slide is not null && slidePart.Slide.CommonSlideData is not null && slidePart.Slide.CommonSlideData.ShapeTree is not null)
{
// Get the shape tree that contains the shape to change.
ShapeTree tree = slidePart.Slide.CommonSlideData.ShapeTree;
// Get the first shape in the shape tree.
Shape? shape = tree.GetFirstChild<Shape>();
if (shape is not null && shape.ShapeStyle is not null && shape.ShapeStyle.FillReference is not null)
{
// Get the style of the shape.
ShapeStyle style = shape.ShapeStyle;
// Get the fill reference.
Drawing.FillReference fillRef = style.FillReference;
// Set the fill color to SchemeColor Accent 6;
fillRef.SchemeColor = new Drawing.SchemeColor();
fillRef.SchemeColor.Val = Drawing.SchemeColorValues.Accent6;
// Save the modified slide.
slidePart.Slide.Save();
}
}
}
}
}
}