Поделиться через


Изменить цвет заливки фигуры в презентации

В этом разделе показано, как программно изменить цвет заливки фигуры на первом слайде презентации с помощью классов в пакете 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 };
                }
            }
        }
    }
}

См. также