次の方法で共有


パッケージ内のドキュメント パーツを置換する

適用対象: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

この記事の内容
パッケージとドキュメント パーツ
WordprocessingDocument オブジェクトの取得
Word パッケージのテーマを変更する方法
テーマ要素の構造
サンプル コードの動作のしくみ
サンプル コード

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

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

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

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

Open XML ドキュメントはパッケージとして保存されます。このパッケージの形式は、ISO/IEC 29500-2 (英語) に定義されています。パッケージの内部は、リレーションシップで結ばれた複数のパーツに分けることができます。パーツ間のリレーションシップによって、ドキュメントのカテゴリが決まります。パッケージのリレーションシップ アイテムにメイン ドキュメント パーツへのリレーションシップを含めると、そのドキュメントをワープロ ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにプレゼンテーション パーツへのリレーションシップを含めると、そのドキュメントをプレゼンテーション ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにブック パーツへのリレーションシップを含めると、そのドキュメントをスプレッドシート ドキュメントとして定義できます。このトピックでは、ワープロ ドキュメント パッケージを使用します。

WordprocessingDocument オブジェクトの取得

サンプル コードでは、以下の using ステートメントに示すように、まず WordprocessingDocument クラスをインスタンス化することにより、ワープロ ファイルを開きます。同じステートメントで、ドキュメントの編集を有効にするためにブール型のパラメーターを true に設定して Open メソッドを使用することにより、ワープロ ファイル 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 を明示的に呼び出す必要はありません。

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

Word 文書のテーマを変更するには、リボンの [ページ レイアウト] をクリックし、[テーマ] をクリックします。[テーマ] メニューが開きます。組み込みのテーマの 1 つを選択して Word 文書に適用するには、テーマ アイコンをクリックします。[テーマの参照] オプションを使用して、コンピューターに保存されているテーマ ファイルを参照し、適用することもできます。

テーマ要素の構造

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

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

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

テーマ サンプル

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

c ISO/IEC29500: 2008.

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

PresentationML 要素

Open XML SDK 2.0 のクラス

説明

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 をインスタンス化し、古いテーマ パーツを削除します。

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 オブジェクトに追加します。その後、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());
}
' 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

サンプル コード

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

以下は、C# および 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

関連項目

参照

Class Library Reference