[方法] プレゼンテーションの図形の塗りつぶしの色を変更する (Open XML SDK)

このトピックでは、Open XML SDK 2.5 のクラスを使用して、プログラムによってプレゼンテーション内の最初のスライドの図形の塗りつぶしの色を変更する方法について説明します。

このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。

    using DocumentFormat.OpenXml.Presentation;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml;
    using Drawing = DocumentFormat.OpenXml.Drawing;
    Imports DocumentFormat.OpenXml.Presentation
    Imports DocumentFormat.OpenXml.Packaging
    Imports DocumentFormat.OpenXml
    Imports Drawing = DocumentFormat.OpenXml.Drawing

Presentation オブジェクトを取得する

Open XML SDK では、 PresentationDocument クラスがプレゼンテーション ドキュメント パッケージを表します。プレゼンテーション ドキュメントを操作するには、まず PresentationDocument クラスのインスタンスを作成して、そのインスタンスを操作します。 ドキュメントからクラス インスタンスを作成するには、ファイル パス、および 2 つ目のパラメーターとしてドキュメントが編集可能であるかを指定するブール値を使用する Open メソッドを呼び出します。ドキュメントを読み取り/書き込み用に開くには、以下の using ステートメントに示されているようにこのパラメーターに値 true を指定します。このコードでは、ファイル パラメーターは開くドキュメントのファイルのパスを表す文字列です。

    using (PresentationDocument ppt = PresentationDocument.Open(docName, true))
    {
        // Insert other code here.
    }
    Using ppt As PresentationDocument = PresentationDocument.Open(docName, True)
        ' Insert other code here.
    End Using

using ステートメントは、一般的な .Open、.Save、.Close シーケンスに代わる手段として推奨されます。これを使用すると、閉じかっこに達したときに、Dispose メソッド (Open XML SDK がリソースをクリーンアップするために使用する内部メソッド) が自動的に呼び出されます。using ステートメントに続くブロックは、using ステートメントで作成または指定されたオブジェクト (この場合は ** ppt) のスコープを設定します。

図形ツリーの構造

PresentationML ドキュメントの基本構造は、いくつかのパーツで構成されます。そのうちの 1 つが図形ツリー (sp Tree) 要素です。

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/IEC29500: 2008.

次の表に、図形ツリーの子要素とそれぞれの説明を示します。

要素 説明
cxnSp 接続図形
extLst 拡張リストと変更フラグ
graphicFrame グラフィック フレーム
grpSp グループ図形
grpSpPr グループ図形プロパティ
nvGrpSpPr グループ図形の非表示プロパティ
pic 画像
sp

次の 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 ステートメントで読み取り/書き込みアクセスを指定してプレゼンテーション ファイルを開くと、プレゼンテーション ドキュメントからプレゼンテーション パーツが取得されます。最初のスライドのリレーションシップ ID を取得し、そのリレーションシップ ID からスライド パーツを取得します。

注意

[!メモ] テスト ファイルは、最初のスライド上の最初の図形として塗りつぶされた図形を持っている必要があります。

    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);
    Using ppt As PresentationDocument = PresentationDocument.Open(docName, True)

        ' Get the relationship ID of the first slide.
        Dim part As PresentationPart = ppt.PresentationPart
        Dim slideIds As OpenXmlElementList = part.Presentation.SlideIdList.ChildElements
        Dim relId As String = CType(slideIds(0), SlideId).RelationshipId

        ' Get the slide part from the relationship ID.
        Dim slide As SlidePart = CType(part.GetPartById(relId), SlidePart)

塗りつぶしの色を変更する図形が含まれる図形ツリーを取得し、図形ツリー内の最初の図形を取得します。その図形のスタイルおよびそのスタイルの塗りつぶしの参照を取得してから、新しい塗りつぶしの色を図形に割り当てます。最後に、変更されたプレゼンテーションを保存します。

    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();
        }
    }
    If (Not (slide) Is Nothing) Then

        ' Get the shape tree that contains the shape to change.
        Dim tree As ShapeTree = slide.Slide.CommonSlideData.ShapeTree

        ' Get the first shape in the shape tree.
        Dim shape As Shape = tree.GetFirstChild(Of Shape)()

        If (Not (shape) Is Nothing) Then

            ' Get the style of the shape.
            Dim style As ShapeStyle = shape.ShapeStyle

            ' Get the fill reference.
            Dim fillRef As Drawing.FillReference = 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()
        End If
    End If

サンプル コード

以下は、プレゼンテーション内の図形の塗りつぶしの色を変更できる完全なサンプル コードです。プログラムでは、次の呼び出しを使用してメソッド SetPPTShapeColor を呼び出して、ファイル "Myppt3.pptx" の塗りつぶしの色を変更します。

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

プログラムの実行後、ファイル "Myppt3.pptx" を表示して塗りつぶしの色が変更されたことを確認します。

    // Change the fill color of a shape.
    // The test file must have a filled shape as the first shape on the first slide.
    public static void SetPPTShapeColor(string docName)
    {
        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);

            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();
                }
            }
        }
    }
    ' Change the fill color of a shape.
    ' The test file must have a filled shape as the first shape on the first slide.
    Public Sub SetPPTShapeColor(ByVal docName As String)
        Using ppt As PresentationDocument = PresentationDocument.Open(docName, True)
            ' Get the relationship ID of the first slide.
            Dim part As PresentationPart = ppt.PresentationPart
            Dim slideIds As OpenXmlElementList = part.Presentation.SlideIdList.ChildElements
            Dim relId As String = TryCast(slideIds(0), SlideId).RelationshipId

            ' Get the slide part from the relationship ID.
            Dim slide As SlidePart = DirectCast(part.GetPartById(relId), SlidePart)

            If slide IsNot Nothing Then
                ' Get the shape tree that contains the shape to change.
                Dim tree As ShapeTree = slide.Slide.CommonSlideData.ShapeTree

                ' Get the first shape in the shape tree.
                Dim shape As Shape = tree.GetFirstChild(Of Shape)()

                If shape IsNot Nothing Then
                    ' Get the style of the shape.
                    Dim style As ShapeStyle = shape.ShapeStyle

                    ' Get the fill reference.
                    Dim fillRef As Drawing.FillReference = 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()
                End If
            End If
        End Using
    End Sub

関連項目

その他のリソース

Open XML SDK 2.5 クラス ライブラリ リファレンス