Share via


パッケージからドキュメント パーツを削除する

このトピックでは、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 名前空間にあります。 次の表に、documentbodyprt の各要素に対応するクラスのクラス名を示します。

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

関連項目