Изменить цвет заливки фигуры в презентации
В этом разделе показано, как программно изменить цвет заливки фигуры на первом слайде презентации с помощью классов в пакете SDK для Open XML.
Получение объекта Presentation
В пакете SDK Open PresentationDocument
XML класс представляет пакет документов презентации. Чтобы работать с документом презентации, сначала создайте экземпляр PresentationDocument
класса , а затем работайте с этим экземпляром. Чтобы создать экземпляр класса из документа, вызовите Open
метод, использующий путь к файлу, и логическое значение в качестве второго параметра, чтобы указать, доступен ли документ для редактирования. Чтобы открыть документ для чтения и записи, укажите значение true
для этого параметра, как показано в следующей using
инструкции. В этом коде параметр file является строкой и содержит путь к файлу, из которого необходимо открыть документ.
using (PresentationDocument ppt = PresentationDocument.Open(docName, true))
В версии 3.0.0+ Close() метод был удален в пользу использования инструкции using.
Это гарантирует автоматический Dispose() вызов метода при достижении закрывающей фигурной скобки. Блок, следующий за using
оператором , устанавливает область для объекта, созданного или именованного в инструкцииusing
, в данном случае ppt
.
Структура дерева фигур
Базовая структура документа PresentationML состоит из нескольких частей, среди которых есть элемент "Дерево фигур" (<spTree/>
).
В следующем тексте из спецификации ISO/IEC 29500 представлена общая форма PresentationML
пакета.
Этот элемент определяет все фигуры на слайде. В нем содержатся все фигуры, группированные и негруппированные, на которые можно задать ссылку на данном слайде. Так как большинство объектов на слайде — это фигуры, этот элемент представляет большую часть содержимого слайда. Текст и эффекты присоединяются к фигурам, содержащимся в элементе
spTree
.[Пример. Рассмотрим следующий
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>
В вышеуказанном примере дерево фигур определяет все свойства фигур для этого слайда. конец примера]
© ISO/IEC 29500: 2016
В следующей таблице представлены дочерние элементы дерева фигур и описание каждого из них.
Элемент | Описание |
---|---|
cxnSp | Фигура соединения |
extLst | Список расширений с флагом изменений |
Графический кадр | Графическая рамка |
grpSp | Групповая фигура |
grpSpPr | Свойства групповой фигуры |
nvGrpSpPr | Невизуальные свойства групповой фигуры |
Рис | Изображение |
Sp | Shape |
Следующий фрагмент схемы XML определяет содержимое этого элемента.
<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>
Механизм работы примера кода
После открытия файла презентации для доступа на чтение и запись в инструкции using
код получает часть презентации из документа презентации. Затем извлекается идентификатор связи первого слайда и часть слайда из идентификатора связи.
Примечание.
Файл теста должен иметь фигуру на первом слайде.
// 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 };
}
Пример кода
Далее представлен полный пример кода, который можно использовать для изменения цвета заливки фигуры в презентации.
// 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 };
}
}
}
}
}