前回までの内容で(とりあえず)セルにデータをセットすることができました。今回はセルに数式をセットする方法について取り組みます。

まずは例のごとく、セルにてきとうな数式をセットしてProductivity Toolでその中身を確認します。

一枚目のシート(Sheet1)のセルC5に数式「=SUM(C1:C4)」をセットしました。これはWorksheetパーツでは以下のように表現されます。

セルC5をあらわすc要素にf要素が追加され、数式が「=」を除いた形でセットされていることがわかります。また、v要素にはその計算結果が(キャッシュとして?)セットされています。

以上を踏まえて、コードを書きます。

ようするに、前回までの「セルにデータをセットする」コードに一部手を加えて、f要素を追加するように記述してしまえばよいわけです。

//*** 前回の「データ(文字列)をセットする」コードをコメントアウト ***//
//cell.DataType = CellValues.SharedString;
//cell.CellValue = new CellValue(InsertSharedStringItem(VALUE, bookPart.SharedStringTablePart).ToString());
cell.CellValue = new CellValue("10");
cell.CellFormula = new CellFormula() { Text = "SUM(C1:C4)" };

いたってシンプルです。

v要素がめんどうくさい

上記のサンプルでは、数式の結果は10であることがあらかじめわかっていたので悩まなくて済みます。

しかしOpen XML SDKを使ってExcelファイルを生成する場面においては、セットする数式の計算結果があらかじめわかっていないことも多く、その場合には「セットする数式の結果を求めるコード」を別途用意する必要があります。

そんな場合にはv要素を省略したくなるのですが、v要素を省略するとちょっとだけ困ったことが起こります。

v要素を省略して(上記のサンプルの61行目をコメントアウトして)生成したファイルをExcelで開き、そのままそのファイルを閉じようとすると(なにも編集を行っていないにもかかわらず)Excelは保存確認ダイアログを表示します。

Excelは一般にファイルを開いたときに数式の再計算を行います。数式の再計算が行われると、その結果がv要素にセットされます。
セットされたv要素は、ファイルを開く前には存在しなかったもので、それゆえ保存確認ダイアログが表示されてしまうようです。

 あらかじめBookの再計算が自動的に行われないようにExcelのオプションを変更し、それから生成したファイルを開くと、
A6には数式がセットされているものの、セルには計算結果が表示されないままになってしまうことを確認できます。

なにも編集していないのに保存確認ダイアログが表示されると、「うっかり何か変更を加えてしまったかも!?」とエンドユーザーを混乱させることなりかねません。

「(エンドユーザーから見た場合の)保存確認ダイアログの誤表示」と「v要素の計算のめんどうくささ」を天秤にかけて、v要素を省略するかどうかを決めることになりそうです。