次の方法で共有


Open XML SDK 2.0 を使用して Excel 2010 ブックのすべての名前付き範囲の辞書を取得する

Office Visual How To

概要:  Microsoft Excel にドキュメントを読み込まずに、Open XML SDK 2.0 の厳密に型指定されたクラスを使用して、Excel ブック内のすべての定義された名前とその範囲が含まれる辞書を取得します。

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

公開:   2010 年 10 月

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

概要

Open XML ファイル形式を使用して、Excel ブック内の定義された名前の情報を取得できますが、この処理は少し複雑です。Open XML SDK 2.0 では、Open XML ファイル形式へのアクセスを簡素化する、厳密に型指定されたクラスが追加されています。この SDK を使用すると、各ブック内の定義された名前のリストを簡単に取得できます。この Visual How To のサンプル コードでは、SDK を使用してこの処理を行う方法を示します。

コード化する

この Visual How To のサンプルには、Excel 2007 (またはそれ以降) のドキュメント内の定義された各名前に関する情報が含まれる辞書を取得するために必要なコードが含まれています。この辞書内では、各アイテムのキーに範囲の名前が含まれ、値に範囲自体を表す文字列が含まれます。たとえば、図 1 は、サンプル ブックから取得した辞書の内容をループ処理した結果を示しています。以下の各セクションで、コードの内容を解説します。

図 1. サンプル コードを実行すると表示される辞書の内容

コマンド ライン

参照のセットアップ

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

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

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

また、コード ファイルの先頭に次の using ステートメントまたは Imports ステートメントを追加してください。

Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

プロシージャの確認

XLGetDefinedNames プロシージャにはパラメーターが 1 つあり、辞書の取得元となるドキュメントの名前 (文字列) を示します。このプロシージャは、指定されたブック内の定義された名前に関する情報が含まれる辞書のインスタンスを返し、定義された名前がない場合は空の辞書を返します。

Public Function XLGetDefinedNames(
  ByVal fileName As String) As Dictionary(Of String, String)
public static Dictionary<String, String> 
  XLGetDefinedNames(String fileName)

このプロシージャは、指定されたブックを調べて、定義された名前が含まれているパーツを探します。そのようなパーツがあった場合、そのパーツの内容をすべて反復処理し、定義された各名前の名前と値を辞書に追加して返します。サンプルの呼び出し側コードでは、返された辞書を反復処理して、各アイテムのキーと値を表示します。

Dim result = XLGetDefinedNames("C:\temp\definednames.xlsx")
For Each dn In result
  Console.WriteLine("{0}: {1}", dn.Key, dn.Value)
Next
var result = XLGetDefinedNames(@"C:\temp\definednames.xlsx");
foreach (var dn in result)
  Console.WriteLine("{0} {1}", dn.Key, dn.Value);

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

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

Dim returnValue As New Dictionary(Of String, String)
' Code removed here…
Return returnValue
var returnValue = new Dictionary<String, String>();
// Code removed here…
return returnValue;

次に、SpreadsheetDocument.Open メソッドを使用して、(最後のパラメーターを false にして) 読み取り専用アクセスでブックを開きます。開いたブックの WorkbookPart プロパティを使用して、メインのブック パーツ内を移動します。この参照を wbPart という名前の変数に保存します。

Using document As SpreadsheetDocument = 
  SpreadsheetDocument.Open(fileName, False)
  Dim wbPart As WorkbookPart = document.WorkbookPart
  ' Code removed here…
End Using
using (SpreadsheetDocument document = 
  SpreadsheetDocument.Open(fileName, false))
{
  var wbPart = document.WorkbookPart;
  // Code removed here.
}

定義された名前の取得

ブック パーツを取得したら、次の手順は単純です。wbPart 変数の Workbook プロパティを使用して、Open XML SDK 2.0 が提供する DefinedNames コレクションを取得します。このプロパティは、ブックに含まれるすべての定義された名前のコレクションを返します。このプロパティから null 以外の値が返された場合、コレクションを反復処理し、各名前付きパーツに関する情報を取得し、定義された名前ごとにキー (名前) と値 (範囲記述) を辞書に追加します。

Dim definedNames = wbPart.Workbook.DefinedNames
If definedNames IsNot Nothing Then
  For Each dn As DefinedName In definedNames
    returnValue.Add(dn.Name.Value, dn.Text)
  Next
End If
DefinedNames definedNames = wbPart.Workbook.DefinedNames;
if (definedNames != null)
{
  foreach (DefinedName dn in definedNames)
    returnValue.Add(dn.Name.Value, dn.Text);
}

サンプル プロシージャ

サンプル プロシージャ全体を次のコード例に示します。

Public Function XLGetDefinedNames(
  ByVal fileName As String) As Dictionary(Of String, String)

  ' Given a workbook name, return a dictionary of defined names.
  ' The pairs include the range name and a string 
  ' representing the range.

  Dim returnValue As New Dictionary(Of String, String)
  Using document As SpreadsheetDocument =
    SpreadsheetDocument.Open(fileName, False)
    Dim wbPart As WorkbookPart = document.WorkbookPart

    Dim definedNames = wbPart.Workbook.DefinedNames
    If definedNames IsNot Nothing Then
      For Each dn As DefinedName In definedNames
        returnValue.Add(dn.Name.Value, dn.Text)
      Next
    End If
  End Using
  Return returnValue
End Function
public static Dictionary<String, String> 
  XLGetDefinedNames(String fileName)
{
  // Given a workbook name, return a dictionary of defined names.
  // The pairs include the range name and a string 
  // representing the range.

  var returnValue = new Dictionary<String, String>();
    using (SpreadsheetDocument document = 
    SpreadsheetDocument.Open(fileName, false))
  {
    var wbPart = document.WorkbookPart;
    DefinedNames definedNames = wbPart.Workbook.DefinedNames;
    if (definedNames != null)
    {
      foreach (DefinedName dn in definedNames)
        returnValue.Add(dn.Name.Value, dn.Text);
    }
  }
  return returnValue;
}
手順

この Visual How To のサンプルには、Excel ブック内の定義された名前に関する情報が含まれる辞書を取得するコードが含まれています。このサンプルを使用するには、「関連情報」のリンクから入手できる Open XML SDK 2.0 をインストールする必要があります。このサンプルでは、Open XML SDK 2.0 用コード スニペットに含まれているコードに変更を加えたコードも使用しています。「関連情報」には、スニペット全体へのリンクも記載されていますが、スニペットをダウンロードしてインストールしなくても、サンプルを使用することはできます。

サンプル コードの内容を理解するには、Open XML SDK 2.0 に付属の Microsoft Office 用 Open XML SDK 2.0 Productivity Tool を使用してブックの内容を調べると役立ちます。図 2 は、複数の定義された名前が含まれるサンプル ブックをこのツールで開いた状態を示しています。サンプル コードでは、ブック パーツへの参照を取得し、そのパーツ内の definedNames 要素を検出します。この要素には、ブック内の定義された名前ごとに 1 つの子要素が含まれます。

図 2. サンプル ブックを開き、definedNames 要素を探す

Open XML SDK 2.0 生産性ツール

Open XML SDK 2.0 では、ブックの DefinedNames プロパティを使用することによって、定義された名前のコレクションが返されます。SDK を使用しなくても同じ情報を取得することはできますが、SDK の厳密に型指定されたメンバーを使用する方が簡単です。

このサンプル アプリケーションで紹介したプロパティとメソッドは、ブックに関する情報を取得するときに使用できる Open XML SDK 2.0 のプロパティとメソッドの一部に過ぎません。詳細については、Open XML SDK 2.0 Productivity Tool に付属のドキュメントを参照してください。アプリケーション ウィンドウの左下隅にある [Open XML SDK ドキュメント] タブをクリックし、目的のクラスを探してください。ここで解説したサンプルとドキュメントを参考に、サンプル アプリケーションを適切に変更できます。

ビデオ

ビデオを見る

ビデオを見る (英語) | 長さ: 00:06:04

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

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

関連情報

著者について
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 年) の共著者でもあります。