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

Este tópico mostra como usar as classes no Open XML SDK para alterar a cor de preenchimento de uma forma no primeiro slide de uma apresentação programaticamente.

Obtendo um objeto de apresentação

No SDK do Open XML, a PresentationDocument classe representa um pacote de documentos de apresentação. Para trabalhar com um documento de apresentação, primeiro crie 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 usa um caminho de arquivo e um valor booliano como o segundo parâmetro para especificar se um documento é editável. Para abrir um documento para leitura/gravação, especifique o valor true desse parâmetro, conforme mostrado na instrução a seguir using . Nesse código, o parâmetro file é uma cadeia de caracteres que representa o caminho para o arquivo do qual você deseja abrir o documento.

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

Com v3.0.0+, o Close() método foi removido em favor de confiar na instrução using. Isso garante que o Dispose() método seja chamado automaticamente quando a chave de fechamento for atingida. O bloco que segue a using instrução estabelece um escopo para o objeto criado ou nomeado na using instrução, neste caso ppt.

A estrutura da árvore de formas

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

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

Esse elemento especifica todas as formas em um slide. Contidas aqui estão todas as formas, agrupadas ou não, que podem ser referenciadas em um determinado slide. Como a maioria dos objetos dentro de um slide são formas, isso representa a maior parte do conteúdo dentro de um slide. Texto e efeitos são anexados a formas contidas no spTree elemento.

[Exemplo: considere o seguinte PresentationML slide

    <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 slide. exemplo de término]

© ISO/IEC 29500: 2016

A tabela a seguir lista os elementos filho da árvore de formas, juntamente com a descrição de cada um.

Elemento Descrição
cxnSp Forma da Conexão
extLst Lista de extensões com sinalizador de modificação
graphicFrame Quadro gráfico
grpSp Forma de Grupo
grpSpPr Propriedades de Forma de Grupo
nvGrpSpPr Propriedades não visuais de uma forma de grupo
foto Imagem
SP Forma

O fragmento do esquema XML a seguir define o conteúdo desse 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 arquivo de apresentação para acesso de leitura/gravação na using instrução, o código obtém a parte de apresentação do documento de apresentação. Em seguida, ele obtém a ID de relação do primeiro slide e obtém a parte do slide da ID da relação.

Observação

O arquivo de teste deve ter uma forma no primeiro slide.

// 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 de formas. Em seguida, ele 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 há necessidade de salvar explicitamente o arquivo quando estiver em uso.

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

A seguir está o código de exemplo completo que você pode usar para alterar a cor de preenchimento de uma forma em uma 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