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