更改演示文稿中的形状的填充颜色

本主题演示如何使用 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 };
                }
            }
        }
    }
}

另请参阅