テンプレートファイルの作成
Excelで、テンプレートを作成します。
テンプレートのルール
- 1つのワークブックに複数シートをテンプレートとして追加する事が出来ます。 その場合、全てのシートにおいて、データは共有されます。
- 列の幅、行の高さが出力ファイルに反映されます。
- セルの書式は以下のものが反映されます。
- 表示形式(ユーザー定義も含む)
- 配置(セルのマージも含む)
- フォント
- 罫線
- パターン
- 関数や「=A1 + A2」などのセルを指定した式は、繰り返しなど制御の結果でテンプレートと出力ファイルでセルの位置が変わる場合は完全には反映されません。
- 画像や図形はテンプレートに置かれた場所にそのまま出力されます。
- 「${」と「}」で囲まれた値は、埋め込むデータや内部的に保持している変数を参照するバインド変数です。
- 「#」で始まる値は、制御文と判断されます。制御文は必ずA列に書きます。
バインド変数について
文字列を「${」と「}」で囲む事によって、プログラムから渡されたデータや、Fisshplateが内部で保持している変数を参照する事が出来ます。
埋め込みデータ
埋め込みデータはプログラム側でIDictionary<string, object>で渡します。 キーを文字列にする事で、テンプレートのバインド変数から参照する事が出来ます。
IDictionary<string, object> data = newIDictionary<string, object>(); data["title"] = "タイトルです";
とデータを作った場合、テンプレートに「${title}」と書くと、出力されたExcelファイルの当該セルには「タイトルです」と埋め込まれています。
埋め込みデータがクラスの場合、プロパティを参照する事が出来ます。
IDictionary<string, object> data = newIDictionary<string, object>(); Foo foo = new Foo(); foo.Bar = "テスト"; data["fooTest"] = foo;
とデータを作った場合、テンプレートに「${fooTest.Bar}」と書くと、 出力されたExcelファイルの当該セルには「テスト」と埋め込まれます。
式の評価にはJScript.NETを使っています。
バインド変数名の制限について。
- 渡された「IDictionary<string, object>」はJScript.NETで評価する際には「__obj__」という変数名で参照させています。
- この為、実際には「${fooTest.Bar}」は「__obj__["fooTest"].Bar」と変換されてから評価されます。
- また、__obj__という変数名を利用したい場合は、__obj__["__obj__"]と記述してください。
NULLの制御
通常、バインド変数で指定した値がNULL、もしくは定義されていなかった場合、エラーになります。
これを回避するためには、値の後に「!」を付けます。当該セルは空欄になります。 また、「!」に続けて値を書く事で、NULLの場合のデフォルト値も設定出来ます。
IDictionary<string, object> data = newIDictionary<string, object>(); Foo foo = new Foo(); foo.Bar = null; data["fooTest"] = foo;
上記の場合、
${fooTest.Bar} → エラー ${fooTest.Bar!} → 空欄 ${fooTest.Bar!空です} → 「空です」と出力
となります。デフォルト値は全て文字列扱いになります。
文字列内への埋め込み
任意の文字列の中にバインド変数を埋め込む事も出来ます。
fooのbarの値は${foo.Bar}です。現在は${rownum}行目です。
と書いておくと、foo.Barが「テスト」、rownumが1の場合、
fooのbarの値はテストです。現在は1行目です。
と出力されます。
文字列内へ埋め込む場合、バインド変数の値は全て文字列扱いとなります。
内部変数
バインド変数や制御文で参照出来る内部変数があります。
- rownum
- 行番号です。
- page.pagenum
- ページ番号です。Fisshplate側で改ページ制御した場合のみ有効な数字になります。
制御文
テンプレート内で、条件分岐や繰り返しなどを制御する事が出来ます。詳細はこちらを参照して下さい。