Compartilhar via


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

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

Obtendo um objeto de apresentação

No SDK do Open XML, a classe PresentationDocument representa um pacote de documento de apresentação. Para trabalhar com um documento de apresentação, primeiro crie uma instância da classe PresentationDocument e trabalhe com essa instância. Para criar a instância de classe a partir do documento, chame o método Open 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 verdadeiro para esse parâmetro, conforme mostrado na instrução de uso a seguir. Neste código, o parâmetro de arquivo é 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))
    {
        // Insert other code here.
    }

A instrução using fornece uma alternativa recomendada para a sequência típica de .Open, .Save e .Close. Ela garante que o método Dispose (método interno usado pelo SDK do Open XML para limpar recursos) seja chamado automaticamente quando a chave de fechamento for atingida. O bloco que segue a instrução de uso estabelece um escopo para o objeto que é criado ou nomeado na instrução de uso , nesse caso ppt.

A estrutura da árvore de forma

A estrutura de documento básica de um documento PresentationML consiste em várias partes, entre elas o elemento Árvore de Forma (árvore de sp).

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

Esse elemento especifica todas as formas dentro de 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 maioria do conteúdo em um slide. O texto e os efeitos são anexados a formas contidas no elemento spTree**.

[Exemplo: considere o seguinte Slide 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 forma especifica todas as propriedades de forma para este slide. exemplo final]

© ISO/IEC29500: 2008.

A tabela a seguir lista os elementos filho da Árvore de Forma junto com a descrição de cada um.

Elemento Descrição
cxnSp Forma de conexão
extLst Lista de extensão com sinalizador de modificação
graphicFrame Quadro Gráfico
grpSp Forma de Grupo
grpSpPr Propriedades de forma de grupo
nvGrpSpPr Propriedades não visuais para uma forma de grupo
Pic Imagem
Sp Shape

O fragmento de 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 instrução usando , 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 de relação.

Observação

O arquivo de teste deve ter uma forma preenchida como a primeira forma no primeiro slide.

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

O código então obtém a árvore de forma que contém a forma cuja cor de preenchimento deve ser alterada e obtém a primeira forma na árvore de forma. Em seguida, ele obtém o estilo da forma e a referência de preenchimento do estilo e atribui uma nova cor de preenchimento à forma. Por fim, ele salva a apresentação 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 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. Em seu programa, você pode invocar o método SetPPTShapeColor para alterar a cor de preenchimento no arquivo "Myppt3.pptx" usando a chamada a seguir.

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

Depois de executar o programa, examine o arquivo "Myppt3.pptx" para ver a alteração na cor de preenchimento.

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