スプレッドシート ドキュメントのセルの値を取得する
適用対象: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010
この記事の内容
GetCellValue メソッド
GetCellValue サンプル メソッドの呼び出し
コードの動作のしくみ
セルへのアクセス
値の取得
サンプル コード
このトピックでは、Open XML SDK 2.0 for Microsoft Office のクラスを使用して、スプレッドシート ドキュメント内のセルの値をプログラムによって取得する方法を説明します。このトピックでは、この作業を説明するために例 GetCellValue メソッドを使用しています。
このトピックのサンプル コードを使用するには、Open XML SDK 2.0 をインストールする必要があります。プロジェクトで次のアセンブリを明示的に参照する必要があります。
WindowsBase
DocumentFormat.OpenXml (Open XML SDK によってインストールされます)
このトピックのコードをコンパイルするには、次の using ディレクティブまたは Imports ステートメントも使用する必要があります。
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet
GetCellValue メソッド
GetCellValue メソッドを使用してブック内のセルの値を取得できます。このメソッドには次の 3 つのパラメーターが必要です。
調べるドキュメントの名前を含む文字列。
調べるシートの名前を含む文字列。
値を取得するセル番地 (A1、B12 など) を含む文字列。
このメソッドは、指定されたセルの値が見つかると、その値を返します。次のコード例は、メソッド シグネチャを示しています。
public static string GetCellValue(string fileName,
string sheetName,
string addressName)
Public Function GetCellValue(ByVal fileName As String,
ByVal sheetName As String,
ByVal addressName As String) As String
GetCellValue サンプル メソッドの呼び出し
GetCellValue メソッドを呼び出すには、次のコード例に示すように、ファイル名、シート名、およびセル番地を渡します。
const string fileName =
@"C:\users\public\documents\RetrieveCellValue.xlsx";
// Retrieve the value in cell A1.
string value = GetCellValue(fileName, "Sheet1", "A1");
Console.WriteLine(value);
// Retrieve the date value in cell A2.
value = GetCellValue(fileName, "Sheet1", "A2");
Console.WriteLine(
DateTime.FromOADate(double.Parse(value)).ToShortDateString());
Const fileName As String =
"C:\Users\Public\Documents\RetrieveCellValue.xlsx"
' Retrieve the value in cell A1.
Dim value As String =
GetCellValue(fileName, "Sheet1", "A1")
Console.WriteLine(value)
' Retrieve the date value in cell A2.
value = GetCellValue(fileName, "Sheet1", "A2")
Console.WriteLine(
DateTime.FromOADate(Double.Parse(value)).ToShortDateString())
コードの動作のしくみ
コードでは、まず、戻り値を格納する変数を作成し、その変数を null に初期化します。
string value = null;
Dim value as String = Nothing
セルへのアクセス
次に、Open メソッドを使用してドキュメントを開きます。このとき、最後に false パラメーターを指定し、ドキュメントを読み取り専用で開きます。さらに、ドキュメントの WorkbookPart プロパティを使用して、ブック パーツへの参照を取得します。
// Open the spreadsheet document for read-only access.
using (SpreadsheetDocument document =
SpreadsheetDocument.Open(fileName, false))
{
// Retrieve a reference to the workbook part.
WorkbookPart wbPart = document.WorkbookPart;
' Open the spreadsheet document for read-only access.
Using document As SpreadsheetDocument =
SpreadsheetDocument.Open(fileName, False)
' Retrieve a reference to the workbook part.
Dim wbPart As WorkbookPart = document.WorkbookPart
要求されたセルを見つけるために、まず、シート名を基に、シートへの参照を取得する必要があります。そのためには、ブック パーツのブック要素のシートの種類の子をすべて検索して、見つかった各シートの Name プロパティを調べる必要があります。この検索では、ブックの関係を調べます。ワークシート パーツを実際に検出するわけではありません。シートの名前、Id などの情報を含んでいる Sheet への参照を検出します。この検索は、次のコード例に示すように、LINQ クエリを使用すると最も簡単に実行できます。
// Find the sheet with the supplied name, and then use that
// Sheet object to retrieve a reference to the first worksheet.
Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().
Where(s => s.Name == sheetName).FirstOrDefault();
// Throw an exception if there is no sheet.
if (theSheet == null)
{
throw new ArgumentException("sheetName");
}
' Find the sheet with the supplied name, and then use that Sheet object
' to retrieve a reference to the appropriate worksheet.
Dim theSheet As Sheet = wbPart.Workbook.Descendants(Of Sheet)().
Where(Function(s) s.Name = sheetName).FirstOrDefault()
' Throw an exception if there is no sheet.
If theSheet Is Nothing Then
Throw New ArgumentException("sheetName")
End If
FirstOrDefault メソッドは、最初に一致する参照 (この例ではシート) または null 参照 (一致が見つからない場合) を返します。null 参照かどうかを確認し、無効なシート名が渡されている場合は、例外をスローします。シートに関する情報を取得したので、次は、対応するワークシート パーツへの参照を取得する必要があります。取得したシート情報には Id プロパティが含まれています。この Id プロパティを使用して、対応する WorksheetPart への参照を取得します。そのためには、ワークブック パーツ GetPartById メソッドを呼び出します。
// Retrieve a reference to the worksheet part.
WorksheetPart wsPart =
(WorksheetPart)(wbPart.GetPartById(theSheet.Id));
' Retrieve a reference to the worksheet part.
Dim wsPart As WorksheetPart =
CType(wbPart.GetPartById(theSheet.Id), WorksheetPart)
名前が指定されたシートやセルを見つける場合と同様に、Descendants メソッドを使用して最初の一致 (CellReference プロパティと指定された addressName パラメーターが一致する) を検索します。このメソッドを呼び出した後、theCell という名前の変数には、セルへの参照または null 参照が格納されます。
// Use its Worksheet property to get a reference to the cell
// whose address matches the address you supplied.
Cell theCell = wsPart.Worksheet.Descendants<Cell>().
Where(c => c.CellReference == addressName).FirstOrDefault();
' Use its Worksheet property to get a reference to the cell
' whose address matches the address you supplied.
Dim theCell As Cell = wsPart.Worksheet.Descendants(Of Cell).
Where(Function(c) c.CellReference = addressName).FirstOrDefault
値の取得
この時点で、変数 theCell には、null 参照が含まれているか、要求したセルへの参照が含まれています。セルの Open XML コンテンツ (つまり、theCell.OuterXml) を調べてみると、次に示すような XML が見つかります。
<x:c r="A1">
<x:v>12.345000000000001</x:v>
</x:c>
InnerText プロパティには、セルの内容が含まれています。したがって、次のコード ブロックでは、この値を取得します。
// If the cell does not exist, return an empty string.
if (theCell != null)
{
value = theCell.InnerText;
// Code removed here…
}
' If the cell does not exist, return an empty string.
If theCell IsNot Nothing Then
value = theCell.InnerText
' Code removed here…
End If
次に、サンプル メソッドは値を解釈する必要があります。ただし、このコードでは、数値、日付値、文字列、および Boolean 値を処理しています。このサンプルは必要に応じて拡張できます。Cell タイプには、セル内のデータの型を指定する DataType プロパティがあります。DataType プロパティの値は、データ型が数値および日付型の場合は null で、文字列の場合は値 CellValues.SharedString、Boolean 値の場合は CellValues.Boolean です。DataType プロパティが null の場合は、セルの値 (数値) を返します。null 以外の場合は、データ型に応じて条件分岐して処理を続行します。
// If the cell represents an integer number, you are done.
// For dates, this code returns the serialized value that
// represents the date. The code handles strings and
// Booleans individually. For shared strings, the code
// looks up the corresponding value in the shared string
// table. For Booleans, the code converts the value into
// the words TRUE or FALSE.
if (theCell.DataType != null)
{
switch (theCell.DataType.Value)
{
// Code removed here…
}
}
' If the cell represents an numeric value, you are done.
' For dates, this code returns the serialized value that
' represents the date. The code handles strings and
' Booleans individually. For shared strings, the code
' looks up the corresponding value in the shared string
' table. For Booleans, the code converts the value into
' the words TRUE or FALSE.
If theCell.DataType IsNot Nothing Then
Select Case theCell.DataType.Value
' Code removed here…
End Select
End If
DataType プロパティに CellValues.SharedString が含まれている場合は、単一の SharedStringTablePart への参照を取得する必要があります。
// For shared strings, look up the value in the
// shared strings table.
var stringTable =
wbPart.GetPartsOfType<SharedStringTablePart>()
.FirstOrDefault();
' For shared strings, look up the value in the
' shared strings table.
Dim stringTable = wbPart.
GetPartsOfType(Of SharedStringTablePart).FirstOrDefault()
次に、文字列テーブルが存在する場合 (文字列テーブルが存在しない場合は、ブックは壊れているため、サンプル コードは文字列ではなく文字列テーブルへのインデックスを返します)、指定されたインデックスの位置で検出される要素の InnerText プロパティを返します (最初に value プロパティを整数に変換します)。
// If the shared string table is missing, something
// is wrong. Return the index that is in
// the cell. Otherwise, look up the correct text in
// the table.
if (stringTable != null)
{
value =
stringTable.SharedStringTable
.ElementAt(int.Parse(value)).InnerText;
}
' If the shared string table is missing, something
' is wrong. Return the index that is in
' the cell. Otherwise, look up the correct text in
' the table.
If stringTable IsNot Nothing Then
value = stringTable.SharedStringTable.
ElementAt(Integer.Parse(value)).InnerText
End If
DataType プロパティに CellValues.Boolean が含まれている場合は、セル値から検出される 0 または 1 を適切なテキスト文字列に変換します。
case CellValues.Boolean:
switch (value)
{
case "0":
value = "FALSE";
break;
default:
value = "TRUE";
break;
}
Case CellValues.Boolean
Select Case value
Case "0"
value = "FALSE"
Case Else
value = "TRUE"
End Select
最後に、このプロシージャは、要求された情報を含む変数 value を返します。
サンプル コード
以下に、C# と Visual Basic の完全な GetCellValue コード サンプルを示します。
// Retrieve the value of a cell, given a file name, sheet name,
// and address name.
public static string GetCellValue(string fileName,
string sheetName,
string addressName)
{
string value = null;
// Open the spreadsheet document for read-only access.
using (SpreadsheetDocument document =
SpreadsheetDocument.Open(fileName, false))
{
// Retrieve a reference to the workbook part.
WorkbookPart wbPart = document.WorkbookPart;
// Find the sheet with the supplied name, and then use that
// Sheet object to retrieve a reference to the first worksheet.
Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().
Where(s => s.Name == sheetName).FirstOrDefault();
// Throw an exception if there is no sheet.
if (theSheet == null)
{
throw new ArgumentException("sheetName");
}
// Retrieve a reference to the worksheet part.
WorksheetPart wsPart =
(WorksheetPart)(wbPart.GetPartById(theSheet.Id));
// Use its Worksheet property to get a reference to the cell
// whose address matches the address you supplied.
Cell theCell = wsPart.Worksheet.Descendants<Cell>().
Where(c => c.CellReference == addressName).FirstOrDefault();
// If the cell does not exist, return an empty string.
if (theCell != null)
{
value = theCell.InnerText;
// If the cell represents an integer number, you are done.
// For dates, this code returns the serialized value that
// represents the date. The code handles strings and
// Booleans individually. For shared strings, the code
// looks up the corresponding value in the shared string
// table. For Booleans, the code converts the value into
// the words TRUE or FALSE.
if (theCell.DataType != null)
{
switch (theCell.DataType.Value)
{
case CellValues.SharedString:
// For shared strings, look up the value in the
// shared strings table.
var stringTable =
wbPart.GetPartsOfType<SharedStringTablePart>()
.FirstOrDefault();
// If the shared string table is missing, something
// is wrong. Return the index that is in
// the cell. Otherwise, look up the correct text in
// the table.
if (stringTable != null)
{
value =
stringTable.SharedStringTable
.ElementAt(int.Parse(value)).InnerText;
}
break;
case CellValues.Boolean:
switch (value)
{
case "0":
value = "FALSE";
break;
default:
value = "TRUE";
break;
}
break;
}
}
}
}
return value;
}
Public Function GetCellValue(ByVal fileName As String,
ByVal sheetName As String,
ByVal addressName As String) As String
Dim value As String = Nothing
' Open the spreadsheet document for read-only access.
Using document As SpreadsheetDocument =
SpreadsheetDocument.Open(fileName, False)
' Retrieve a reference to the workbook part.
Dim wbPart As WorkbookPart = document.WorkbookPart
' Find the sheet with the supplied name, and then use that Sheet object
' to retrieve a reference to the appropriate worksheet.
Dim theSheet As Sheet = wbPart.Workbook.Descendants(Of Sheet)().
Where(Function(s) s.Name = sheetName).FirstOrDefault()
' Throw an exception if there is no sheet.
If theSheet Is Nothing Then
Throw New ArgumentException("sheetName")
End If
' Retrieve a reference to the worksheet part.
Dim wsPart As WorksheetPart =
CType(wbPart.GetPartById(theSheet.Id), WorksheetPart)
' Use its Worksheet property to get a reference to the cell
' whose address matches the address you supplied.
Dim theCell As Cell = wsPart.Worksheet.Descendants(Of Cell).
Where(Function(c) c.CellReference = addressName).FirstOrDefault
' If the cell does not exist, return an empty string.
If theCell IsNot Nothing Then
value = theCell.InnerText
' If the cell represents an numeric value, you are done.
' For dates, this code returns the serialized value that
' represents the date. The code handles strings and
' Booleans individually. For shared strings, the code
' looks up the corresponding value in the shared string
' table. For Booleans, the code converts the value into
' the words TRUE or FALSE.
If theCell.DataType IsNot Nothing Then
Select Case theCell.DataType.Value
Case CellValues.SharedString
' For shared strings, look up the value in the
' shared strings table.
Dim stringTable = wbPart.
GetPartsOfType(Of SharedStringTablePart).FirstOrDefault()
' If the shared string table is missing, something
' is wrong. Return the index that is in
' the cell. Otherwise, look up the correct text in
' the table.
If stringTable IsNot Nothing Then
value = stringTable.SharedStringTable.
ElementAt(Integer.Parse(value)).InnerText
End If
Case CellValues.Boolean
Select Case value
Case "0"
value = "FALSE"
Case Else
value = "TRUE"
End Select
End Select
End If
End If
End Using
Return value
End Function