方法 : Office オープン XML 形式のドキュメントを操作する

概要 : Office オープン XML 形式のファイルは、Office system のレガシ バイナリ ファイルに代わるものです。フォーマットされたファイルに含まれているコンポーネント、およびこれらのファイルの多様性を示すいくつかのシナリオについて学習してください (25 印刷ページ)。

Frank Rice、Microsoft Corporation

2006 年 12 月

適用対象 : Microsoft Office Excel 2007、Microsoft Office PowerPoint 2007、Microsoft Office Word 2007

2007OfficeManipulatingOpenXMLFilesSample.exe (英語) をダウンロードしてください。

目次

  • 概要

  • Office オープン XML 形式のファイルを作成する

  • Office オープン XML 形式のファイルを探索する

  • Office オープン XML 形式を使用して作成されたドキュメントを手動で編集する

  • Office オープン XML 形式のドキュメントをプログラムで操作する

  • まとめ

  • 追加情報

概要

以前のバージョンの Microsoft Office では、Microsoft Office Excel、Microsoft Office PowerPoint、および Microsoft Office Word で作成されたファイルは、バイナリ ファイルと呼ばれる、独自の単一ファイル形式で保存されていました。2007 リリースの Microsoft Office system では、Microsoft Office Excel 2007、Microsoft Office PowerPoint 2007、および Microsoft Office Word 2007 用に Office オープン XML 形式という新しいファイル形式が導入されています。

Office オープン XML 形式は、XML と ZIP のアーカイブ テクノロジに基づいています。2007 リリースのドキュメントは、以前のバージョンの Microsoft Office と同様に、単一のファイルまたはコンテナに保存されるため、ドキュメントの管理プロセスは相変わらず単純です。ただし、レガシ ファイルとは異なり、Office オープン XML 形式のファイルは開いて、ファイルを構成している構造にアクセスできるコンポーネント パーツを表示できます。

この記事では、ファイルを手動で開き、ドキュメントを構成している各パーツを探索して、Office オープン XML 形式のファイルを調べます。また、プログラムを使用してドキュメントの操作も行います。この記事で使用されるファイルは、この記事に付属のダウンロード サイト、2007OfficeManipulatingOpenXMLFilesSample.exe (英語) で入手できます。ダウンロード サイトにアクセスできない場合は、自分のプログラム ファイルと例のイメージ ファイルで代用できます。

Office オープン XML 形式のファイルを作成する

このセクションでは、テキスト、イメージ、およびプロパティを含む XML ファイル形式の Word 2007 サンプル ドキュメントを調べます。

Word で Office オープン XML 形式のドキュメントを作成するには

  1. Word 2007 を起動します。

  2. 新しいドキュメントに、次のテキストを貼り付けます。

    Soaring with the American Bald Eagle

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nulla rutrum. Phasellus feugiat bibendum urna. Aliquam lacinia diam ac felis. In vulputate semper orci. Quisque blandit. Mauris et nibh. Aenean nulla. Mauris placerat tempor libero.

    Pellentesque bibendum. In consequat, sem molestie iaculis venenatis, orci nunc imperdiet justo, id ultricies ligula elit sit amet ante. Sed quis sem. Ut accumsan nulla vel nisi. Ut nulla enim, ullamcorper vel, semper vitae, vulputate vel, mi. Duis id magna a magna commodo interdum.

  3. Soaring with the American Bald Eagle という行を強調表示し、[ホーム] タブの [スタイル] グループで、スタイルを Title に設定します。

  4. 次に、イメージをドキュメントに挿入します。

    1. カーソルを最初の段落の末尾に置き、Enter キーを押して新しい行を挿入します。

    2. 次に、[挿入] タブの [] をクリックし、イメージ ファイル (ダウンロード パッケージに含まれている Eagle1.gif ファイルなど) に移動して、[挿入] をクリックします。

  5. ここで、次のいくつかのドキュメントのプロパティを追加します。

    1. [Microsoft Office ボタン] をクリックし、[準備] をポイントして、[プロパティ] をクリックします。

    2. [ドキュメントのプロパティ] ウィンドウで、次のように作成者名、表題、副題、およびコメントを追加します。

      表 1. ドキュメント プロパティの設定

      プロパティ

      テキスト型

      Author

      Nancy Davolio

      Title

      Soaring with the American Bald Eagle

      Subject

      Bald Eagles

      Comments

      A study of the bald eagle

  6. 次に、コメントをドキュメントの本文に追加します。

    1. [確認] タブの [新しいコメント] をクリックします。

    2. コメント用吹き出しに、「This is my comment.」と入力します。

      ドキュメントは図 1 のような外観になります。

      図 1. Office Word 2007 のサンプル ドキュメント

      Office Word 2007 文書のサンプル

  7. 次にドキュメントを保存します。

    1. [Microsoft Office ボタン] をクリックし、[名前を付けて保存] をクリックします。

    2. [ファイルの種類] ボックスの一覧で [Word 文書 (*.docx)] を選択し、[ファイル名] ボックスに「SampleWordDocument.docx」と入力します。

    3. [保存] をクリックします。

  8. Word を閉じます。

Office オープン XML 形式のファイルを探索する

このセクションでは、作成したサンプル ドキュメントを探索します。

Office オープン XML 形式のドキュメントを探索するには

  1. Microsoft Windows エクスプローラを開きます。

  2. SampleWordDocument.docx ファイルに移動し、ファイルを右クリックして [名前の変更] を選択します。

    重要

    次の 3 つの手順を実行して、この記事の残りの部分で使用する Office オープン XML 形式のファイルを展開します。手順 5. は、Windows XP または Windows Vista を使用しているかどうかに応じて異なります。

  3. ファイル名の末尾に .zip 拡張子を追加します。これで、ファイル名は SampleWordDocument.docx.zip となります。

  4. "名前の変更に関する警告" メッセージが表示されたら、[はい] をクリックします。

  5. コンテナ ファイルを展開します。

    1. (If you are using Windows XP:)SampleWordDocument.docx.zip を右クリックし、[プログラムから開く] をポイントして、[圧縮 (zip 形式) フォルダ] をクリックします。フォルダおよびドキュメントを構成しているパーツが、エクスプローラ ウィンドウに表示されます。

    2. (If you are using Windows Vista:)SampleWordDocument.docx.zip を右クリックし、[すべて展開] をクリックします。[圧縮 (ZIP 形式) フォルダの展開] ダイアログ ボックスで、既定値をそのまま使用するか、新しい場所を選択して、[展開] をクリックします。フォルダおよびドキュメントを構成しているパーツが、エクスプローラ ウィンドウに表示されます。

    次の手順では、ドキュメントに含まれている主要なパーツを調べます。

  6. [Content_Types].xml パーツを調べます。

    1. Windows エクスプローラを使用して、[Content_Types].xml という名前のファイルを検索します。

    2. ファイルを右クリックし、[プログラムから開く] をポイントして、[Internet Explorer] をクリックします。

      すべての Office オープン XML 形式のドキュメントのルートには、[Content_Types].xml パーツがあります。[Content_Types].xml パーツの目的は、ドキュメント内で見つかるすべての固有な種類のパーツを識別することです。各パーツの種類は、このパーツに一覧表示されている必要があります。パーツには識別可能な種類が設定されており、ドキュメントの表示時に、アプリケーションがそのパーツの使用方法を把握できる必要があります。種類によって、パーツの目的とその使用方法も理解できるようになります。

    3. ファイルを閉じます。

  7. .rels フォルダを調べます。

    リレーションシップは、2 つのパーツ間の関係を表します。リレーションシップ自身は、_rels という名前のサブフォルダに格納されているパーツです。関連するパーツを持つ任意のパーツには、_rels という兄弟フォルダも含まれています。この兄弟フォルダには、そのリレーションシップを定義する .rels パーツが含まれています。このサブフォルダは、そのリレーションシップが作成されるパーツと同じフォルダに作成されます。リレーションシップの名前は、元のパーツのファイル名に .rels 拡張子を追加して生成されます (ドキュメント ファイルのリレーションシップ パーツは例外で、単に ".rels" という名前が付けられます)。

    1. Windows エクスプローラで、_rels フォルダをダブルクリックし、.rels ファイルを右クリックします。

    2. [プログラムから開く] をポイントし、[プログラムの選択]、[Internet Explorer]、[開く] の順にクリックします。

    3. パーツの調査が完了したら、閉じます。

  8. docProps フォルダを調べます。

    2007 リリースのドキュメントのプロパティは、3 つの Microsoft Office system プログラムで一貫した構成になっています。これらのプロパティは、3 つの論理 XML パーツに分割されて docProps サブフォルダに格納されます。これによって、これらのプロパティは、常に同じ場所にあり、他のドキュメントのコンテンツと混在しないため、アクセスしやすくなります。

    • Windows エクスプローラで、docProps フォルダをダブルクリックし、core.xml ファイルを右クリックします。次に、[プログラムから開く] をポイントして、[Internet Explorer] をクリックします。
  9. core.xml パーツを調べます。

    • core.xml パーツを開き、前に入力したプロパティが表示されることを確認します。

      core.xml パーツは、ドキュメントを識別するためにユーザーが入力する、表題、副題、作成者などの一般的なドキュメントのプロパティを保持します。

  10. custom.xml パーツを調べます。

    • Windows エクスプローラから、custom.xml を Internet Explorer で開きます。

      custom.xml パーツには、ユーザー、開発者、またはカスタム ロジックを通じてドキュメントに追加されたカスタムのドキュメントのプロパティが格納されています。

  11. app.xml パーツを調べます。

    • Windows エクスプローラから、app.xml を Internet Explorer で開きます。

      app.xml パーツは、ページ数、テキストの行数、アプリケーションのバージョンなど、アプリケーション レベルでドキュメントに固有なプロパティから構成されています。

  12. word フォルダを調べます。

    コンテンツ固有のパーツの大半は、word サブフォルダ内に存在します。この場合も、_rels という名前のリレーションシップ サブフォルダがあります。

    • _rels フォルダをダブルクリックします。

      _rels サブフォルダ内の document.xml.rels という名前のパーツには、すべてのドキュメントのパーツをリンクするためのリレーションシップがあります。

  13. document.xml.rels パーツを調べます。

    • document.xml.rels を Internet Explorer で開きます。

      リレーションシップは、ID と Uniform Resource Identifier (URI) を使用してパーツを探します。これによって、ハードコードされた参照なしで、リレーションシップ以外のすべてのパーツを無効にできます。このことについては、この記事の後で詳細に説明します。

      word フォルダでは、styles.xml パーツにも注意してください。

  14. styles.xml パーツを調べます。

    • styles.xml を Internet Explorer で開きます。

      このファイルには、ドキュメントで使用できるアクセントと網掛けの一覧も含まれています。

    Required and Optional Parts

    Office オープン XML 形式のファイル内のパーツを使用すると、ドキュメントを高度にモジュール化された状態で格納できます。ドキュメントを有効にするには、document.xml パーツや fontTable.xml パーツなどいくつかのパーツが必要になります。

  15. document.xml パーツを調べます。

    1. document.xml を Internet Explorer で開きます。

      document.xml パーツには、ドキュメントの本文用のテキストが格納されています。

    2. このファイルを調べたら、Internet Explorer を閉じます。

  16. fontTable.xml パーツを調べます。

    1. fontTable.xml パーツを Internet Explorer で開きます。

      fontTable.xml パーツには、ドキュメントのフォント設定が格納されています。

    2. このファイルを調べたら、Internet Explorer を閉じます。

    他のパーツは、それが表す機能がドキュメント内に見つからない場合は不要となります。例としては、コメント、ヘッダー パーツ、フッター パーツなどがあります。これらはすべて Word ドキュメントでは省略可能です。これによって、未使用のコンテンツをスキャンせずに、ドキュメント構造を簡単に検索できるようになります。

    XML は構造化されたコンテンツ用に設計されており、イメージや OLE オブジェクトなどのバイナリ コンテンツを本来サポートしていません。バイナリ データは、文字にエンコードして XML に格納できますが、エンコード/デコード処理が必要となり、アプリケーションと開発者の両方にとって非効率となります。2007 リリースでは、バイナリ オブジェクトをバイナリ パーツとしてネイティブ形式で格納できるため、エンコードの必要はありません。このため、Office ドキュメント内のバイナリ オブジェクトへのアクセスは非常に簡単です。

    メディア ファイルは media フォルダに格納されます。

  17. word\media フォルダおよび word\embeddings フォルダを調べます。

    • Windows エクスプローラで、media サブフォルダをダブルクリックします。

      .gif メディア ファイルが前に挿入したイメージを表していることに注意してください。

      注意

      イメージ ファイルのファイル名が Eagle1.gif から image1.gif に変更されていることにお気付きでしょう。この変更は、悪意のある人物がイメージ ファイルなどドキュメント内のパーツの名前から競争上の優位性を獲得する可能性があり、そのようなプライバシーに関する懸念に対処するために行われます。たとえば、作成者は、ドキュメント ファイルのテキスト部分を暗号化することで、ドキュメントのコンテンツを保護することもできます。ただし、old_widget.gif および new_reenforced_widget.gif という名前の 2 つのイメージを挿入した場合、テキストが保護されていても、悪意のある人物は widget がアップグレードされているという事実を把握できます。image1 や image2 などの汎用的なイメージ ファイル名を使用すれば、Office オープン XML 形式のファイルに別の保護層が追加されます。

  18. SampleWordDocument.docx.zip を保存せずに閉じます。

Office オープン XML 形式を使用して作成されたドキュメントを手動で編集する

Office オープン XML 形式には、多数の利点があります。特に有用な 1 つの利点は、Office プログラムを自身で購入せずに、2007 リリースの Office system を使用して作成されたドキュメントを操作できることです。これによって、ドキュメントをスケーラブルな方法でアセンブル、アクセス、または編集するサーバー ベースのソリューションを作成できるようになります。

次の手順では、Word 2007 ドキュメントを手動で編集します。これらのシナリオは、この新しいファイル形式で可能になるほんのわずかなサンプルであることに注意してください。また、ほとんどの場合、ユーザーがこのような方法でドキュメントを手動で編集することが予想されていないことにも注意してください。ただし、開発者にとっては、コードを記述せずに 2007 リリースの Office system を使用して作成されたドキュメントを探索できることは、ソリューションの設計またはアプリケーションのプロトタイピング時に大きな利点となります。前にも説明したように、ドキュメントのコンテナ ファイルにアクセスしたら、個々のパーツをきわめて簡単に操作できます。これは、パーツを編集、置き換え、場合によっては追加できることも意味します。次の手順では、Word 2007 ドキュメントのパーツの 1 つで XML を変更して、そのドキュメントを編集します。具体的には、ドキュメント内のコメントを修正し、ドキュメントのプロパティを更新します。

XML で Office オープン XML 形式のドキュメントを変更するには

  1. Word 2007 で、SampleWordDocument.docx ドキュメントを開きます。

    注意

    ファイル名から .zip 拡張子をまだ削除していない場合は、この時点で削除する必要があります。

  2. [Microsoft Office ボタン] をクリックし、[準備] をポイントして、[プロパティ] をクリックします。Author、Title、Subject、および Comments の入力内容をメモし、ドキュメントを閉じます。

  3. Windows エクスプローラを開き、SampleWordDocument.docx ドキュメントに移動します。

  4. 「Office オープン XML 形式のファイルを探索する」を使用して、ドキュメント ファイルを展開します。

    Word 2007 ドキュメントの校閲者コメントは、comments.xml という名前の自分自身のパーツに格納されます。このようにドキュメントの本文から分離することによって、パーツを簡単に見つけ、変更できるようになります。

  5. comments.xml パーツをアーカイブから Windows デスクトップまでドラッグします。

  6. comments.xml パーツを右クリックし、[プログラムから開く] をポイントして、メモ帳など任意のテキスト エディタまたは XML エディタをクリックします。

  7. 次のテキストを見つけます。

    <w:t>A study of the bald eagle</w:t>
    
  8. <w:t> 要素のテキストを置き換えるか、編集します。たとえば、次のように変更します。

    <w:t>A detailed study of the bald eagle</w:t>
    
  9. ファイルを保存して閉じます。

  10. Windows デスクトップから、comments.xml パーツをアーカイブの word フォルダまでドラッグします。

  11. "Confirm File Replace" 警告メッセージが表示されたら、[はい] をクリックします。

    次に、ドキュメントのプロパティを変更して、それらの変更の結果を確認します。ドキュメントのプロパティは、アーカイブのルート フォルダのサブフォルダに格納されるため、アクセスと編集が非常に簡単になります。

  12. docProps フォルダをダブルクリックします。

  13. core.xml パーツをアーカイブから Windows デスクトップまでドラッグします。

  14. core.xml をテキスト エディタで開きます。

  15. 次のテキストを見つけます。

    <dc:creator>Nancy Davolio</dc:creator>
    
  16. <dc:Creator> 要素内のテキストを置き換えるか、編集します。たとえば、テキストを自分の名前で置き換えます。

  17. ファイルを保存して閉じ、パーツをアーカイブ内の docProps フォルダまでドラッグして戻します。

  18. "Confirm File Replace" 警告メッセージが表示されたら、[はい] をクリックします。

  19. .zip ファイルが見つかるまで、ツール バーの戻る矢印または Up アイコンをクリックして、ドキュメント コンテナに移動します。

  20. ファイル名から .zip 拡張子を削除し、ファイルを Word 2007 で開きます。

  21. [Microsoft Office ボタン] をクリックし、[準備] をポイントして、[プロパティ] をクリックします。

    コメントのテキストが変更されていることを確認します。Author プロパティも変更されていることに注意してください。

前の手順では、ドキュメント内で見つかった既存の XML パーツを編集して、ドキュメントを変更しました。新しいファイル形式では、ドキュメント パーツ全体を置き換えて、ドキュメントのコンテンツ、形式、またはプロパティを変更することもできます。これによって、既存のドキュメント パーツを使用して、個々のドキュメントを更新、またはドキュメントのライブラリ全体を更新する多くのシナリオが可能になります。

既存のパーツを使用してドキュメントを変更する 1 つの例としては、ドキュメントが使用するスタイルを変更することが挙げられます。これは、ドキュメントの複数の外観を管理する必要があるが、ドキュメントの 1 つの物理バージョンのみ維持する場合に便利です。ドキュメントが使用しているすべてのスタイルを変更するのは、styles.xml パーツの置き換えと同様に簡単です。

このシナリオでは、すべてのドキュメントのスタイル パーツのコレクションをコンパイルし、ユーザーがさまざまなスタイルを自動的に選択できるようにするプログラムを作成できます。背後では、プログラムが事前に作成されているパーツを別のパーツで置き換えます。次の手順では、この作業を手動で行います。

既存のパーツを置き換えて、Office オープン XML 形式のドキュメントを変更するには

  1. SampleWordDocument.docx のコピーを作成し、AnotherSampleWordDocument.docx という名前を付けます。

  2. Word 2007 で、AnotherSampleWordDocument.docx を開きます。

  3. [ホーム] タブで [スタイルの変更] をクリックし、[スタイル セット] をポイントして、[ファンシー] をクリックします。

    ドキュメントは図 2 のような外観になります。

    図 2. [ファンシー] スタイルでフォーマットされたドキュメント

    [ファンシー] スタイルで書式設定されたドキュメント

  4. ドキュメントを保存して閉じます。

  5. 「Office オープン XML 形式のファイルを探索する」を使用して、AnotherSampleWordDocument.docx ドキュメント ファイルを展開します。

  6. word フォルダをダブルクリックし、styles.xml パーツを Windows デスクトップまでドラッグします。このパーツは、作成した最初のドキュメントを更新するために使用されます。

  7. .zip ファイルが見つかるまで、ツール バーの戻る矢印または Up アイコンをクリックして、ドキュメント コンテナに移動します。

  8. ここで SampleWordDocument.docx ドキュメントを Word 2007 で開き、ドキュメントの本文のスタイルを確認します。

  9. ドキュメントを閉じます。

  10. 「Office オープン XML 形式のファイルを探索する」を使用して、SampleWordDocument.docx ドキュメント ファイルを展開します。

  11. word フォルダをダブルクリックして開き、styles.xml パーツを Windows デスクトップから word フォルダまでドラッグして、元のファイルと置き換えます。

  12. "Confirm File Replace" 警告メッセージが表示されたら、[はい] をクリックします。

  13. .zip ファイルが見つかるまで、ツール バーの戻る矢印または Up アイコンをクリックして、SampleWordDocument.docx ファイルのドキュメント コンテナに移動します。

  14. ファイル名から .zip 拡張子を削除し、ファイルを Word 2007 で開きます。

    ドキュメントのスタイルが、AnotherSampleWordDocument.docx に見られるスタイルに変更されていることに注意してください。

    AnotherSampleWordDocument.docx.zip ファイル名から .zip 拡張子をまだ削除していない場合は、この時点で削除します。

この種のシナリオのもう 1 つの例としては、ある Word 2007 ドキュメントのヘッダーとフッターのドキュメント パーツを使用して、1 つ以上の他の Word 2007 ドキュメントに同じ設定を複製することが挙げられます。この記事の後で説明するように、ヘッダー パーツとフッター パーツは手動で変更できます。もちろん、この処理はコードを使用して自動化することもできます。標準化されたドキュメント ヘッダーとフッターを、ドキュメント単位でこれらの詳細を管理せずに使用する組織にとって、この処理は役に立ちます。さらに、ヘッダーとフッターの形式が変更された場合でも、ヘッダーとフッターの置き換えは簡単です。

次の手順では、単純なヘッダーを SampleWordDocument.docx に追加します。その後、このヘッダーを AnotherSampleWordDocument.docx ドキュメントの異なるヘッダーで更新します。

Office オープン XML 形式のドキュメントのヘッダーを更新するには

  1. Word 2007 で、SampleWordDocument.docx を開きます。

  2. [挿入] タブで、[ヘッダー] ボタンのドロップダウン矢印をクリックし、[アルファベット] ビルトイン ヘッダーを選択します。ヘッダーがドキュメントの表題と共に追加されます。

    ドキュメントは図 3 のような外観になります。

    図 3. [アルファベット] ヘッダーを持つサンプル ドキュメント

    [アルファベット] ヘッダーを持つサンプル ドキュメント

  3. ファイルを保存して閉じます。

  4. Word 2007 で、AnotherSampleWordDocument.docx を開きます。

  5. [挿入] タブで、[ヘッダー] ボタンのドロップダウン矢印をクリックし、[年報] ビルトイン ヘッダーを選択します。ヘッダーがドキュメントの表題および年度を表す場所と共に追加されます。

    ドキュメントは図 4 のような外観になります。

    図 4. [年報] ヘッダーを持つサンプル ドキュメント

    [年報] ヘッダーを持つサンプル ドキュメント

  6. ファイルを保存して閉じます。

  7. 「Office オープン XML 形式のファイルを探索する」を使用して、AnotherSampleWordDocument.docx のドキュメント ファイルを展開します。

  8. word フォルダをダブルクリックし、header1.xml ファイルを Windows デスクトップまでドラッグします。

  9. .zip ファイルが見つかるまで、ツール バーの戻る矢印または Up アイコンをクリックして、ドキュメント コンテナに移動します。

  10. AnotherSampleWordDocument.docx.zip ファイル名から .zip ファイル名拡張子を削除します。

  11. 「Office オープン XML 形式のファイルを探索する」を使用して、SampleWordDocument.docx のドキュメント ファイルを展開します。

  12. word フォルダをダブルクリックし、header1.xml ファイルを Windows デスクトップから word フォルダまでドラッグします。

  13. "Confirm File Replace" 警告メッセージが表示されたら、[はい] をクリックします。

  14. .zip ファイルが見つかるまで、ツール バーの戻る矢印または Up アイコンをクリックして、ドキュメント コンテナに移動します。

  15. SampleWordDocument.docx.zip ファイル名から .zip 拡張子を削除し、ファイルを Word 2007 で開きます。

    新しいヘッダーに注意してください。

ドキュメントには、XML パーツと同様にアクセスしやすいバイナリ パーツ (イメージ ファイルや Microsoft Visual Basic for Applications (VBA) プロジェクトなど) も格納できます。バイナリ パーツを交換すると、多数の興味深い可能性が開けます。たとえば、バイナリ パーツを交換することで、Microsoft Office Visio ダイアグラムなどの OLE オブジェクト全体を置き換えることができます。この操作を手動で行っても価値はあまりありませんが、イメージをサーバーから自動的に更新する必要があるシナリオについて考えてください。この操作を行うツールの記述は、比較的簡単なタスクです。次の手順では、AnotherSampleWordDocument.docx ドキュメント内のイメージ バイナリ ファイルを別のイメージで交換します。

Office オープン XML 形式のドキュメント内のバイナリ パーツを交換するには

  1. 「Office オープン XML 形式のファイルを探索する」を使用して、SampleWordDocument.docx のドキュメント ファイルを展開します。

  2. word フォルダ、media フォルダの順にダブルクリックして、Eagle1.gif イメージ ファイルを見つけます。

  3. Eagle1.gif を右クリックし、[プレビュー] をクリックします。これはドキュメント内に現在表示されるイメージです。

  4. ダウンロード ファイル内の Eagle2.gif イメージを見つけ、Windows デスクトップにコピーします (または自分のイメージ ファイルで代用できます)。

  5. Windows デスクトップの Eagle2.gif イメージを右クリックし、[プレビュー] をクリックします。これは現在のイメージに置き換えられるイメージです。

  6. [プレビュー] ウィンドウを閉じ、Eagle2.gif を右クリックして、[名前の変更] をクリックし、ファイル名を Eagle1.gif に変更します。

  7. 名前を変更した Eagle1.gif を Windows デスクトップから media フォルダまでドラッグします。

  8. "Confirm File Replace" 警告メッセージが表示されたら、[はい] をクリックします。

  9. .zip ファイルが見つかるまで、ツール バーの戻る矢印または Up ボタンをクリックして、ドキュメント コンテナに移動します。

  10. ファイル名から .zip 拡張子を削除し、ファイルを Word 2007 で開きます。イメージが更新されていることに注意してください。

Word 2007 ドキュメントの document.xml パーツなどの一部のパーツは、Microsoft Office system ドキュメントで必須であり、ファイルが正しく機能するために存在している必要があります。ただし、多くのパーツは省略可能であり、パーツが表す機能がドキュメントに存在している場合にのみ存在します。つまり、その機能が不要になった場合、そのパーツおよび関連するリレーションシップを単に削除できます。プロジェクト コードを含む 2007 Office ドキュメントは、"マクロ有効" ドキュメントと呼ばれ、Word 2007 では .docm 拡張子、Excel 2007 では .xlsm 拡張子、PowerPoint 2007 では .pptm 拡張子が付いています。"マクロなし" のドキュメントとは異なり、マクロ有効ドキュメントはパーツ内にコードを格納します。パーツの種類は、ドキュメント内にあるコードの種類に依存します。たとえば、VBA コードを含むマクロ有効ドキュメントは、vbaProject.bin バイナリ パーツ内にデータを格納します。

他のプロジェクトの種類としては、Excel 4.0 スタイルのマクロ (XLM マクロ) を使用する Excel 2007 ブック、またはコマンド ボタンを含む PowerPoint 2007 プレゼンテーションなどがあります。これらの機能は独自の分離されたパーツ内にあるため、簡単に識別し削除できます。

次の手順では、簡単なマクロ有効ドキュメントを作成し、その機能をデモします。その後、ドキュメントおよび関連するリレーションシップから vbaProject.bin パーツを削除し、その影響を確認します。[ファイル] メニューの [名前を付けて保存] をクリックして、ファイルをマクロなしのファイル (.docx, .pptx、または .xlsx) として保存しても、マクロ有効ドキュメントのプロジェクト パーツを削除できることに注意してください。ただし、これには、ドキュメントを 2007 Office system アプリケーションで開く必要があります。次の手順のステップを使用すると、Office アプリケーションを使用せずにプロジェクトを削除できます。

Office オープン XML 形式のドキュメントから VBA プロジェクトを削除するには

  1. Word 2007 で、SampleWordDocument.docx を開きます。

  2. [開発者] タブの [コード] グループで、[Visual Basic] をクリックし、Visual Basic Editor を開きます。ALT+F11 キーを押しても、Visual Basic Editor を開くことができます。

    注意

    [開発者] タブが表示されていない場合は、すぐに追加できます。[Microsoft Office ボタン]、[Word のオプション] の順にクリックし、[基本設定] タブの [[開発] タブをリボンに表示する] オプションをクリックにします。

  3. Visual Basic Editor のコード ウィンドウに、次のステートメントを入力または貼り付けます。

    Sub SampleCode()
       Msgbox("Hello World")
    End Sub
    

    注意

    コード ウィンドウが表示されない場合は、[表示] メニューをクリックし [コード] をクリックすると、表示できます。

  4. [実行] メニューの [Sub/ユーザー フォームの実行] をクリックして、手順を実行します。F5 キーを押すこともできます。

  5. [OK] をクリックしてメッセージ ボックスを閉じ、Visual Basic Editor を閉じます。

    次に、ドキュメントをマクロ有効ドキュメントとして保存します。

  6. [Microsoft Office ボタン] をクリックし、[名前を付けて保存] をポイントして、[Word 文書] をクリックします。

  7. [ファイルの種類] ドロップダウン ボックスで [Word マクロ有効文書 (.docm)] を選択し、[保存] をクリックします。ドキュメントを閉じます。

  8. 「Office オープン XML 形式のファイルを探索する」を使用して、SampleWordDocument.docm のドキュメント ファイルを展開します。

  9. word フォルダをダブルクリックし、_rels フォルダをダブルクリックします。

  10. document.xml.rels を右クリックし、[プログラムから開く] をクリックして、メモ帳などのテキスト エディタを選択します。

    注意

    ファイルは読み取り専用として設定されている可能性があります。読み取り専用として設定されている場合は、ファイルを閉じ、ファイル名を右クリックして、[プロパティ] をクリックし、[読み取り専用] 属性チェック ボックスをオフにします。次に、ファイルを再度開きます。

  11. 次の XML タグを見つけ、削除します。

    <Relationship Id="rId1" Type="https://schemas.microsoft.com/office/2006/relationships/vbaProject" Target="vbaProject.bin"/>
    
  12. ファイルを保存して閉じます。

  13. document.xml.rels を右クリックし、[コピー] をクリックします。

  14. SampleWordDocument.docm.zip ファイルまで戻って、ファイルを開きます。

  15. word フォルダをダブルクリックします。

  16. vbaProject.bin を右クリックし、[削除] をクリックします。メッセージが表示されたら、[はい] をクリックして削除を確認します。

  17. _rels フォルダをダブルクリックします。

  18. 右クリックして、[貼り付け] をクリックします。

  19. "Confirm File Replace" 警告メッセージ (Windows Vista の場合は、"Copy and Replace" 警告メッセージ) が表示されたら、[はい] をクリックします。

  20. .zip ファイルが見つかるまで、ツール バーの戻る矢印または Up ボタンをクリックして、ドキュメント コンテナに移動します。

  21. SampleWordDocument.docm フォルダを右クリックし、[Delete] をクリックして削除します。メッセージが表示されたら、確認ダイアログ ボックスの [Yes] をクリックします。

  22. SampleWordDocument.docm.zip ファイル名から .zip 拡張子を削除します。メッセージが表示されたら、[Rename] 警告ダイアログ ボックスの [はい] をクリックし、ファイルを Word 2007 で開きます。

  23. ALT+F11 キーを押して、VBA プロジェクトを表示します。サブルーチンがないことに注意してください。

    注意

    同様の結果は、ファイル名拡張子を .docm から docx に変更しても実現できます。拡張子がマクロなしのファイルでは、コードを実行できません。

Office オープン XML 形式のドキュメントをプログラムで操作する

Office オープン XML 形式の重要な利点の 1 つに、カスタム ソリューションの無限の可能性があります。XML ファイルと ZIP ファイルを操作できるほとんどのプラットフォームのツールを使用して、ドキュメントのコンテンツにアクセスし変更できます。たとえば、マネージ コード付きの Microsoft Visual Studio (Microsoft Visual Basic .NET または C#) でサーバー側のアプリケーションを記述して、2007 Office system ドキュメントをプログラム的に生成できます。Microsoft .NET Framework の強力な XML クラス ライブラリを使用すると、Office オープン XML 形式のファイルにある XML ドキュメント パーツを操作できます。

ドキュメント パーツとリレーションシップを操作する 1 つの強力な方法は、Microsoft Windows ソフトウェア開発キット (SDK) に付属の System.IO.Packaging 名前空間を使用することです。System.IO.Packaging 名前空間については、この記事の後で詳細に説明します。

注意

Microsoft ダウンロード センターから Microsoft Pre-Release Software WinFX Runtime Components—Beta2 をダウンロードできます。

次の手順では、Word 2007 を使用せずにプログラムでドキュメント内の書式設定スタイルを変更するコンソール アプリケーションを開発します。プロジェクトでは、ドキュメントのスタイル パーツを別の Word 2007 ドキュメントから抽出したスタイル パーツと交換してこの操作を行います。結果として、対象のドキュメントに他のドキュメントから借用されたスタイルの "外観" が適用されます。

注意

話は変わりますが、ダウンロード可能なファイルとして、Office オープン XML 形式のファイルを操作できるいくつかのコード例があります。事前に作成されているコード例をダウンロードしたら、Microsoft Visual Studio 2005 のコード スニペット マネージャ機能 ([ツール] メニューで利用可能) を使用して、これらの例をプロジェクトに挿入できます。2007 Office System Sample: Open XML File Format Code Snippets for Visual Studio 2005 (英語) をダウンロードできます。

次の手順を実行して、ドキュメントの書式設定を変更します。

Office オープン XML 形式のドキュメントの書式設定スタイルを変更するには

  1. 最初に、更新するドキュメントを保持し、styles.xml パーツを保持するフォルダとサブフォルダを作成します。この演習では、フォルダに WordOpenXMLFormatSample という名前を付けます。このフォルダ内に、NewStylePart という名前のサブフォルダを追加します。

  2. SampleWordDocument.docx を WordOpenXMLFormatSample フォルダにコピーします。

  3. AnotherSampleWordDocument.docx ファイルに移動し、ファイル名の末尾に .zip ファイル名拡張子を追加して、ファイルを開きます。

  4. word フォルダの styles.xml パーツに移動し、パーツを右クリックして [コピー] をクリックします。

  5. WordOpenXMLFormatSample フォルダに移動し、NewStylePart サブフォルダに移動します。NewStylePart サブフォルダを右クリックし、[貼り付け] をクリックします。これで、フォルダに既定のスタイル パーツが付いた Word 2007 ドキュメントが格納され、サブフォルダに "ファンシー" と呼ばれるスタイルを持つこのドキュメントの styles.xml パーツが格納されます。

  6. Visual Studio 2005 を起動します。

  7. [ファイル] メニューの [新しいプロジェクト] をクリックします。

  8. [新しいプロジェクト] ダイアログ ボックスで、左側の [プロジェクトの種類] ツリー ビューから [他の言語] をクリックし、[Visual C#] を選択して、右側の [テンプレート] ツリー ビューから [コンソール アプリケーション] を選択します。

  9. [名前] ボックスで、このプロジェクトに StyleSwapper という名前を付け、[OK] をクリックします。Visual Studio によって、プロジェクトのすべてのファイルが作成され、これらのファイルがドライブ\Visual Studio projects\StyleSwapper などのプロジェクト名にちなんだ名前を持つディレクトリに格納されます。

    プロジェクトの正確な保存先を表示するか、その場所を変更するには、次の手順を実行します。

    1. [ツール] メニューの [オプション] をクリックします。

    2. [オプション] ダイアログ ボックスの [プロジェクトとソリューション] ツリー ビューをクリックし、[全般] タブをクリックします。

      この画面では、プロジェクトとテンプレートを保存する場所を指定し、他のオプションを設定できます。

    3. プロジェクトの保存場所をメモし、[OK] をクリックしてウィンドウを閉じます。

    プロジェクトを作成すると、Visual Studio によって、Properties、References、および Program.cs. の 3 つのコンテナを持つ新しいアプリケーションが自動的に作成されます。これらのコンテナは、ソリューション エクスプローラで表示できます。Visual Studio では、コードの大半を追加できる空のクラスも作成されます。

    注意

    Microsoft .NET Framework 3.0 (以前の名称は WinFX) には、System.IO.Packaging 名前空間が含まれています。この名前空間では、Visual Studio 2005 からプログラムを使用して 2007 Microsoft Office ドキュメントを簡単に操作できます。System.IO.Packaging 名前空間では、ドキュメント パーツの追加、コンテンツの取得と更新、または新しいリレーションシップの作成が可能になり、新しいドキュメントを作成したり、既存のドキュメントを変更したりできます。この名前空間の重要なメンバとしては、Package オブジェクト、PackagePart オブジェクト、PackageRelationship オブジェクトなどがあります。System.IO.Packaging 名前空間の詳細については、「System.IO.Packaging 名前空間」を参照してください。

    次に、プロジェクトから .NET Framework 3.0 への参照を追加します。

  10. [プロジェクト] メニューの [参照の追加] をクリックします。

  11. [参照] タブの [検索対象] ボックスで、WindowsBase.dll を検索します。この記事の発行日におけるこのファイルの場所は、ドライブ\Program Files\Reference Assemblies\Microsoft\WinFx\v3.0 となっています。

  12. WindowsBase.dll ファイルを選択し、[OK] をクリックします。ソリューション エクスプローラの [参照] をクリックして、参照が作成されていることを確認します。

  13. ソリューション エクスプローラで、Program.cs を右クリックし、[コードの表示] を選択します。

  14. namespace ステートメントの上にあるコード ウィンドウに、次のコードを入力します。

    using System.IO;
    using System.IO.Packaging;
    

    2007 Office system ドキュメントのコンテンツを操作するには、ドキュメントを開く必要があります。System.IO.Packaging 名前空間には、ドキュメントと同義の Package と呼ばれるトップレベル メンバがあります。Package オブジェクトを開いたら、その構造を検査し、そのパーツを操作できます。パッケージは、読み取り専用、書き込み専用、または読み取り/書き込みとして開くことができます。

  15. Class Program ステートメントの始め中かっこ ({) の後に、次のコード行を追加します。これらの行は、Word ドキュメントの場所とこのドキュメントに挿入する style.xml パーツの場所を含む変数を設定します。これらのステートメントでは、WordOpenXMLFormatSample フォルダがドライブ C に作成されていることを前提としています。

    private static String stylePath = @"C:\WordOpenXMLFormatSample\NewStylePart\styles.xml";
    private static String packagePath = @"C:\WordOpenXMLFormatSample\SampleWordDocument.docx.zip";
    

    注意

    @ 記号で始まる文字列は、verbatim 文字列リテラルと呼ばれます。このリテラルは、プログラム (String コンストラクタ) に、文字列をファイルの取得時に表示されるとおりに使用することを指示します。

  16. Main プロシージャは、プロジェクトの実行時に自動的に実行されます。Main の始め中かっこ ({) と終わり中かっこ (}) の間に、次の行を入力します。

    SwapStylePart(packagePath, stylePath);
    

    この行は、次に追加する SwapStylePart プロシージャを呼び出します。これは Word 2007 ドキュメントへのパスと styles.xml パーツへのパスを渡します。

  17. Main の終わり中かっこ (}) の直後の行に、次のプロシージャを追加します。

    static void SwapStylePart(String packagePath, String stylePath)
    {
    
    }
    

    次の手順では、SwapStylePart ルーチンに、Word ドキュメントを Read/Write アクセス権付きの Package オブジェクトとして開くコードを追加します。using ステートメントの使用方法に注意してください。この目的は、ステートメントの実行完了後に、Package オブジェクトを自動的に破棄し、使用しているメモリを解放することです。

  18. 次のコードを SwapStylePart ルーチンに入力します。

    using (Package package = Package.Open(packagePath, FileMode.Open,
      FileAccess.ReadWrite))
    {
    
    }
    

    2007 Office system ドキュメント パッケージ内の任意のパーツを操作するには、最初にそのパーツを見つける必要があります。特定のドキュメント パーツを参照するには、各パーツに固有の URI を使用します。

  19. using ステートメントの中かっこの間に次のステートメントを入力します。

    // Set the URI for the styles document part (/word/styles.xml).
    Uri uriPartTarget = new Uri("/word/styles.xml", UriKind.Relative);
    

    この記事の作成時には、System.IO.Packaging 名前空間では、既存のパーツのコピーまたは置き換えは許可されていません。パーツを交換するには、最初に既存のパーツを削除してから、同じ URI を持つ新しいパーツを作成する必要があります。パーツを削除しても、パーツのリレーションシップに影響がないことに注意してください。リレーションシップはそのままの状態で残り、新しいパーツに適用されます。

  20. 前の手順で追加した行の直後に次のコードを入力します。

    // Delete the existing document part (/word/styles.xml).
    package.DeletePart(uriPartTarget);
    

    新しいドキュメント パーツをパッケージに追加する場合にも、URI を使用する必要があります。この場合、同じ URI を再利用して、スタイル ドキュメント パーツを再作成します。パッケージの追加時には、パーツのコンテンツ タイプという 1 つの追加パラメータが必要となります。ドキュメントで現在使用されているコンテンツ タイプは、ドキュメント コンテナにある [Content_Types].xml パーツで見つけることができます。

  21. 前の手順で追加した行の後に次のコードを入力します。

    // Recreate a new document part for styles(/word/styles.xml).
    PackagePart packagePartReplacement = package.CreatePart(uriPartTarget, "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml");
    

    新しいスタイル パーツを作成したら、最後の手順は、元の styles.xml パーツの XML を新たに作成したパーツにコピーすることです。System.IO.Packaging 名前空間では、本来 XML ドキュメント内の XML を取り扱わないため, .NET Framework 内のコンテンツをコピーするには、Streams を使用します。

    次の手順では、外部スタイル パーツをストリームとして開き、新しいスタイル ドキュメント パーツに書き込むコードを追加します。ストリームをコピーするには、CopyStream ルーチンを呼び出し、コピー元ストリームとコピー先ストリームを渡します。

  22. 前の手順で追加した行の後に次のコードを入力します。

    using (FileStream fileStream = new FileStream(stylePath, FileMode.Open,
        FileAccess.Read))
    {
       // Load the new styles.xml using a stream.
       CopyStream(fileStream, packagePartReplacement.GetStream());
    }
    
  23. 次に、SwapStylePart ルーチンの終わり中かっこの後に、CopyStream ルーチンを追加します。

    private static void CopyStream(Stream source, Stream target)
    {
       const int bufSize = 0x1000;
       // const int bufSize = 1024;
       byte[] buf = new byte[bufSize];
       int bytesRead = 0;
       while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
       {
          target.Write(buf, 0, (int)bytesRead);
       }
       source.Close();
       target.Close();
    }
    

    このプロシージャは、読み込み時に元の styles.xml パーツのデータ ストリームが格納される、メモリ内のバッファのサイズ (バイト単位) を設定します。また、読み込む必要があるバイトがあっても、それらのバイトは新しい styles.xml パーツに書き込まれます。

    動作中のアプリケーションを表示するには、プロジェクトをビルドする必要があります。

  24. [ビルド] メニューの [StyleSwapper のビルド] をクリックします。

    注意

    ビルド中にエラーが発生した場合、最後のビルドを実行するかどうかを確認するダイアログ ボックスが表示されます。[いいえ] をクリックして、[エラー一覧] パネルに記述されているエラーを確認します。[エラー一覧] が表示されない場合、[表示] メニューの [エラー一覧] をクリックします。

    エラーがなければ、コードを実行できます。ただし、まず現在のドキュメントを表示します。

  25. Word 2007 で、SampleWordDocument.docx を開きます。

  26. Word 2007 を閉じ、SampleWordDocument.docx ファイル名の末尾に .zip 拡張子を追加します。

  27. F5 キーを押します。Windows コンソールがいったん表示されてからすぐに消えます。これはコンソール アプリケーションであるため、短時間表示される Windows コンソール以外のユーザー インターフェイスはありません。

  28. ファイル名から .zip 拡張子を削除し、Word 2007 でそのファイルを再度開きます。ドキュメントのスタイルが、Word 2007 をまったく使用せずに "ファンシー" スタイルに変更されていることに注意してください。

次の演習では、カスタム アプリケーションを使用して、Word 2007 なしで Office オープン XML 形式のファイル上で一括操作を実行する方法を示します。この演習では、フォルダおよびサブフォルダ (オプション) で特定の条件に一致するファイルを検索するマネージ アプリケーションを作成します。このアプリケーションは、これらのファイル内のドキュメント パーツで用語の出現を調べ、その用語を含むファイルの一覧を作成します。このアプリケーションを使用して、特定のクライアント名または特定の製品名を含むドキュメントを識別することも考えられます。ある用語を別の用語で置き換えるロジックをこのアプリケーションに追加して、アプリケーションを使用せずに Word 2007 の検索と置換機能を基本的に複製することもできます。

Office オープン XML 形式のファイルのグループでキーワードを検索するには

  1. Visual Studio 2005 を起動します。

  2. [ファイル] メニューの [新しいプロジェクト] をクリックします。

  3. [新しいプロジェクト] ダイアログ ボックスで、左側の [プロジェクトの種類] ツリー ビューから [Visual C#] を選択します。次に、[Windows アプリケーション] を選択し、プロジェクトの名前を KeywordSearch に変更して、[OK] をクリックします。Visual Studio によって、プロジェクトのすべてのファイルが作成されます。

  4. ソリューション エクスプローラで、Form1.cs を右クリックし、[ビュー デザイナ] を選択します。

  5. [Form1.cs [デザイン]] タブで、次のコントロールをフォームに追加し、フォームが図 5 に示すような外観になるようにプロパティを設定します。

    図 5. KeywordSearch フォーム

    KeywordSearch フォーム

    表 2. Office オープン XML 形式のファイルの Keyword Search フォーム用のコントロールの一覧

    種類

    プロパティ

    Label

    テキスト : 検索ディレクトリ

    TextBox

    名前 : txtPath

    テキスト : C:\WordDocuments

    これは検索が開始される既定のディレクトリであることに注意してください。

    Label

    テキスト : 検索パターン

    ComboBox

    名前 : cboMask

    アイテム (コレクション): *.docx

    *.docm

    テキスト : *.docx

    CheckBox

    名前 : ckbSubfolders

    テキスト : サブフォルダを含む

    Label

    テキスト : 検索用語

    TextBox

    名前 : txtTerm

    Button

    名前 : btnSearch

    テキスト : 検索

    Button

    名前 : btnClose

    テキスト : 閉じる

    Label

    テキスト : 結果

    ListBox

    名前 : lbxResults

  6. ソリューション エクスプローラで、Form1.cs を右クリックし、[コードの表示] を選択します。

  7. コード ウィンドウで、既存の using ステートメントの下に次のステートメントを追加します。

    using System.Xml;
    using System.IO;
    using System.IO.Packaging;
    

    System.IO.Packaging 名前空間を使用するには, .NET Framework 3.0 SDK (以前の名称は WinFX) で利用可能な WindowsBase.dll ライブラリに参照を追加する必要があります。

  8. [プロジェクト] メニューの [参照の追加] をクリックします。

  9. [参照] タブの [検索対象] ボックスで、WindowsBase.dll ファイル名を検索します。この記事の発行日におけるこのファイルの場所は、ドライブ\Program Files\Reference Assemblies\Microsoft\WinFx\v3.0 となっています。

  10. [OK] をクリックします。

  11. public partial class Form1 : Form の始め中かっこの直後に、次のクラス変数 (フィールドとも呼ばれる) を追加します。

    FileInfo[] tempfiles;
    List<FileInfo> files = new List<FileInfo>();
    

    次に、Search ボタンにコードを追加します。

  12. [Form1.cs [Design]] タブで、[検索] ボタンをダブルクリックして、このボタンの Click イベントを追加します。

  13. btnSearch_Click プロシージャの中かっこの間に、次のコードを追加します。

    Boolean match = false;
    
    // Ensure that the user added a search term.
    if (txtTerm.Text == "")
    {
       MessageBox.Show("Don't forget the search term.");
    }
    
    List<FileInfo> returnedFiles;
    // Get the starting directory.
    DirectoryInfo dir = new DirectoryInfo(txtPath.Text);
    
    // Get the list of files.
    returnedFiles = GetDirFiles(dir);
    
    // Loop through the file list.
    foreach (FileInfo file in returnedFiles)
    {
       match = GetDocPart(file);
    }
    if (!match)
    {
       // No matching files were found.
       lbxResults.Items.Add("No matches.");
    }
    

    このコードでは、検索で一致するものが見つかったかどうかを示すために、Boolean 変数が宣言されています。次に、テキスト ボックスが空白の場合、ユーザーに検索用語の入力が求められます。フォーム上の他のテキスト ボックスには、すべて既定値が設定されています。次に、検索から返されるファイルを格納するために、List クラスが定義されています。List クラスには、サイズを動的に増やせる配列が用意されています。dirs 変数は、検索が開始されるディレクトリをポイントします。次に、ディレクトリ内のファイルの一覧を返す GetDirsFiles プロシージャが呼び出されます。その後、返された一連のファイルがループ処理され、GetDocPart プロシージャが呼び出されて、各ファイルで検索用語が調べられます。一致するものがない場合、該当するメッセージがリスト ボックスに追加されます。

  14. GetDirFiles プロシージャを追加します。

    public List<FileInfo> GetDirFiles(DirectoryInfo dir)
    {
       // Get all files for the current directory.
       Object selectedItem = cboMask.SelectedItem;
    
       tempfiles = dir.GetFiles(selectedItem.ToString());
    
       // Add these files to the returned file list.
       foreach (FileInfo file1 in tempfiles)
       {
          files.Add(file1);
       }
    
       // Search subfolders if requested.
       if (ckbSubfolders.Checked)
       {
          // Get subfolders for the current directory.
          DirectoryInfo[] dirs = dir.GetDirectories("*.*");
    
          foreach (DirectoryInfo directory in dirs)
          {
             GetDirFiles(directory);
          }
        }
        return files;
    }
    
    

    このプロシージャは、selectedItem 変数をコンボ ボックスに表示される検索パターンと等しく設定します。次に、現在のディレクトリで GetFiles メソッドが呼び出され、検索パターンに一致するすべてのファイルが返されます。返されたファイルは、ファイルの一覧に追加されます。ユーザーが [Include Subfolders] チェック ボックスをオンにした場合、各サブフォルダの名前を使用して GetDirFiles プロシージャが再帰的に呼び出され、現在のディレクトリのサブフォルダが検索されます。最後に、ファイルの一覧が呼び出し元の (btnSearch_Click) プロシージャに返されます。

  15. 次のコードを GetDirFiles プロシージャの後に追加します。

    private Boolean GetDocPart(FileInfo file)
    {
       // Retrieve the start part for the input file.
    
       Boolean fileFound = false;
       const String documentRelationshipType = "http://schemas.liquid-technologies.com/OfficeOpenXML/2006/default.html";
       const String dcPropertiesSchema = "http://purl.org/dc/elements/1.1/";
    
       // Open the package with read access.
       using (Package myPackage = Package.Open(file.DirectoryName + "\\" + file.Name, FileMode.Open, FileAccess.Read))
       {
          // Get the main document part (document.xml).
          foreach (PackageRelationship relationship in myPackage.GetRelationshipsByType(documentRelationshipType))
          {
             //  There should be only one document part in the package. 
             Uri documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), relationship.TargetUri);
             PackagePart documentPart = myPackage.GetPart(documentUri);
    
             NameTable nt = new NameTable();
             XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
             nsmgr.AddNamespace("w", dcPropertiesSchema);
    
             XmlDocument doc = new XmlDocument(nt);
             doc.Load(documentPart.GetStream());
    
             if (doc.OuterXml.IndexOf(txtTerm.Text) >= 1)
             {
                lbxResults.Items.Add(file.DirectoryName + "\\" + file.Name);
                fileFound = true;
             }
    
    
             // There is only one document part, so exit the loop.
             break;
           }
         }
         if (lbxResults.Items.Count >0)
         {
            return true;
         }
         else
         {
            return false;
         }
    }
    

    このプロシージャは、最初に変数をそれぞれ、ドキュメント リレーションシップの種類に対応した名前空間およびドキュメント プロパティのスキーマと等しく設定します。次に、ドキュメントが Package オブジェクトとして開かれます。System.IO.Packaging 名前空間を経由すると、他のパーツとのリレーションシップ (リレーションシップ パーツに定義されている) およびパーツへの階層パスを含む URI を使用して、パッケージのさまざまなパーツにアクセスできます。グラフィック パーツ用の URI の例としては、\word\media\picture.jpg があります。2007 Microsoft Office system ドキュメント内の特定のドキュメント パーツに対する URI を知っている場合、そのパーツに直接アクセス、作成、または削除できます。GetDocPart プロシージャでは、Package オブジェクトの GetPart メソッドを呼び出し、パーツの URI を渡すことで、document.xml パーツが返されます。

    次に、XmlDocument オブジェクトが、異なる名前空間に対する 1 つ以上の参照を含む XML ファイルをポイントします。すべての XML ファイルと同様に、XML パーサーは、プレフィックスとして名前空間修飾子が付いた名前を使用して、ドキュメント内のさまざまな要素と属性にアクセスします。

    注意

    修飾子がない要素名は、既定の名前空間の一部と見なされます。

    これらの名前空間修飾子は、実行時に名前空間参照に解決する必要があります。このタスクを容易で一貫性のあるものにするために, .NET Framework には XmlNamespaceManager クラスが含まれています。このクラスには、さまざまな名前空間管理ツールが用意されています。これらの 1 つに、NameTable クラスがあります。NameTable クラスは、内部に属性名と要素名を格納します。XML ドキュメント内に要素名や属性名が複数回出現する場合、それは NameTable 内に一度だけ格納されます。名前空間修飾子が出現した場合、名前テーブル内の文字列を使用して解決できます。

    次のステートメントでは、XmlDocument オブジェクトが作成され、ドキュメント パーツのコンテンツが自動的に入力されます。次に、オブジェクトのコンテンツで検索用語がスキャンされます。C# IndexOf メソッドは、Visual Basic InStr メソッドのコンパニオンであることに注意してください。検索用語が見つかった場合、ディレクトリとファイル名がフォームのリスト ボックスに追加され、プロシージャから True が返されます。それ以外の場合、一致は見つからず、プロシージャから False が返されます。

  16. 最後に Form1 Designer で、閉じるボタンをダブルクリックし、次のステートメントをプロシージャに追加します。

    Close();
    

    プログラムをテストするには

  17. ドライブ C またはお好みの場所に、WordDocuments という名前のフォルダを作成します。

  18. SampleWordDocument.docx ドキュメントおよび AnotherSampleWordDocument.docx ドキュメントの各コピーを、WordDocuments フォルダに貼り付けます。

  19. Word 2007 を起動し、新しいドキュメントを作成します。

  20. 何らかのテキスト (ただし、Eagle という用語は含めない) を追加し、ドキュメントを WordDocuments フォルダ内の SearchSampleDocument.docx として保存します。

  21. F5 キーを押して、プロジェクトを実行します。

  22. フォームの [Search Directory] ボックスに, .docx ドキュメントの場所を入力します。

  23. [Search Term] ボックスに、Eagle という用語を入力し、[Search] をクリックします。

    Figure 6 に示すように、フォームのリスト ボックスに "Eagle" という用語を含む 2 つのドキュメントが表示されます。SearchSampleDocument.docx ドキュメントは表示されません。

    図 6. キーワード検索の実行結果

    キーワード検索の実行結果

  24. フォームを閉じます。

Word 2007 を使用せずにドキュメントを検索するために必要なコードはこれだけです。追加できる検索精度の向上例としては、検索用語のドキュメントあたりの出現回数のカウント、置換機能の追加、他のパーツの検索などがあります。

まとめ

この記事では、Office オープン XML 形式のファイル構造について理解しました。ファイル形式を調べ、標準ベースの XML テクノロジと ZIP テクノロジを使用した 2007 Microsoft Office system ドキュメントへの簡単なアクセスおよび編集方法をデモしました。Office オープン XML 形式のファイルを手動およびプログラムで操作する方法についても学習しました。この知識によって、自分の組織用のカスタム ソリューションを作成する基礎が確立されます。

追加情報

詳細については、以下のリソースを参照してください。