パッケージからドキュメント パーツを削除する
このトピックでは、Open XML SDK for Office のクラスを使用して、プログラムによって Wordprocessing ドキュメントからドキュメント パーツ (ファイル) を削除する方法について説明します。
パッケージとドキュメント パーツ
Open XML ドキュメントは、 ISO/IEC 29500-2 で定義された形式のパッケージとして格納されます。 パッケージには、それらの間のリレーションシップを持つ複数のパーツを含めることができます。 パーツ間の関係によって、ドキュメントのカテゴリが制御されます。 ドキュメントは、パッケージリレーションシップアイテムにメインドキュメントパーツとの関係が含まれている場合、ワープロドキュメントとして定義できます。 パッケージリレーションシップ項目にプレゼンテーション パーツとのリレーションシップが含まれている場合は、プレゼンテーション ドキュメントとして定義できます。 パッケージリレーションシップアイテムにブックパーツとのリレーションシップが含まれている場合は、スプレッドシートドキュメントとして定義されます。 このハウツー トピックでは、ワープロ ドキュメント パッケージを使用します。
WordprocessingDocument オブジェクトの取得
コード例では、まず DocumentFormat.OpenXml.Packaging.WordprocessingDocument のオーバーロードされた Open() メソッドの 1 つに引数としてファイル名を渡し、パッケージ ファイルを開きます。このメソッドは、文字列と、ファイルを読み取り/書き込みモードで開くかどうかを指定するブール値を受け取ります。 この例では、ブール値を true に設定し、ファイルを読み取り/書き込みモードで開くことを指定しています。
// Open a Wordprocessing document for editing.
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
// Insert other code here.
}
using ステートメントは、一般的な .Create, .Save, .Close シーケンスに代わる手段として推奨されます。 これによって、閉じかっこに達したときに、 Dispose メソッド (Open XML SDK がリソースをクリーンアップするために使用する内部メソッド) が自動的に呼び出されます。 using ステートメントに続くブロックは、 using ステートメントで作成または指定されたオブジェクト (この例では wordDoc) のスコープを設定します。 Open XML SDK の WordprocessingDocument クラスは、 System.IDisposable 実装の一部として自動的にオブジェクトを保存して閉じるため、また、 Dispose メソッドがブロックの終わりで自動的に呼び出されるため、 using を使用する場合は、 Save および Close を明示的に呼び出す必要はありません。
WordProcessingML ドキュメントの構造
WordProcessingML ドキュメントの基本ドキュメント構造は、 document 要素と body 要素、およびそれに続く 1 つ以上のブロック レベルの要素 (段落を表す p など) で構成されます。 段落には 1 つ以上の r 要素が含まれます。 r はセクションを表し、書式などの共通のプロパティ セットを含むテキストの領域です。 セクションには 1 つ以上の t 要素が含まれます。 t 要素には、さまざまなテキストが含まれます。 次のコード例は、テキスト "Example text." を含むドキュメントの WordprocessingML マークアップを示します。
<w:document xmlns:w="https://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 要素に対応する厳密に型指定されたクラスを使用して、ドキュメント構造とコンテンツを作成できます。 これらのクラスは、DocumentFormat.OpenXml.Wordprocessing 名前空間にあります。 次の表に、document、body、p、r、t の各要素に対応するクラスのクラス名を示します。
WordprocessingML の要素 | Open XML SDK クラス | 説明 |
---|---|---|
document | Document | メイン ドキュメント パーツのルート要素 |
body | Body | ISO/IEC 29500 仕様で指定されている、段落、表、注釈などのブロック レベル構造のコンテナー |
p | Paragraph | 段落 |
r | Run | セクション |
t | Text | さまざまなテキスト |
WordprocessingML ドキュメントのパーツと要素の全体的な構造の詳細については、「 WordprocessingML ドキュメントの構造」を参照してください。
settings 要素
ISO/IEC 29500 仕様書では、PresentationML パッケージの settings 要素について次のように説明しています。
この要素は、WordprocessingML ドキュメントに適用される設定を指定します。 この要素は、WordprocessingML ドキュメント内のドキュメント設定パーツのルート要素です。
例: ドキュメントの設定パーツ向けに次の WordprocessingML フラグメントを検討します。
<w:settings>
<w:defaultTabStop w:val="720" />
<w:characterSpacingControl w:val="dontCompress" />
</w:settings>
settings 要素には、このドキュメントのすべての設定が含まれます。 この例では、defaultTabStop 要素による 0.5 インチ間隔の自動タブ位置と、characterSpacingControl 要素による文字レベルの非空白圧縮の 2 つの設定が適用されます。
© ISO/IEC29500: 2008.
サンプル コードの動作のしくみ
using ステートメントでドキュメントを WordprocessingDocument オブジェクトとして開いた後、 DocumentSettingsPart パーツへの参照を作成します。 次に、そのパーツが存在するかどうかを確認し、存在する場合は、パッケージからそのパーツを削除します。 この例では、 settings.xml パーツがパッケージから削除されます。
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
if (mainPart.DocumentSettingsPart != null)
{
mainPart.DeletePart(mainPart.DocumentSettingsPart);
}
サンプル コード
次のコードでは、パッケージからドキュメント パーツを削除します。 プログラムを実行するには、この例のように RemovePart メソッドを呼び出します。
string document = @"C:\Users\Public\Documents\MyPkg6.docx";
RemovePart(document);
注:
たとえば、テスト ファイル "MyPkg6.docs" でプログラムを実行する前に、Open XML SDK Productivity Tool for Microsoft Office を使用してファイルを開き、その構造を調べます。 プログラムを実行した後で再びファイルを確認すると、 DocumentSettingsPart パーツが削除されたことがわかります。
以下は、C# および Visual Basic の完全なコード例です。
using DocumentFormat.OpenXml.Packaging;
RemovePart(args[0]);
// To remove a document part from a package.
static void RemovePart(string document)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
MainDocumentPart? mainPart = wordDoc.MainDocumentPart;
if (mainPart is not null && mainPart.DocumentSettingsPart is not null)
{
mainPart.DeletePart(mainPart.DocumentSettingsPart);
}
}
}