[方法] ワープロ ドキュメントのテーマ パーツを置換する (Open XML SDK)How to: Replace the theme part in a word processing document (Open XML SDK)

このトピックでは、Open XML SDK 2.5 for Office のクラスを使用して、プログラムによってワープロ ドキュメント内のドキュメント パーツを置換する方法について説明します。This topic shows how to use the classes in the Open XML SDK 2.5 for Office to programmatically replace a document part in a word processing document.

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

    using System.IO;
    using DocumentFormat.OpenXml.Packaging;
    Imports System.IO
    Imports DocumentFormat.OpenXml.Packaging

パッケージとドキュメント パーツPackages and Document Parts

Open XML ドキュメントはパッケージとして保存されます。このパッケージの形式は、ISO/IEC 29500-2 に定義されています。パッケージの内部は、リレーションシップで結ばれた複数のパーツに分けることができます。パーツ間のリレーションシップによって、ドキュメントのカテゴリが決まります。パッケージのリレーションシップ アイテムにメイン ドキュメント パーツへのリレーションシップを含めると、そのドキュメントをワープロ ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにプレゼンテーション パーツへのリレーションシップを含めると、そのドキュメントをプレゼンテーション ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにブック パーツへのリレーションシップを含めると、そのドキュメントをスプレッドシート ドキュメントとして定義できます。このトピックでは、ワープロ ドキュメント パッケージを使用します。An Open XML document is stored as a package, whose format is defined by ISO/IEC 29500-2. The package can have multiple parts with relationships between them. The relationship between parts controls the category of the document. A document can be defined as a word-processing document if its package-relationship item contains a relationship to a main document part. If its package-relationship item contains a relationship to a presentation part it can be defined as a presentation document. If its package-relationship item contains a relationship to a workbook part, it is defined as a spreadsheet document. In this how-to topic, you will use a word-processing document package.

WordprocessingDocument オブジェクトの取得Getting a WordprocessingDocument Object

サンプル コードでは、次の using ステートメントに示すように、まず WordprocessingDocument クラスをインスタンス化してワープロ ファイルを開きます。In the sample code, you start by opening the word processing file by instantiating the WordprocessingDocument class as shown in the following using statement. 同じステートメントで、Open メソッドを使用して、ワープロ ファイル document を開き、ブール値のパラメーターを true に設定して、ドキュメントの編集を有効にします。In the same statement, you open the word processing file document by using the Open method, with the Boolean parameter set to true to enable editing the document.

    using (WordprocessingDocument wordDoc = 
            WordprocessingDocument.Open(document, true))
    {
        // Insert other code here.
    }
    Using wordDoc As WordprocessingDocument = WordprocessingDocument.Open(document, True)
        ' Insert other code here.
    End Using

using ステートメントは、一般的な .Open、.Save、.Close シーケンスに代わる手段として推奨されます。これによって、閉じかっこに達したときに、Dispose メソッド (Open XML SDK がリソースをクリーンアップするために使用する内部メソッド) が自動的に呼び出されます。using ステートメントに続くブロックは、作成された、または using ステートメントで指定されたオブジェクト (この場合は ** wordDoc) のスコープを設定します。Open XML SDK の WordprocessingDocument クラスは、System.IDisposable 実装の一部として自動的にオブジェクトを保存して閉じるため、また、Dispose が、ブロックの終わりで自動的に呼び出されるため、using を使用する場合は、Save および Close を明示的に呼び出す必要はありません。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 wordDoc. Because the WordprocessingDocument class in the Open XML SDK automatically saves and closes the object as part of its System.IDisposable implementation, and because Dispose is automatically called when you exit the block, you do not have to explicitly call Save and Close─as long as you use using.

Word パッケージでのテーマを変更する方法How to Change Theme in a Word Package

Word 文書のテーマを変更するには、リボンの [ ページ レイアウト] をクリックし、[ テーマ] をクリックします。[ テーマ] メニューが開きます。組み込みのテーマの 1 つを選択して Word 文書に適用するには、テーマ アイコンをクリックします。[ テーマの参照] オプションを使用して、コンピューターに保存されているテーマ ファイルを参照し、適用することもできます。If you would like to change the theme in a Word document, click the ribbon Page Layout and then click Themes. The Themes pull-down menu opens. To choose one of the built it themes and apply it to the Word document, click the theme icon. You can also use the option Browse for Themes... to locate and apply a theme file in your computer.

テーマ要素の構造The Structure of the Theme Element

テーマ要素は、配色、フォント パターン、および書式スキームで構成されます。ここでは、プログラムによってテーマを変更する方法について説明します。したがって、テーマ要素に関する理解を深めておくことが役立ちます。ISO/IEC 29500 の仕様に記載されている次の情報は、この要素を操作するときに役立ちます。The theme element constitutes of color, font, and format schemes. In this how-to you learn how to change the theme programmatically. Therefore, it is useful to familiarize yourself with the theme element. The following information from the ISO/IEC 29500 specification can be useful when working with this element.

この要素は、共有スタイル シート (テーマ) に関連付けられたルート レベルの複合型を定義します。この要素は、テーマを通じてドキュメントに適用できるあらゆる種類の書式設定オプションを含んでおり、テーマが適用されたオブジェクトをドキュメント内で使用したときのドキュメントの全体的な外観を定義します。This element defines the root level complex type associated with a shared style sheet (or theme). This element holds all the different formatting options available to a document through a theme, and defines the overall look and feel of the document when themed objects are used within the document.

[例*: 使用中のさまざまなテーマがプレゼンテーションに適用される例として、次のようなイメージを考えてみます。この例では、テーマがプレゼンテーションのさまざまなオブジェクトのフォント、色、背景、塗りつぶし、効果にどのような影響を与えるかについて説明します。例の終了][Example*: Consider the following image as an example of different themes in use applied to a presentation. In this example, you can see how a theme can affect font, colors, backgrounds, fills, and effects for different objects in a presentation. end example]

[テーマ サンプル] この例では、テーマがプレゼンテーションのさまざまなオブジェクトのフォント、色、背景、塗りつぶし、効果にどのような影響を与えるかについて説明します。Theme sample In this example, we see how a theme can affect font, colors, backgrounds, fills, and effects for different objects in a presentation. 例終わり]end example]

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

次の表に、テーマ クラスで使用できる子の型の一覧を示します。The following table lists the possible child types of the Theme class.

PresentationML の要素PresentationML Element Open XML SDK 2.5 のクラスOpen XML SDK 2.5 Class 説明Description
custClrLstcustClrLst CustomColorListCustomColorList ユーザー設定色リストCustom Color List
extLstextLst ExtensionListExtensionList 拡張リストExtension List
extraClrSchemeLstextraClrSchemeLst ExtraColorSchemeListExtraColorSchemeList その他の配色リストExtra Color Scheme List
objectDefaultsobjectDefaults ObjectDefaultsObjectDefaults オブジェクトの既定値Object Defaults
themeElementsthemeElements ThemeElementsThemeElements テーマの要素Theme Elements

次の XML スキーマ フラグメントでは、テーマ要素の 4 つのパーツを定義しています。The following XML Schema fragment defines the four parts of the theme element. themeElements 要素には、テーマ内で定義された主要な書式設定が含まれます。The themeElements element is the piece that holds the main formatting defined within the theme. 他のパーツは、themeElements に含まれる情報に対する上書き、既定、追加を指定します。The other parts provide overrides, defaults, and additions to the information contained in themeElements. テーマを定義する CT_OfficeStyleSheet 複合型は次のように定義されます。The complex type defining a theme, CT_OfficeStyleSheet, is defined in the following manner:

    <complexType name="CT_OfficeStyleSheet">
       <sequence>
           <element name="themeElements" type="CT_BaseStyles" minOccurs="1" maxOccurs="1"/>
           <element name="objectDefaults" type="CT_ObjectStyleDefaults" minOccurs="0" maxOccurs="1"/>
           <element name="extraClrSchemeLst" type="CT_ColorSchemeList" minOccurs="0" maxOccurs="1"/>
           <element name="custClrLst" type="CT_CustomColorList" minOccurs="0" maxOccurs="1"/>
           <element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
       </sequence>
       <attribute name="name" type="xsd:string" use="optional" default=""/>
    </complexType>

この複合型には CT_OfficeArtExtensionList も含まれており、この複合型の将来の拡張のために使用されます。This complex type also holds a CT_OfficeArtExtensionList, which is used for future extensibility of this complex type.

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

ファイルを開いたら、wordDoc オブジェクト内で MainDocumentPart をインスタンス化し、古いテーマのパーツを削除できます。After opening the file, you can instantiate the MainDocumentPart in the wordDoc object, and delete the old theme part.

    public static void ReplaceTheme(string document, string themeFile)
    {
        using (WordprocessingDocument wordDoc =
            WordprocessingDocument.Open(document, true))
        {
            MainDocumentPart mainPart = wordDoc.MainDocumentPart;

            // Delete the old document part.
            mainPart.DeletePart(mainPart.ThemePart);
    Public Shared Sub ReplaceTheme(ByVal document As String, ByVal themeFile As String)
        Using wordDoc As WordprocessingDocument = WordprocessingDocument.Open(document, True)
            Dim mainPart As MainDocumentPart = wordDoc.MainDocumentPart

            ' Delete the old document part.
            mainPart.DeletePart(mainPart.ThemePart)

次に、新しい ThemePart オブジェクトを作成し、それを MainDocumentPart オブジェクトに追加します。You can then create add a new ThemePart object and add it to the MainDocumentPart object. 次に、StreamReader および StreamWriter オブジェクトを使用してコンテンツを追加し、テーマを themeFile から ThemePart オブジェクトにコピーします。Then you add content by using a StreamReader and StreamWriter objects to copy the theme from the themeFile to the ThemePart object.

    // Add a new document part and then add content.
    ThemePart themePart = mainPart.AddNewPart<ThemePart>();

    using (StreamReader streamReader = new StreamReader(themeFile))
    using (StreamWriter streamWriter =
        new StreamWriter(themePart.GetStream(FileMode.Create)))
    {
        streamWriter.Write(streamReader.ReadToEnd());
    }
    ' Add a new document part and then add content.
    Dim themePart As ThemePart = mainPart.AddNewPart(Of ThemePart)()

    Using streamReader As New StreamReader(themeFile)
    Using streamWriter As New StreamWriter(themePart.GetStream(FileMode.Create))
        streamWriter.Write(streamReader.ReadToEnd())
    End Using
    End Using

サンプル コードSample Code

以下のコード例では、ワープロ ドキュメント内のテーマ ドキュメント パーツを別のパッケージのテーマ パーツで置換する方法を示します。2 つ目の引数として渡されるテーマ ファイルは、XML 形式の有効なテーマ パーツである必要があります (たとえば、Theme1.xml)。.Zip ファイルに名前を変更された既存のドキュメントまたはテーマ ファイル (.THMX) からこのパーツを抽出できます。 ReplaceTheme メソッドを呼び出すには、次の例のような呼び出しを使用して、"Theme1.xml" ファイルのテーマを "MyPkg7.docx" ファイルにコピーします。The following code example shows how to replace the theme document part in a word processing document with the theme part from another package. The theme file passed as the second argument must be a valid theme part in XML format (for example, Theme1.xml). You can extract this part from an existing document or theme file (.THMX) that has been renamed to be a .Zip file. To call the method ReplaceTheme you can use the following call example to copy the theme from the file "Theme1.xml" to the file "MyPkg7.docx."

    string document = @"C:\Users\Public\Documents\\MyPkg7.docx";
    string themeFile = @"C:\Users\Public\Documents\Theme1.xml";
    ReplaceTheme(document, themeFile);
    Dim document As String = "C:\Users\Public\Documents\\MyPkg7.docx"
    Dim themeFile As String = "C:\Users\Public\Documents\Theme1.xml"
    ReplaceTheme(document, themeFile)

プログラムを実行した後は、Word ファイルを開き、フォントの変更を確認してください。After you run the program open the Word file and notice the change in font.

以下は、C# および Visual Basic による完全なサンプル コードです。Following is the complete sample code in both C# and Visual Basic.

    // This method can be used to replace the theme part in a package.
    public static void ReplaceTheme(string document, string themeFile)
    {
        using (WordprocessingDocument wordDoc = 
            WordprocessingDocument.Open(document, true))
        {
            MainDocumentPart mainPart = wordDoc.MainDocumentPart;

            // Delete the old document part.
            mainPart.DeletePart(mainPart.ThemePart);

            // Add a new document part and then add content.
            ThemePart themePart = mainPart.AddNewPart<ThemePart>();

            using (StreamReader streamReader = new StreamReader(themeFile))
            using (StreamWriter streamWriter = 
                new StreamWriter(themePart.GetStream(FileMode.Create)))
            {
                streamWriter.Write(streamReader.ReadToEnd());
            }
        }
    }
    ' This method can be used to replace a document part in a package.
    Public Sub ReplaceTheme(ByVal document As String, ByVal themeFile As String)
        Using wordDoc As WordprocessingDocument = _
            WordprocessingDocument.Open(document, True)
            Dim mainPart As MainDocumentPart = wordDoc.MainDocumentPart

            ' Delete the old document part.
            mainPart.DeletePart(mainPart.ThemePart)

            ' Add a new document part and then add content.
            Dim themePart As ThemePart = mainPart.AddNewPart(Of ThemePart)()

            Using streamReader As New StreamReader(themeFile)
                Using streamWriter As _
                    New StreamWriter(themePart.GetStream(FileMode.Create))

                    streamWriter.Write(streamReader.ReadToEnd())
                End Using
            End Using
        End Using
    End Sub

関連項目See also

その他のリソースOther resources

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