更改演示文稿中的形状的填充颜色
本主题演示如何使用 Open XML SDK 中的类以编程方式更改演示文稿中第一张幻灯片上形状的填充颜色。
获取 Presentation 对象
在 Open XML SDK 中 PresentationDocument
, 类表示演示文稿文档包。 若要处理演示文稿文档,请先创建 类的 PresentationDocument
实例,然后使用该实例。 若要从文档创建类实例, Open
请调用使用文件路径的方法,并使用布尔值作为第二个参数来指定文档是否可编辑。 若要打开文档进行读/写,请指定此参数的值 true
,如以下 using
语句所示。 在该代码中,file 参数是一个字符串,表示要从中打开该文档的文件的路径。
using (PresentationDocument ppt = PresentationDocument.Open(docName, true))
在 v3.0.0+ 中, Close() 已删除 方法,转而依赖于 using 语句。
这可确保在 Dispose() 到达右大括号时自动调用 方法。 语句后面的 using
块为在 语句中创建 using
或命名的对象建立作用域,在本例 ppt
中为 。
形状树的结构
PresentationML 文档的基本文档结构由多个部分组成,其中形状树 (<spTree/>
) 元素。
ISO/IEC 29500 规范中的以下文本介绍了包的整体PresentationML
形式。
此元素指定幻灯片中的所有形状。 此处包含可在给定幻灯片中引用的所有形状(分组或不分组)。 由于幻灯片中的大多数对象都是形状,因此这代表幻灯片中的大多数内容。 文本和效果附加到元素中包含的
spTree
形状。[示例:请考虑以下
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>
在以上示例中,形状树为此幻灯片指定所有形状属性。 示例结束]
© ISO/IEC 29500:2016
下表列出了形状树的子元素以及每个元素的说明。
元素 | 说明 |
---|---|
cxnSp | 连接形状 |
extLst | 带有修改标记的扩展名列表 |
graphicFrame | 图片框 |
grpSp | 组形状 |
grpSpPr | 组形状属性 |
nvGrpSpPr | 组形状的非可视属性 |
pic | 图片 |
sp | 形状 |
以下 XML 架构片段定义此元素的内容。
<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>
示例代码的工作方式
在 语句中 using
打开演示文稿文件进行读/写访问后,代码将从演示文稿文档中获取演示文稿部件。 然后,它获取第一张幻灯片的关系 ID,然后从该关系 ID 中获取幻灯片部件。
注意
测试文件必须在第一张幻灯片上具有形状。
// 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 };
}
示例代码
下面是可用于更改演示文稿中形状的填充颜色的完整代码示例。
// 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 };
}
}
}
}
}