[方法] プレゼンテーションの図形の塗りつぶしの色を変更する (Open XML SDK)How to: Change the fill color of a shape in a presentation (Open XML SDK)

このトピックでは、Open XML SDK 2.5 のクラスを使用して、プログラムによってプレゼンテーション内の最初のスライドの図形の塗りつぶしの色を変更する方法について説明します。This topic shows how to use the classes in the Open XML SDK 2.5 to change the fill color of a shape on the first slide in a presentation programmatically.

このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。The following assembly directives are required to compile the code in this topic.

    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 オブジェクトを取得するGetting a Presentation Object

Open XML SDK では、 PresentationDocument クラスがプレゼンテーション ドキュメント パッケージを表します。プレゼンテーション ドキュメントを操作するには、まず PresentationDocument クラスのインスタンスを作成して、そのインスタンスを操作します。 ドキュメントからクラス インスタンスを作成するには、ファイル パス、および 2 つ目のパラメーターとしてドキュメントが編集可能であるかを指定するブール値を使用する Open メソッドを呼び出します。ドキュメントを読み取り/書き込み用に開くには、以下の using ステートメントに示されているようにこのパラメーターに値 true を指定します。このコードでは、ファイル パラメーターは開くドキュメントのファイルのパスを表す文字列です。In the Open XML SDK, the PresentationDocument class represents a presentation document package. To work with a presentation document, first create an instance of the PresentationDocument class, and then work with that instance. To create the class instance from the document call the Open method that uses a file path, and a Boolean value as the second parameter to specify whether a document is editable. To open a document for read/write, specify the value true for this parameter as shown in the following using statement. In this code, the file parameter is a string that represents the path for the file from which you want to open the document.

    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) のスコープを設定します。The using statement provides a recommended alternative to the typical .Open, .Save, .Close sequence. It ensures that the Dispose method (internal method used by the Open XML SDK to clean up resources) is automatically called when the closing brace is reached. The block that follows the using statement establishes a scope for the object that is created or named in the using statement, in this case ppt.

図形ツリーの構造The Structure of the Shape Tree

PresentationML ドキュメントの基本構造は、いくつかのパーツで構成されます。そのうちの 1 つが図形ツリー (sp Tree) 要素です。The basic document structure of a PresentationML document consists of a number of parts, among which is the Shape Tree (sp Tree) element.

ISO/IEC 29500 仕様書では、PresentationML パッケージの全体的なフォームについて次のように説明しています。The following text from the ISO/IEC 29500 specification introduces the overall form of a PresentationML package.

この要素は、スライド内のすべての図形を指定します。This element specifies all shapes within a slide. ここに含まれているものが、グループ化されているかどうかに関係なく、特定のスライドで参照できるすべての図形です。Contained within here are all the shapes, either grouped or not, that can be referenced on a given slide. スライド内のほとんどのオブジェクトは図形なので、これはスライドに含まれるコンテンツの大部分を表します。As most objects within a slide are shapes, this represents the majority of content within a slide. spTree** に含まれる図形には、テキストと効果が添えられています。Text and effects are attached to shapes that are contained within the spTree** element.

(: 次のような PresentationML** スライドがあるものとします。[Example: Consider the following PresentationML** slide

    <p:sld>
      <p:cSld>
        <p:spTree>
          <p:nvGrpSpPr>
          ..
          </p:nvGrpSpPr>
          <p:grpSpPr>
          ..
          </p:grpSpPr>
          <p:sp>
          ..
          </p:sp>
        </p:spTree>
      </p:cSld>
      ..
    </p:sld>

上の例では、図形ツリーがこのスライドのすべての図形プロパティを指定しています。例終わり]In the above example the shape tree specifies all the shape properties for this slide. end example]

© ISO/IEC29500: 2008.© ISO/IEC29500: 2008.

次の表に、図形ツリーの子要素とそれぞれの説明を示します。The following table lists the child elements of the Shape Tree along with the description of each.

要素Element 説明Description
cxnSpcxnSp 接続図形Connection Shape
extLstextLst 拡張リストと変更フラグExtension List with Modification Flag
graphicFramegraphicFrame グラフィック フレームGraphic Frame
grpSpgrpSp グループ図形Group Shape
grpSpPrgrpSpPr グループ図形プロパティGroup Shape Properties
nvGrpSpPrnvGrpSpPr グループ図形の非表示プロパティNon-Visual Properties for a Group Shape
picpic 画像Picture
spsp Shape

次の XML スキーマ フラグメントは、この要素のコンテンツを定義しています。The following XML Schema fragment defines the contents of this element.

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

サンプル コードの動作のしくみHow the Sample Code Works

using ステートメントで読み取り/書き込みアクセスを指定してプレゼンテーション ファイルを開くと、プレゼンテーション ドキュメントからプレゼンテーション パーツが取得されます。最初のスライドのリレーションシップ ID を取得し、そのリレーションシップ ID からスライド パーツを取得します。After opening the presentation file for read/write access in the using statement, the code gets the presentation part from the presentation document. Then it gets the relationship ID of the first slide, and gets the slide part from the relationship ID.

注意

[!メモ] テスト ファイルは、最初のスライド上の最初の図形として塗りつぶされた図形を持っている必要があります。The test file must have a filled shape as the first shape on the first 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);
    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)

塗りつぶしの色を変更する図形が含まれる図形ツリーを取得し、図形ツリー内の最初の図形を取得します。その図形のスタイルおよびそのスタイルの塗りつぶしの参照を取得してから、新しい塗りつぶしの色を図形に割り当てます。最後に、変更されたプレゼンテーションを保存します。The code then gets the shape tree that contains the shape whose fill color is to be changed, and gets the first shape in the shape tree. It then gets the style of the shape and the fill reference of the style, and assigns a new fill color to the shape. Finally it saves the modified presentation.

    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

サンプル コードSample Code

以下は、プレゼンテーション内の図形の塗りつぶしの色を変更できる完全なサンプル コードです。プログラムでは、次の呼び出しを使用してメソッド SetPPTShapeColor を呼び出して、ファイル "Myppt3.pptx" の塗りつぶしの色を変更します。Following is the complete sample code that you can use to change the fill color of a shape in a presentation. In your program, you can invoke the method SetPPTShapeColor to change the fill color in the file "Myppt3.pptx" by using the following call.

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

プログラムの実行後、ファイル "Myppt3.pptx" を表示して塗りつぶしの色が変更されたことを確認します。After running the program, examine the file "Myppt3.pptx" to see the change in the fill color.

    // 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

関連項目See also

その他のリソースOther resources

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