Compartilhar via


Alterar a cor de preenchimento de uma forma em uma apresentação

Este tópico mostra como utilizar as classes no SDK Open XML para alterar a cor de preenchimento de uma forma no primeiro diapositivo de uma apresentação através de programação.

Obter um Objeto de Apresentação

No SDK Open XML, a PresentationDocument classe representa um pacote de documento de apresentação. Para trabalhar com um documento de apresentação, crie primeiro uma instância da PresentationDocument classe e, em seguida, trabalhe com essa instância. Para criar a instância de classe a partir do documento, chame o Open método que utiliza um caminho de ficheiro e um valor Booleano como segundo parâmetro para especificar se um documento é editável. Para abrir um documento para leitura/escrita, especifique o valor true para este parâmetro, conforme mostrado na instrução seguinte using . Neste código, o parâmetro de ficheiro é uma cadeia que representa o caminho para o ficheiro a partir do qual pretende abrir o documento.

using (PresentationDocument ppt = PresentationDocument.Open(docName, true))

Com a v3.0.0+ o Close() método foi removido a favor de depender da instrução using. Isto garante que o Dispose() método é chamado automaticamente quando a chaveta de fecho é atingida. O bloco que segue a using instrução estabelece um âmbito para o objeto que é criado ou nomeado na using instrução , neste caso ppt.

A Estrutura da Árvore da Forma

A estrutura de documento básica de um documento PresentationML consiste em várias partes, entre as quais o elemento Árvore da Forma (<spTree/>).

O texto seguinte da especificação ISO/IEC 29500 apresenta a forma geral de um PresentationML pacote.

Este elemento especifica todas as formas num diapositivo. Aqui estão todas as formas, agrupadas ou não, que podem ser referenciadas num determinado diapositivo. Como a maioria dos objetos num diapositivo são formas, representa a maioria dos conteúdos num diapositivo. O texto e os efeitos estão ligados a formas contidas no spTree elemento .

[Exemplo: considere o diapositivo seguinte 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>

No exemplo acima, a árvore de formas especifica todas as propriedades da forma para este diapositivo. exemplo final]

© ISO/IEC 29500: 2016

A tabela seguinte lista os elementos subordinados da Árvore da Forma juntamente com a descrição de cada um.

Elemento Descrição
cxnSp Forma de Ligação
extLst Lista de Extensões com Sinalizador de Modificação
graphicFrame Moldura Gráfica
grpSp Forma de Grupo
grpSpPr Agrupar Propriedades da Forma
nvGrpSpPr Propriedades Não Visuais para uma Forma de Grupo
imagem Imagem
sp Forma

O fragmento de Esquema XML seguinte define o conteúdo deste 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>

Como funciona o código de exemplo

Depois de abrir o ficheiro de apresentação para acesso de leitura/escrita na using instrução, o código obtém a parte da apresentação a partir do documento de apresentação. Em seguida, obtém o ID de relação do primeiro diapositivo e obtém a parte do diapositivo a partir do ID da relação.

Observação

O ficheiro de teste tem de ter uma forma no primeiro diapositivo.

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

Em seguida, o código obtém a árvore de formas que contém a forma cuja cor de preenchimento deve ser alterada e obtém a primeira forma na árvore da forma. Em seguida, obtém as propriedades da forma e a referência de preenchimento sólido das propriedades da forma e atribui uma nova cor de preenchimento à forma. Não é necessário guardar explicitamente o ficheiro quando estiver dentro de uma utilização.

// 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 };
}

Código de exemplo

Segue-se o código de exemplo completo que pode utilizar para alterar a cor de preenchimento de uma forma numa apresentação.

// 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 };
                }
            }
        }
    }
}

Confira também