次の方法で共有


Open XML SDK 2.0 を使用して Word 2010 ドキュメントからスタイルを抽出する

Office Visual How To

概要:  ドキュメントを Word に読み込むことなく、Open XML SDK 2.0 の厳密に型指定されたクラスを使用して、Microsoft Word ドキュメントの styles パーツまたは stylesWithEffects パーツを含む XDocument インスタンスを取得します。

適用対象: Excel 2010 | Office 2010 | Office client | Open XML | PowerPoint 2010 | VBA | Word 2010

公開: 2011 年 2 月

提供元: Ken Getz、MCW Technologies, LLC (英語)

概要

Open XML ファイル形式を使用すると、Microsoft Word ドキュメントからコンテンツのブロックを取得できますが、そのためには若干の作業が必要です。Open XML SDK 2.0 で追加される厳密に型指定されたクラスを使用すると、Open XML ファイル形式へのアクセスが簡単になります。SDK を使用すると、たとえばドキュメントの styles または stylesWithEffects パーツを含む XDocument インスタンスを簡単に取得できるようになります。XML コンテンツを利用すれば、情報をアーカイブしたり、変更および再適用したり、新しいドキュメントに適用したりできます。この Visual How To に含まれるコード サンプルでは、SDK を使用して styles または stylesWithEffects パーツを取得する方法を示します。新しいドキュメントへのスタイルの適用は、このコード サンプルには含まれません。

コード化する

この Visual How To で提供されているサンプルには、Word 2007 または Word 2010 ドキュメントの styles または stylesWithEffects パーツを含む XDocument インスタンスを取得するために必要なコードが含まれます。以下のセクションでは、このコードについて詳しく説明します。Word 2007 で作成されるドキュメントには、styles パーツが 1 つだけ存在します。Word 2010 では第 2 の stylesWithEffects パーツが追加されます。Word 2010 から Word 2007 またはその逆のドキュメントの引き継ぎに対応するため、Word 2010 では元のスタイル パーツと新しいスタイル パーツの両方が保持されています。Open XML の仕様では、Microsoft Word は認識できないパーツを無視する必要があります。Word 2007 は、Word 2010 がドキュメントに追加する stylesWithEffects パーツを認識しません。styles または stylesWithEffects パーツの取得結果は、アプリケーションで解釈する必要があります。

参照のセットアップ

Open XML SDK 2.0 のコードを使用するには、プロジェクトにいくつかの参照を追加する必要があります。サンプル プロジェクトには既にこれらの参照が含まれていますが、独自のコードでは次のアセンブリを明示的に参照する必要があります。

  • WindowsBase - 作成するプロジェクトの種類によっては、この参照がユーザーのために設定されている場合があります。

  • DocumentFormat.OpenXml - Open XML SDK 2.0 によってインストールされます。

また、次の using/Imports ステートメントをコード ファイルの先頭に追加する必要があります。

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

プロシージャの確認

WDExtractStyles プロシージャは 2 つのパラメーターを受け取ります。第 1 のパラメーターには、変更するファイルへのパスを示す文字列が含まれます。第 2 のパラメーターは、styles パーツと新しい stylesWithEffects パーツのどちらを取得するのかを示します (基本的に、Word 2010 ドキュメントの場合は、このプロシージャを 2 回呼び出して、それぞれのパーツを取得する必要があります)。このプロシージャは、要求された完全な styles または stylesWithEffects パーツが格納されている XDocument インスタンスと、ドキュメントのすべてのスタイル情報を返します (または、要求されたパーツが存在しない場合は null 参照)。

Public Function WDExtractStyles(
  ByVal fileName As String,
  Optional ByVal getStylesWithEffectsPart As Boolean = True) 
  As XDocument
Public static XDocument WDExtractStyles(
  string fileName, 
  bool getStylesWithEffectsPart = true)

このプロシージャは、指定されたドキュメントを調べて、指定された styles または stylesWithEffects パーツを検索します。パーツが存在する場合、プロシージャはそれを XDocument インスタンスとして返します。プロシージャを呼び出すには、コード例で示されているようにパラメーター値を渡します。サンプル コードを実行する前に、デモ用にサンプルで変更されるスタイルをいくつか含む C:\temp\StylesFrom.docx という名前のドキュメントを用意しておく必要があります。

Dim styles = WDExtractStyles("C:\Temp\StylesFrom.docx", True)
If styles IsNot Nothing Then
  Console.WriteLine(styles.ToString())
End If
var styles = WDExtractStyles(@"C:\temp\StylesFrom.docx", true);
if (styles != null)
  Console.WriteLine(styles.ToString());

ドキュメントへのアクセス

コードでは、最初に、プロシージャが終了する前に返す styles という名前の変数を作成します。

Dim styles As XDocument = Nothing
' Code removed here…
Return styles
XDocument styles = null;
// Code removed here…
return styles;

次に、WordprocessingDocument.Open メソッドを使用し、読み取り専用アクセスを指定して (最後の false パラメーター)、ドキュメントを開きます。ドキュメントを開いたら、MainDocumentPart プロパティを使用してメイン ドキュメントに移動し、styles パーツの参照を保持するために stylesPart という名前の変数を準備します。

Using document = WordprocessingDocument.Open(fileName, False)
  Dim docPart = document.MainDocumentPart
  Dim stylesPart As StylesPart = Nothing
  ' Code removed here…
End Using
using (var document = WordprocessingDocument.Open(fileName, false))
{
  var docPart = document.MainDocumentPart;

  var stylesPart = null;
  // Code removed here…
}

適切なスタイル パーツの検索

次に、setStylesWithEffectsPart Boolean パラメーターを使用して、要求されたスタイル パーツの参照を取得します。この値を基にして、コードは docPart 変数の特定のプロパティを取得し、stylesPart 変数にそれを格納します。

If getStylesWithEffectsPart Then
  stylesPart = docPart.StylesWithEffectsPart
Else
  stylesPart = docPart.StyleDefinitionsPart
End If
if (getStylesWithEffectsPart)
  stylesPart = docPart.StylesWithEffectsPart;
else
  stylesPart = docPart.StyleDefinitionsPart;

パーツの内容の取得

要求されたスタイル パーツが存在する場合は、パーツのすべての内容を XDocument インスタンスで返す必要があります。各パーツで提供されている GetStream メソッドは、Stream を返します。コードでは、Stream インスタンスを XmlNodeReader.Create メソッドに渡してから、XDocument.Load メソッドを呼び出し、XmlNodeReader をパラメーターとして渡します。この一連の手順は、XDocuments と Open XML パーツを使用するときに共通のものです。よく目にするはずです。

If stylesPart IsNot Nothing Then
  Using reader = XmlNodeReader.Create(
    stylesPart.GetStream(FileMode.Open, FileAccess.Read))
    ' Create the XDocument:
    styles = XDocument.Load(reader)
  End Using
End If
if (stylesPart != null)
{
  using (var reader = XmlNodeReader.Create(
    stylesPart.GetStream(FileMode.Open, FileAccess.Read)))
  {
    // Create the XDocument:
    styles = XDocument.Load(reader);
  }
}

サンプル プロシージャ

次のコード例には、完全なサンプル プロシージャが含まれています。

Public Function WDExtractStyles(
  ByVal fileName As String,
  Optional ByVal getStylesWithEffectsPart As Boolean = True) 
  As XDocument

  Dim styles As XDocument = Nothing

  Using document = WordprocessingDocument.Open(fileName, False)
    Dim docPart = document.MainDocumentPart
    Dim stylesPart As StylesPart = Nothing

    If getStylesWithEffectsPart Then
      stylesPart = docPart.StylesWithEffectsPart
    Else
      stylesPart = docPart.StyleDefinitionsPart
    End If
    If stylesPart IsNot Nothing Then
      Using reader = XmlNodeReader.Create(
        stylesPart.GetStream(FileMode.Open, FileAccess.Read))
        ' Create the XDocument:
        styles = XDocument.Load(reader)
      End Using
    End If
  End Using
  Return styles
End Function
public static XDocument WDExtractStyles(
  string fileName, 
  bool getStylesWithEffectsPart = true)
{
  XDocument styles = null;
 
  using (var document = WordprocessingDocument.Open(fileName, false))
  {
    var docPart = document.MainDocumentPart;
 
    StylesPart stylesPart = null;
    if (getStylesWithEffectsPart)
      stylesPart = docPart.StylesWithEffectsPart;
    else
      stylesPart = docPart.StyleDefinitionsPart;
 
    if (stylesPart != null)
    {
      using (var reader = XmlNodeReader.Create(
        stylesPart.GetStream(FileMode.Open, FileAccess.Read)))
      {
        // Create the XDocument:
        styles = XDocument.Load(reader);
      }
    }
  }
  return styles;
}
手順

この Visual How To に含まれるサンプルでは、Word ドキュメントから styles パーツまたは stylesWithEffects パーツを取得するコードが示されています。サンプルを使用するには、「関連情報」のリンクから入手できる Open XML SDK 2.0 をインストールする必要があります。また、このサンプルでは、Open XML SDK 2.0 に対するコード スニペットのセットの一部として含まれるコードの変更バージョンを使用します。「関連情報」セクションにはスニペット全体のリンクも含まれますが、スニペットをダウンロードしてインストールしなくてもサンプルを使用できます。

サンプルでは、ドキュメントの構造を変更するときに使用できる Open XML SDK 2.0 で提供されているプロパティとメソッドのうちの一部のみが紹介されています。詳細については、Open XML SDK 2.0 生産性ツールに付属するドキュメントを参照してください。アプリケーション ウィンドウの左下隅の [Open XML SDK Documentation] タブをクリックし、目的のクラスを検索します。どのドキュメントにもコード例は含まれませんが、ここで示したサンプルとドキュメントを使用すれば、サンプル アプリケーションを問題なく変更できるはずです。

ビデオ

ビデオを見る

ビデオを見る (英語) | 所要時間: 00:07:52

クリックしてコードを取得

コードを取得する (英語)

関連情報

著者について

Ken Getz 氏は、MCW Technologies のシニア コンサルタント。『ASP.NET Developers Jumpstart』(Addison-Wesley 刊、2002 年)、『Access Developer's Handbook』(Sybex 刊、2001 年)、および『VBA Developer's Handbook, 2nd Edition』(Sybex 刊、2001 年) の共著者でもあります。