Open XML パッケージ パーツのコンテンツを別のパッケージ内のドキュメント パーツにコピーする
このトピックでは、Open XML SDK for Office のクラスを使用して、Open XML Wordprocessing ドキュメント パーツの内容をプログラムによって別のワープロ ドキュメントのドキュメント パーツにコピーする方法について説明します。
パッケージとドキュメント パーツ
Open XML ドキュメントはパッケージとして格納され、その形式は ISO/IEC 29500 によって定義されます。 パッケージには、それらの間のリレーションシップを持つ複数のパーツを含めることができます。 パーツ間の関係によって、ドキュメントのカテゴリが制御されます。 ドキュメントは、パッケージリレーションシップアイテムにメインドキュメントパーツとの関係が含まれている場合、ワープロドキュメントとして定義できます。 パッケージリレーションシップ項目にプレゼンテーション パーツとのリレーションシップが含まれている場合は、プレゼンテーション ドキュメントとして定義できます。 パッケージリレーションシップアイテムにブックパーツとのリレーションシップが含まれている場合は、スプレッドシートドキュメントとして定義されます。 このハウツー トピックでは、ワープロ ドキュメント パッケージを使用します。
WordprocessingDocument オブジェクトの取得
既存のドキュメントを開くには、次の 2 つのusing
ステートメントに示すように、WordprocessingDocument クラスをインスタンス化します。 同じステートメントで、指定したファイル名を持つワープロ ファイルを開くには、 Open メソッドと Boolean パラメーターを使用します。
パラメーターを false
に設定したソース ファイルで、読み取り専用アクセス用に開きます。 ターゲット ファイルの場合、ドキュメントの編集を有効にするには、パラメーターを true
に設定します。
using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(fromDocument1, false))
using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(toDocument2, true))
v3.0.0 以降では、using ステートメントに依存することを優先して、Close() メソッドが削除されました。
これにより、閉じかっこに達したときに、 Dispose() メソッドが自動的に呼び出されます。 using ステートメントに続くブロックは、using ステートメントで作成または名前付けされたオブジェクトのスコープを確立します。 Open XML SDK の WordprocessingDocument クラスは、IDisposable実装の一部としてオブジェクトを自動的に保存および閉じます。また、ブロックを終了するとDispose()が自動的に呼び出されるため、using
ステートメントを使用する限り、明示的にSave()またはDispose()を呼び出す必要はありません。
WordProcessingML ドキュメントの構造
WordProcessingML
ドキュメントの基本的なドキュメント構造は、document
要素とbody
要素で構成され、その後に段落を表す p
などの 1 つ以上のブロック レベル要素が続きます。 段落には、1 つ以上の r
要素が含まれています。
r
は、書式設定などのプロパティの共通セットを持つテキストの領域である run を表します。 実行には、1 つ以上の t
要素が含まれています。
t
要素には、テキストの範囲が含まれています。 次のコード例は、"テキストの例" というテキストを含むドキュメントの WordprocessingML
マークアップを示しています。
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
Open XML SDK を使用すると、 WordprocessingML
要素に対応する厳密に型指定されたクラスを使用して、ドキュメント構造とコンテンツを作成できます。 これらのクラスは、 名前空間にあります。 次の表に、 document
、 body
、 p
、 r
、 t
の各要素に対応するクラスのクラス名を示します。
WordprocessingML 要素 | Open XML SDK クラス | 説明 |
---|---|---|
<document/> |
Document | メイン ドキュメント パーツのルート要素。 |
<body/> |
Body | ISO/IEC 29500 仕様で指定されている、段落、表、注釈などのブロック レベル構造のコンテナー |
<p/> |
Paragraph | 段落 |
<r/> |
Run | セクション |
<t/> |
Text | さまざまなテキスト |
WordprocessingML ドキュメントのパーツと要素の全体的な構造の詳細については、「 WordprocessingML ドキュメントの構造」を参照してください。
テーマ パーツ
テーマ パーツには、ドキュメントの色、フォント、および書式設定についての情報が含まれます。 テーマ パーツは、ISO/IEC 29500 仕様書に、次のように定義されています。
このパーツタイプのインスタンスには、配色、フォントスキーム、書式スキームの組み合わせであるドキュメントのテーマに関する情報が含まれています (後者は効果とも呼ばれます)。 WordprocessingML ドキュメントの場合、テーマの選択は、見出しの色とスタイルなどに影響します。 SpreadsheetML ドキュメントの場合、テーマの選択は、セルの内容やグラフの色やスタイルなどに影響します。 PresentationML ドキュメントの場合、テーマの選択は、関連するマスターを介したスライド、配布資料、ノートの書式設定などに影響します。
WordprocessingML パッケージまたは SpreadsheetML パッケージには、0 個または 1 つのテーマ 部分が含まれている必要があります。これは、メイン ドキュメント (§11.3.10) またはブック (§12.3.23) パーツの暗黙的なリレーションシップのターゲットになります。 PresentationML パッケージには、暗黙的なリレーションシップを使用して、配布資料マスター (§13.3.3)、ノート マスター (§13.3.4)、スライド マスター (§13.3.10) またはプレゼンテーション (§13.3.6) ごとに 0 個または 1 つのテーマ パーツを含める必要があります。
例: 次の WordprocessingML メイン文書パーツ リレーションシップ アイテムには、ZIP アイテム theme/theme1.xml に格納されているテーマ パーツへのリレーションシップが含まれます。
<Relationships xmlns="…">
<Relationship Id="rId4"
Type="https://…/theme" Target="theme/theme1.xml"/>
</Relationships>
© ISO/IEC 29500: 2016
サンプル コードの動作のしくみ
Open XML パッケージ内のドキュメント パーツの内容を別のパッケージ内のドキュメント パーツにコピーするには、各ワープロ ドキュメントの完全なパスがパラメーターとして CopyThemeContent
メソッドに渡されます。 その後、コードは両方のドキュメントを WordprocessingDocument オブジェクトとして開き、各パッケージ内の ThemePart パーツを参照する変数を作成します。
static void CopyThemeContent(string fromDocument1, string toDocument2)
{
using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(fromDocument1, false))
using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(toDocument2, true))
{
ThemePart? themePart1 = wordDoc1?.MainDocumentPart?.ThemePart;
ThemePart? themePart2 = wordDoc2?.MainDocumentPart?.ThemePart;
次に、コードは、StreamReader
オブジェクトを使用してソース ThemePart パーツの内容を読み取り、StreamWriterを使用してターゲット ThemePart パーツに書き込みます。
using (StreamReader streamReader = new StreamReader(themePart1.GetStream()))
using (StreamWriter streamWriter = new StreamWriter(themePart2.GetStream(FileMode.Create)))
{
streamWriter.Write(streamReader.ReadToEnd());
}
サンプル コード
以下のコードでは、Open XML パッケージ内のドキュメント パーツのコンテンツを別のパッケージ内のドキュメント パーツにコピーします。
CopyThemeContent
メソッドを呼び出すには、次の例を使用して、args[0]
にあるパッケージからargs[1]
にあるパッケージにテーマ パーツをコピーします。
string fromDocument1 = args[0];
string toDocument2 = args[1];
CopyThemeContent(fromDocument1, toDocument2);
重要
プログラムを実行する前に、ソース ドキュメントにテーマ パーツが設定されていることを確認します。 ドキュメントにテーマを追加するには、Microsoft Wordでテーマを開き、[デザイン] タブをクリックし、[テーマ] をクリックして、使用可能なテーマのいずれかを選択します。
プログラムを実行した後、ファイルを検査して、変更されたテーマを確認できます。
以下は、C# および Visual Basic の完全なサンプル コードです。
static void CopyThemeContent(string fromDocument1, string toDocument2)
{
using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(fromDocument1, false))
using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(toDocument2, true))
{
ThemePart? themePart1 = wordDoc1?.MainDocumentPart?.ThemePart;
ThemePart? themePart2 = wordDoc2?.MainDocumentPart?.ThemePart;
// If the theme parts are null, then there is nothing to copy.
if (themePart1 is null || themePart2 is null)
{
return;
}
using (StreamReader streamReader = new StreamReader(themePart1.GetStream()))
using (StreamWriter streamWriter = new StreamWriter(themePart2.GetStream(FileMode.Create)))
{
streamWriter.Write(streamReader.ReadToEnd());
}
}
}