AdvanceSoftware Tech Blog

アドバンスソフトウェア株式会社の技術ブログ

VB-ReportのRepeat-Next機能による帳票作成例

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行だけのレイアウトを作成しておきます。

以下、「明細行が可変+帳票の最初と最後にヘッダー/フッター」の帳票を作成する大まかな流れとコード例です。

  1. ヘッダー行を改ページせずにRepeat-Next
  2. 出力する件数分、明細行を改ページせずにRepeat-Next
  3. フッター行を改ページして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シート内に収めたい場合などに使用を検討してみてください。

今回は以上です。ありがとうございました。

© 2022 Advance Software Co., Ltd. All Rights Reserved.