第4章 SpreadsheetML

Calculation Chain

あるセルの計算式が、計算式を持つほかのセルの値を参照しているとき、参照しているセルの算出処理によって結果が変わることになります。SpreadsheetMLではこれをCaluclation Chainと呼びます。また、この計算式の依存関係、算出処理順序を表したものをCalculation treeと呼びます。

Calculation Chainパーツはそのワークブックで最後に行われたセルの算出処理順序を保存するパーツです。ワークブックの中で、計算式を含むセルを参照する情報を保存します。この情報には算出処理順序そのものは含まず、ほかのセルの結果に依存するかどうかのみを記録します。

このパーツはワークブックと同じxlフォルダにcalcChain.xmlというファイル名で格納されます。ワークシートのデータはシート単位に複数作成されますが、このパーツはワークブックに対して1つ作成され、全シートのデータが記録されます。

次のサンプルを見てください。

Calculation Chainのサンプル
Calculation Chainのサンプル

A列には数値、B列には“A列+1”、C列には“A列+B列”の計算式が指定されています。B列の計算の後にC列の計算が行われ、B列が決定しなければC列の値は求めることができません。

この場合のcalcChain.xmlは、次のようになっています。

calcChain.xml
<calcChain
  xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <c r="B2" i="1"/>
  <c r="B3"/>
  <c r="B4"/>
  <c r="B5"/>
  <c r="B6"/>
  <c r="C6" s="1"/>
  <c r="C4"/>
  <c r="C5"/>
  <c r="C3"/>
  <c r="C2"/>
</calcChain>

calcChain要素をルートにc要素が列挙されています。r属性はsheetDataの場合と同じくセルの位置情報です。i属性はシートIDです。シートIDが省略されたときは、直前のセルのシートIDと同じ値ということが決められています。この例では、一番最初のi属性でシートIDに1が指定され、以降はすべて省略されているので、シートIDは1ということになります。

ここで重要なのはs属性の値です。この値が“true”(1)のとき、このセルの計算は(他のセルの計算に)依存しているということになります。“false”(0)であれば他のセルに依存はしていないので、単独でセルの計算を行うことが可能だということになります。この属性のデフォルト値は“false”(0)です。そして、s属性が省略された場合は直前のc要素の値と同じとすることが決められています。したがって、このサンプルでは、B2からB6までが“false”(0)、C6からC2までが“true”(1)となっています。これでC列のセルが他のセルに依存していることがわかります。

では、なぜこのようなパーツが必要なのでしょうか? 先ほどこのパーツはアプリケーションがワークシートを計算処理するためにあると書きました。Excelなどのアプリケーションがワークシートの関数にしたがって計算を行い出力するために、順番に1つずつ計算を行っていたのではとても時間がかかってしまいます。さらに、このような計算式が他のセルの値に依存しているような場合は、後で計算する必要があります。逆に依存していなければ即計算しても問題ありません。アプリケーション側で計算時にこのような判断を行い、処理を容易にするためのパーツであると言えます。

ワークシートのデータを出力結果としてのみ利用するのであれば、シートデータには計算結果がv要素の内容にありますから、Calculation Chainのパーツは参照する必要がないことになります。

Calculation Chainと関連して、Partial Calclation(部分的な算出)とFully Calclation(完全な算出)という語が登場します。