VB-Reportでは、固定のレイアウトの帳票だけでなく、明細部が可変となるような帳票も作成することができます。
また、VB-Reportには以下3種類(※)の帳票作成機能があり、目的のレイアウトに合わせた機能を使用することでコーディングもよりシンプルになります。
- Page.Start-Page.Next
- Page.Repeat-Page.Next
- Section.Start-Section.End
この中から今回は、Page.Repeat-Page.Next機能(以降「Repeat-Next機能」と表記)を紹介します。
説明にはVB-Report 10.0 for .NETを使用します。
※「VB-Report 11.0 for .NET」「VB-Report 10.0 for .NET」「VB-Report 8.0 for .NET」にある機能です。これらのバージョン以前では名称が異なっていたり、未実装の機能があります。
Repeat-Next機能の基本
Repeat-Next機能は以下2つのメソッドで成り立ちます。
- PageクラスのRepeatメソッド
- PageクラスのNextメソッド
Page.Repeatメソッド | ページ内での繰り返しの開始を指定します。 |
---|---|
Repeat(int) | 指定行から最終データ行までコピー |
Repeat(int, int) | 指定行から指定行数分コピー |
Page.Nextメソッド | ページ内での繰り返しの終了を指定します。 |
---|---|
Next() | 改ページ挿入 |
Next(bool) | 改ページ挿入の有無切り替え |
実際に使うと以下のようになります。
// 使用例(C#) cellReport.Page.Start("Sheet1", "1-99999"); cellReport.Page.Repeat(5, 1); cellReport.Cell("A5").Value = 1234; cellReport.Page.Next(false); cellReport.Page.End();
この場合は、コピーした5行目のデータに対して値を差し込んだ上で出力用シートの1行目にコピーします。
また、Repeat-Next間での編集はコピー元のセル座標を指定する必要があります。
Repeat-Nextを複数回呼び出した場合、指定した行データが出力用シートに累積します。
また、同じ行でRepeat-Nextを繰り返す場合でも、編集時には毎回コピー元のセル座標を指定します。
以下が実際のコードとイメージ図です。
// 複数回呼び出しの例(C#) cellReport.Page.Start("Sheet1", "1-99999"); for (var i = 0; i < 10; i++) { cellReport.Page.Repeat(5, 1); // 同じセル座標の指定でもRepeat-Nextの呼び出し毎に異なる値を設定できます。 cellReport.Cell("A5").Value = i; cellReport.Page.Next(false); } cellReport.Page.End();
出力用シートに累積する動作のため、Repeat-Nextで作成した帳票は1シート内に全てのページが出力されます。
Repeat-Next機能による帳票作成例
固定のレイアウトを繰り返す
まずは、以下のように 1ページ分のレイアウトが出来上がっていて、このレイアウトで複数ページを作成する例をご紹介します。
Repeatメソッドに第1引数のみを指定する場合、指定した行以降~データの最終位置が繰り返し範囲になります。 そのため、固定のレイアウトを繰り返す場合は以下のような記述で複数ページの作成ができます。
cellReport.Page.Start("Sheet1", "1-99999"); for (var i = 0; i < 3; i++) { // Sheet1シートの1行目~データの最終位置までコピー cellReport.Page.Repeat(1); // ここでページごとの編集を行います。 // 引数なしの場合は改ページを挿入 cellReport.Page.Next(); } cellReport.Page.End();
繰り返しの回数(3回)分、ページが作成されていることをプレビューで確認できます。
出力後のExcelファイルでは、1シート内に3ページ分の帳票が連なります。
※見やすいよう「改ページプレビュー」で縮小して表示しています。
このような帳票は、以下のようにPage.Start-Page.Endの繰り返しでも作成できますが、1ページごとにシートが分割される違いがあります。
for (var i = 0; i < 3; i++) { // 1回のStart-Endで1シート作成される。 cellReport.Page.Start("Sheet1", "1-99999"); cellReport.Page.End(); }
明細行が可変+帳票の最初と最後にヘッダー/フッターを設定
帳票の最初と最後にヘッダー/フッターがあり、明細行が可変の帳票を作成する場合、明細行が1行だけのレイアウトを作成しておきます。
以下、「明細行が可変+帳票の最初と最後にヘッダー/フッター」の帳票を作成する大まかな流れとコード例です。
- ヘッダー行を改ページせずにRepeat-Next
- 出力する件数分、明細行を改ページせずにRepeat-Next
- フッター行を改ページしてRepeat-Next
cellReport.Page.Start("Sheet1", "1-99999"); // ヘッダーの設定(1行目から5行分コピー) cellReport.Page.Repeat(1, 5); cellReport.Page.Next(false); // 出力する件数分、明細行を設定 foreach (var item in items) { cellReport.Page.Repeat(6, 1); // 6行目のみ編集できます。 cellReport.Cell("A6").Value = item; cellReport.Page.Next(false); } // フッターの設定(7行目から5行分コピー) cellReport.Page.Repeat(7, 5); cellReport.Page.Next(true); cellReport.Page.End();
明細行が連続した表示になります。
明細行が可変+ページ毎にヘッダー/フッターを設定
ページ毎にヘッダー/フッターがあり、明細行が可変の帳票を作成する場合、明細行が1行だけのレイアウトを作成しておきます。
「明細行が可変+ページ毎にヘッダー/フッター」の帳票を作成するには、まず出力するデータ件数と1ページに出力する最大行数から総ページ数を求めます。
// 件数が変動するデータがある想定 var items = new int[] { 1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15,16,17,18,19,20,21,22,23,24,25, 26,27,28,29,30,31,32, }; var maxRowCount = 7; // データの総数を 1ページの最大件数で割った商と剰余を計算 var pageTotal = items.Count() / maxRowCount; // 端数が出ていたら 1ページ分追加 if ((items.Count() % maxRowCount) > 0) { pageTotal++; }
1ページに出力できる最大件数でデータを区切って帳票を作成します。
cellReport.Page.Start("Sheet1", "1-99999"); // ページ数分の繰り返し for (var i = 0; i < pageTotal; i++) { // ヘッダーの設定 cellReport.Page.Repeat(1, 5); cellReport.Page.Next(false); // 1ページ内の最大件数でデータを区切る var detailValues = items.Skip(i * maxRowCount).Take(maxRowCount); foreach (var detailValue in detailValues) { // 明細行ごとの処理 cellReport.Page.Repeat(6, 1); cellReport.Cell("B6").Value = detailValue; cellReport.Page.Next(false); } // フッターの設定 cellReport.Page.Repeat(7, 5); cellReport.Page.Next(true); } cellReport.Page.End();
設定通り1ページに7行ずつ出力され、最後のページでも不要な明細行は反映されていないことが確認できます。
Repeat-Next機能の制限
- デザインのオブジェクトは1ページ目にのみ出力されます。
- 作成可能なページ数はシートの最大行数に依存します。
- Page.Startの繰り返しと比較し、処理速度が低下します。
- 行や列を操作する機能(RowCopy等)は使用できません。
- Page.Repeatを跨いだ計算式の計算はできません。
さいごに
Repeat-Next機能の基本と使用例を紹介してきました。
行数が可変の帳票を作成する場合や、出力後のExcelファイルで帳票を1シート内に収めたい場合などに使用を検討してみてください。
今回は以上です。ありがとうございました。