ワークシートは、セルデータを格子状に配置した集合として管理されています。
sheetData要素がワークシートのデータの親要素です。sheetData要素の内部は次のような構造になっています。
sheetData要素の内部構造
sheetData要素の下は、行を意味するrow要素が連続します。row要素の下はセルを表すc要素が連続します。c要素には数式を格納するためのf要素、セル値を格納するためのv要素などが入ります。
row要素はr属性があり、行のインデックスを数字で表しています。c要素にもr属性というのがあり、こちらは“A1”、“C3”のようにセルの行と列の位置情報(リファレンス)を表しています。
A1スタイルとR1C1スタイル
SpreadsheetMLにおけるセル参照のスタイルには、A1スタイルとR1C1スタイルがあります。
ワークシートの表示形式について、行をアルファベットのAからZ、以降AA、AB……、列を1、2……と続けていき、参照するときも「$A$1」や「B2」のように指定するスタイルがA1スタイルです。
R1C1スタイルでは、行と列はともに数字です。参照するときは、たとえば2行3列目であれば「R3C2」のように指定します。
ISO/IEC 29500-1:2016中の例示では、ほぼA1スタイルで指定が行われています。
さらに、c要素にはt属性というのがあります。これはセルのデータタイプを表しています。t属性の値は、“b”(Boolean)、“e”(Error)、“inlineStr”(Inline
String)、“n”(Number)、“s”(Shared
String)、“str”(String)のいずれかですが、数値の場合の“n”がデフォルトとなっています。テキストデータの場合は“s”が指定されます。
次のような簡単なワークシートの場合を見てみましょう。
簡単なワークシート
ワークシートのsheetData要素の中は、次のようになっています。
sheetData例
<sheetData>
<row r="1" spans="1:5">
<c r="A1"><v>1</v></c>
<c r="B1" t="s"> <v>0</v></c>
<c r="C1"> <v>1</v></c>
<c r="D1"><v>1</v></c>
<c r="E1"> <f>SUM(C1:D1)</f><v>2</v> </c>
</row>
<row r="2" spans="1:5">
<c r="A2"> <v>2</v> </c>
<c r="B2" t="s"><v>1</v></c>
<c r="C2"> <v>2</v></c>
<c r="D2"> <v>2</v></c>
<c r="E2"><f>SUM(C2:D2)</f><v>4</v></c>
</row>
...
</sheetData>
row要素のr属性値が1、2と連続した数値で行のインデックスを表しています。row要素の中のc要素にはr属性でA1、B1、C1・・・とリファレンスがあります。
c要素は、そのデータタイプによって内容が変化します。この例でA列は直接数値が入力されています。この場合、データタイプのt属性はありません。デフォルトで数値データを表しているからです。
B列は文字(あいうえお)が入力されています。テキストデータの場合はt属性でテキストを表すため、c要素には t="s"
が追加されます。このとき、セル値のv要素には文字データは入っていません。文字データは後述される文字データ用のパーツファイルに格納されます。
E列には関数が指定されています。それぞれ同じ行のC列とD列の合計値が計算されるようになっています。この場合、c要素の子要素としてf要素が追加されます。f要素の内容は、関数の式がそのまま格納され、さらにv要素にはその計算結果が格納されています。