Share via


Cambiar el color de relleno de una forma de una presentación

En este tema se muestra cómo usar las clases del SDK de Open XML para cambiar el color de relleno de una forma en la primera diapositiva de una presentación mediante programación.

Obtención de un objeto Presentation

En Open XML SDK, la clase PresentationDocument representa un paquete de documentos de presentación. Para trabajar con un documento de presentación, primero cree una instancia de la clase PresentationDocument y, a continuación, trabaje con esa instancia. Para crear la instancia de clase a partir del documento, llame al método Open que usa una ruta de acceso del archivo y, como segundo parámetro, un valor booleano para especificar si un documento puede modificarse. Para abrir un documento en modo de lectura y escritura, especifique el valor true para este parámetro, tal como se muestra en la siguiente instrucción using. En este código, el parámetro file es una cadena que representa la ruta de acceso del archivo a partir del cual se va a abrir el documento.

    using (PresentationDocument ppt = PresentationDocument.Open(docName, true))
    {
        // Insert other code here.
    }

La instrucción using proporciona una alternativa recomendada a la típica secuencia .Open, .Save, .Close. Garantiza que se llamará automáticamente al método Dispose (un método interno que Open XML SDK usa para limpiar recursos) cuando se llegue a la llave de cierre. El bloque que sigue a la instrucción using establece un ámbito para el objeto que se crea o se nombra en la instrucción using, en este caso ppt.

Estructura del árbol de formas

La estructura de documento básica de un documento PresentationML consta de varias partes, entre las cuales se encuentra el elemento de árbol de formas (sp Tree).

El siguiente texto de la especificación ISO/IEC 29500 presenta la forma general de un paquete de PresentationML.

Este elemento especifica todas las formas dentro de una diapositiva. Incluye todas las formas, agrupadas o no, a las que se puede hacer referencia en una diapositiva dada. Dado que la mayoría de los objetos dentro de una diapositiva son formas, esto representa la mayor parte del contenido dentro de una diapositiva. El texto y los efectos se adjuntan a formas contenidas en el elemento spTree**.

[Ejemplo: tenga en cuenta lo siguiente Diapositiva 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>

En el ejemplo anterior, el árbol de formas especifica todas las propiedades de la forma para esta diapositiva. Fin del ejemplo]

© ISO/IEC29500: 2008.

En la siguiente tabla se enumeran los elementos secundarios del árbol de formas junto con la descripción de cada uno.

Elemento Descripción
cxnSp Forma de conexión
extLst Lista de extensiones con marca de modificación
graphicFrame Marco gráfico
grpSp Forma de grupo
grpSpPr Propiedades de forma de grupo
nvGrpSpPr Propiedades no visuales de una forma de grupo
Pic Imagen
Sp Forma

El siguiente fragmento de esquema XML define el contenido de este elemento.

    <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>

Funcionamiento del código de ejemplo

Tras abrir el archivo de presentación para acceso de lectura o escritura en la instrucción using, el código obtiene la parte de presentación del documento de presentación. A continuación, obtiene el identificador de relación de la primera diapositiva y obtiene la parte de diapositiva del identificador de relación.

Nota:

[!NOTA] El archivo de prueba debe tener una forma rellena como primera forma en la primera diapositiva.

    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);

A continuación, el código obtiene el árbol de formas que contiene la forma cuyo color de relleno se va a modificar y obtiene la primera forma del árbol de formas. Después obtiene el estilo de la forma y la referencia de relleno del estilo, y asigna un nuevo color de relleno a la forma. Por último, guarda la presentación modificada.

    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();
        }
    }

Código de ejemplo

A continuación, se presenta el código de ejemplo completo que se puede usar para cambiar el color de relleno de una forma en una presentación. En el programa, se puede invocar el método SetPPTShapeColor para cambiar el color de relleno en el archivo "Myppt3.pptx" mediante la siguiente llamada.

    string docName = @"C:\Users\Public\Documents\Myppt3.pptx";
    SetPPTShapeColor(docName);

Tras ejecutar el programa, examine el archivo "Myppt3.pptx" para ver el cambio en el color de relleno.

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();
                    }
                }
            }
        }
    }
}