次の方法で共有


ワープロ ドキュメントのテーマ パーツを置換する

このトピックでは、Open XML SDK for Office のクラスを使用して、プログラムによってワープロ ドキュメント内のドキュメント パーツを置き換える方法について説明します。

パッケージとドキュメント パーツ

Open XML ドキュメントはパッケージとして格納され、その形式は ISO/IEC 29500 によって定義されます。 パッケージには、それらの間のリレーションシップを持つ複数のパーツを含めることができます。 パーツ間の関係によって、ドキュメントのカテゴリが制御されます。 ドキュメントは、パッケージリレーションシップアイテムにメインドキュメントパーツとの関係が含まれている場合、ワープロドキュメントとして定義できます。 パッケージリレーションシップ項目にプレゼンテーション パーツとのリレーションシップが含まれている場合は、プレゼンテーション ドキュメントとして定義できます。 パッケージリレーションシップアイテムにブックパーツとのリレーションシップが含まれている場合は、スプレッドシートドキュメントとして定義されます。 このハウツー トピックでは、ワープロ ドキュメント パッケージを使用します。

WordprocessingDocument オブジェクトの取得

サンプル コードでは、次の using ステートメントに示すように、WordprocessingDocument クラスをインスタンス化してワープロ ファイルを開きます。 同じステートメントで、Open メソッドを使用してワープロ ファイル ドキュメントを開き、Boolean パラメーターを true に設定してドキュメントの編集を有効にします。

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))

v3.0.0 以降では、using ステートメントに依存することを優先して、Close() メソッドが削除されました。 これにより、閉じかっこに達したときに、 Dispose() メソッドが自動的に呼び出されます。 using ステートメントに続くブロックは、using ステートメントで作成または名前付けされたオブジェクトのスコープを確立します。 Open XML SDK の WordprocessingDocument クラスは、IDisposable実装の一部としてオブジェクトを自動的に保存および閉じます。また、ブロックを終了するとDispose()が自動的に呼び出されるため、using ステートメントを使用する限り、明示的にSave()またはDispose()を呼び出す必要はありません。

Word パッケージでのテーマを変更する方法

Wordドキュメントのテーマを変更する場合は、リボンの [デザイン] をクリックし、[テーマ] をクリックします。 [ テーマ] メニューが開きます。 組み込みのテーマのいずれかを選択し、Wordドキュメントに適用するには、テーマ アイコンをクリックします。 [テーマの参照] オプションを使用して、コンピューターに保存されているテーマ ファイルを参照し、適用することもできます。

テーマ要素の構造

テーマ要素は、色、フォント、書式スキームで構成されます。 ここでは、プログラムによってテーマを変更する方法について説明します。 したがって、テーマ要素に関する理解を深めておくことが役立ちます。 ISO/IEC 29500 の仕様に記載されている次の情報は、この要素を操作するときに役立ちます。

この要素は、共有スタイル シート (テーマ) に関連付けられたルート レベルの複合型を定義します。 この要素は、テーマを通じてドキュメントに適用できるあらゆる種類の書式設定オプションを含んでおり、テーマが適用されたオブジェクトをドキュメント内で使用したときのドキュメントの全体的な外観を定義します。

[例: 使用中のさまざまなテーマがプレゼンテーションに適用される例として、次のようなイメージを考えてみます。 この例では、テーマがプレゼンテーションのさまざまなオブジェクトのフォント、色、背景、塗りつぶし、効果にどのような影響を与えるかについて説明します。 例の終了]

テーマ サンプル

この例では、テーマがプレゼンテーションのさまざまなオブジェクトのフォント、色、背景、塗りつぶし、効果にどのような影響を与えるかについて説明します。 例終わり]

© ISO/IEC 29500: 2016

次の表に、テーマ クラスで使用できる子の型の一覧を示します。

PresentationML の要素 Open XML SDK クラス 説明
<custClrLst/> CustomColorList ユーザー設定色リスト
<extLst/> ExtensionList 拡張リスト
<extraClrSchemeLst/> ExtraColorSchemeList その他の配色リスト
<objectDefaults/> ObjectDefaults オブジェクトの既定値
<themeElements/> ThemeElements テーマ要素

次の XML スキーマ フラグメントでは、テーマ要素の 4 つのパーツを定義しています。 themeElements要素は、テーマ内で定義されているメインの書式設定を保持する部分です。 その他の部分では、 themeElementsに含まれる情報のオーバーライド、既定値、追加が提供されます。 テーマを定義する複合型 ( CT_OfficeStyleSheet) は、次の方法で定義されます。

    <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も保持されます。

サンプル コードの動作のしくみ

ファイルを開いた後、wordDoc オブジェクトでMainDocumentPartをインスタンス化し、古いテーマ パーツを削除できます。

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
    if (wordDoc?.MainDocumentPart?.ThemePart is null)
    {
        throw new ArgumentNullException("MainDocumentPart and/or Body and/or ThemePart is null.");
    }

    MainDocumentPart mainPart = wordDoc.MainDocumentPart;

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

その後、新しい ThemePart オブジェクトを作成して、 MainDocumentPart オブジェクトに追加できます。 次に、 StreamReader オブジェクトと StreamWriter オブジェクトを使用してコンテンツを追加し、テーマを themeFile から 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());
}

サンプル コード

以下のコード例では、ワープロ ドキュメント内のテーマ ドキュメント パーツを別のパッケージのテーマ パーツで置換する方法を示します。 2 つ目の引数として渡されるテーマ ファイルは、XML 形式の有効なテーマ パーツである必要があります (たとえば、Theme1.xml)。 .Zip ファイルに名前を変更された既存のドキュメントまたはテーマ ファイル (.THMX) からこのパーツを抽出できます。 メソッド ReplaceTheme を呼び出すには、次の呼び出し例を使用して、 arg[1] からファイルからにあるファイルにテーマをコピーできます。 arg[0]

string document = args[0];
string themeFile = args[1];

ReplaceTheme(document, themeFile);

プログラムを実行した後、Wordファイルを開き、新しいテーマが変更されていることがわかります。

以下は、C# および Visual Basic の完全なサンプル コードです。

// This method can be used to replace the theme part in a package.
static void ReplaceTheme(string document, string themeFile)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        if (wordDoc?.MainDocumentPart?.ThemePart is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body and/or ThemePart is null.");
        }

        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());
        }
    }
}

関連項目