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