Modifier la couleur de remplissage d’une forme dans une présentation
Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour modifier la couleur de remplissage d’une forme sur la première diapositive d’une présentation par programmation.
Obtention d’un objet Presentation
Dans le Kit de développement logiciel (SDK) Open XML, la PresentationDocument
classe représente un package de document de présentation. Pour utiliser un document de présentation, commencez par créer un instance de la PresentationDocument
classe, puis utilisez cette instance. Pour créer la classe instance à partir du document, appelez la Open
méthode qui utilise un chemin d’accès de fichier et une valeur booléenne comme deuxième paramètre pour spécifier si un document est modifiable. Pour ouvrir un document en lecture/écriture, spécifiez la valeur true
de ce paramètre, comme indiqué dans l’instruction suivante using
. Dans ce code, le paramètre file est une chaîne qui représente le chemin d’accès du fichier à partir duquel vous voulez ouvrir le document.
using (PresentationDocument ppt = PresentationDocument.Open(docName, true))
Avec v3.0.0+ la Close() méthode a été supprimée au profit de l’instruction using.
Cela garantit que la Dispose() méthode est appelée automatiquement lorsque l’accolade fermante est atteinte. Le bloc qui suit l’instruction using
établit une étendue pour l’objet créé ou nommé dans l’instruction using
, dans ce cas ppt
.
Structure de l’élément d’arborescence de formes
La structure de base d’un document PresentationML se compose d’un certain nombre de parties, parmi lesquelles l’élément Shape Tree (<spTree/>
).
Le texte suivant de la spécification ISO/IEC 29500 présente la forme globale d’un PresentationML
package.
Cet élément spécifie l’ensemble des formes d’une diapositive. Il contient toutes les formes, groupées ou non, qui peuvent être référencées dans une diapositive donnée. Dans la mesure où la plupart des objets d’une diapositive sont des formes, cela correspond à la majeure partie du contenu d’une diapositive. Le texte et les effets sont attachés aux formes contenues dans l’élément
spTree
.[Exemple : Considérez la diapositive suivante
PresentationML
<p:sld>
<p:cSld>
<p:spTree>
<p:nvGrpSpPr>
..
</p:nvGrpSpPr>
<p:grpSpPr>
..
</p:grpSpPr>
<p:sp>
..
</p:sp>
</p:spTree>
</p:cSld>
..
</p:sld>
Dans l’exemple ci-dessus, l’arborescence de formes spécifie l’ensemble des propriétés de forme de cette diapositive. Fin de l’exemple]
© ISO/IEC 29500 : 2016
Le tableau suivant répertorie les éléments enfants de l’arborescence de formes, ainsi que la description correspondante.
Élément | Description |
---|---|
cxnSp | Forme de connexion |
extLst | Liste des extensions avec indicateur de modification |
graphicFrame | Cadre de graphique |
grpSp | Forme de groupe |
grpSpPr | Propriétés de forme de groupe |
nvGrpSpPr | Propriétés non visuelles d’une forme de groupe |
Pic | Image |
Sp | Shape |
Le fragment de schéma XML suivant définit le contenu de cet élément.
<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>
Fonctionnement de l’exemple de code
Après avoir ouvert le fichier de présentation pour l’accès en lecture/écriture dans l’instruction using
, le code obtient la partie présentation à partir du document de présentation. Il obtient ensuite l’ID de relation de la première diapositive, puis obtient le composant Diapositive à partir de l’ID de relation.
Remarque
Le fichier de test doit avoir une forme sur la première diapositive.
// Get the relationship ID of the first slide.
PresentationPart presentationPart = ppt.PresentationPart ?? ppt.AddPresentationPart();
presentationPart.Presentation.SlideIdList ??= new SlideIdList();
SlideId? slideId = presentationPart.Presentation.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);
Le code obtient ensuite l’arborescence de formes qui contient la forme dont la couleur de remplissage doit être modifiée, puis obtient la première forme de l’arborescence de formes. Il obtient ensuite les propriétés de forme de la forme et la référence de remplissage unie des propriétés de forme, puis affecte une nouvelle couleur de remplissage à la forme. Il n’est pas nécessaire d’enregistrer explicitement le fichier à l’intérieur d’une utilisation.
// Get or add the shape tree
slidePart.Slide.CommonSlideData ??= new CommonSlideData();
// Get the shape tree that contains the shape to change.
slidePart.Slide.CommonSlideData.ShapeTree ??= new ShapeTree();
// Get the first shape in the shape tree.
Shape? shape = slidePart.Slide.CommonSlideData.ShapeTree.GetFirstChild<Shape>();
if (shape is not null)
{
// Get or add the shape properties element of the shape.
shape.ShapeProperties ??= new ShapeProperties();
// Get or add the fill reference.
Drawing.SolidFill? solidFill = shape.ShapeProperties.GetFirstChild<Drawing.SolidFill>();
if (solidFill is null)
{
shape.ShapeProperties.AddChild(new Drawing.SolidFill());
solidFill = shape.ShapeProperties.GetFirstChild<Drawing.SolidFill>();
}
// Set the fill color to SchemeColor
solidFill!.SchemeColor = new Drawing.SchemeColor() { Val = Drawing.SchemeColorValues.Accent2 };
}
Exemple de code
Voici l’exemple de code complet qui vous permet de modifier la couleur de remplissage d’une forme dans une présentation.
// Change the fill color of a shape.
// The test file must have a 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();
presentationPart.Presentation.SlideIdList ??= new SlideIdList();
SlideId? slideId = presentationPart.Presentation.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);
// Get or add the shape tree
slidePart.Slide.CommonSlideData ??= new CommonSlideData();
// Get the shape tree that contains the shape to change.
slidePart.Slide.CommonSlideData.ShapeTree ??= new ShapeTree();
// Get the first shape in the shape tree.
Shape? shape = slidePart.Slide.CommonSlideData.ShapeTree.GetFirstChild<Shape>();
if (shape is not null)
{
// Get or add the shape properties element of the shape.
shape.ShapeProperties ??= new ShapeProperties();
// Get or add the fill reference.
Drawing.SolidFill? solidFill = shape.ShapeProperties.GetFirstChild<Drawing.SolidFill>();
if (solidFill is null)
{
shape.ShapeProperties.AddChild(new Drawing.SolidFill());
solidFill = shape.ShapeProperties.GetFirstChild<Drawing.SolidFill>();
}
// Set the fill color to SchemeColor
solidFill!.SchemeColor = new Drawing.SchemeColor() { Val = Drawing.SchemeColorValues.Accent2 };
}
}
}
}
}