RapidReport 製品ドキュメント

段組み帳票

ここでは、明細の内容が1ページ内の左右2段にわたって配置された段組み帳票を、 サブページという機能を使って作成する方法を説明します。

※ サブページはやや複雑で高度な機能となります。 他の方法で対応できない場合でのみ利用することをお勧めします。

※ 集計行などを含まない単純な表を段組みとする場合はサブページを利用する必要はありません。 帳票サンプルに含まれている「段組帳票」を参考にしてください。 下記サンプルのように集計行などを途中に含む表を段組みにする場合はサブページが必要となります。

段組み帳票のサンプル

完成したサンプルが example フォルダ内に以下の名前で含まれています。

帳票定義ファイル: example_subpage[1-2].rrpt
ソースコード: ExampleSubPage.cs、ExampleSubPage.vb、ExampleSubPage.java

このようなレイアウトを実現するには、明細部分となる内部帳票(これをサブページと呼びます)を先に作成し、 生成された各ページを外枠帳票の[サブページ(subpage)]要素に割り当てます。

段組み帳票の仕組み

外枠帳票(example_subpage1.rrpt)と、内部帳票(example_subpage2_rrpt)は、 それぞれ独立した帳票として個別にデザインを作成することになります。

まずはサブページの実体となる内部帳票のReportPagesを作成します。 外枠帳票が最終的に何ページになるかはサブページの内容によって決まるため、 まずはサブページを先に作成する必要があります。

  // C#
  Report subReport = new Report(Json.Read("report\\example_subpage2.rrpt"));
  subReport.Fill(new ReportDataSource(getDataTable()));
  ReportPages subPages = subReport.GetPages();
  ' VisualBasic
  Dim subReport As New Report(Json.Read("report\example_subpage2.rrpt"))
  subReport.Fill(New ReportDataSource(getDataTable))
  Dim subPages As ReportPages = subReport.GetPages()  
  // Java
  Report subReport = new Report(ReadUtil.readJson("report/example_subpage2.rrpt"));
  subReport.fill(new ReportDataSource(getDataTable()));
  ReportPages subPages = subReport.getPages();  

続いて外枠帳票のReportオブジェクトを作成し、 AddSubPageメソッドでサブページを登録します。

  // C#
  Report report = new Report(Json.Read("report\\example_subpage1.rrpt"));
  report.AddSubPages("subpage", subPages);
  ' VisualBasic
  Dim report As New Report(Json.Read("report\example_subpage1.rrpt"))  
  report.AddSubPages("subpage", subpages)
  // Java
  Report report = new Report(ReadUtil.readJson("report/example_subpage1.rrpt"));  
  report.addSubPages("subpage", subpages);

外枠帳票のページ内には2つのサブページ要素を配置し、 プロパティの[キー]を"subpage"、[式]をそれぞれ".page1",".page2"と設定します。 [キー]の値はAddSubPagesで指定したキーと対応します。 [式]は、評価された結果の値がその場所に張り付けるサブページ内のページ番号のインデックスとなります。

外枠帳票に与えるデータソースの内容によって、サブページがどのように割り当てられるかが決まります。 1ページに決まった数だけ(今回の例では2段ずつ)割り当てるといった場合は、 SubPageDataSourceというオブジェクトを利用します。

  // C#
  report.Fill(new SubPageDataSource(subPages, "group1", "page1", "page2"));
  ' VisualBasic
  report.Fill(New SubPageDataSource(subPages, "group1", "page1", "page2"))  
  // Java
  report.fill(new SubPageDataSource(subPages, "group1", "page1", "page2"));  

SubPageDataSouceのコンストラクタにはまず、サブページとなるReportPagesオブジェクトを渡します。

次に、改ページの条件としたいグループが存在する場合はその識別子を渡します。 今回の例では、サブページ内で"group1"というグループがブレークしたら外枠帳票も改ページするようにします。 改ページの条件としたいグループがなければ、この引数にはnull(またはNothing)を指定します。

最後に、サブページのインデックスを得るためのキーとなる列名を指定します。 この引数は可変個指定することができるので、各ページにサブページを割り当てる数だけ指定します。 今回の例では"page1","page2"と指定します。

SubPageDataSourceの表すデータの行数は、そのまま外枠帳票のページ数となります。 そのため、外枠帳票はデータ1行毎に改ページされるようにデザインしておきます。

最終的なコードは以下のようになります。

  // C#

  // サブページを先に生成します
  Report subReport = new Report(Json.Read("report\\example_subpage2.rrpt"));
  subReport.Fill(new ReportDataSource(getDataTable()));
  ReportPages subPages = subReport.GetPages();

  Report report = new Report(Json.Read("report\\example_subpage1.rrpt"));
  // 外枠帳票にサブページを登録します
  report.AddSubPages("subpage", subPages);
  // 外枠帳票の中でサブページが正しく割り当てられるようにSubPageDataSourceを渡します
  report.Fill(new SubPageDataSource(subPages, "group1", "page1", "page2"));
  ReportPages pages = report.GetPages();

  // PDF出力
  using (FileStream fs = new FileStream("output\\example_subpage.pdf", FileMode.Create))
  {
      PdfRenderer renderer = new PdfRenderer(fs);
      renderer.Setting.ReplaceBackslashToYen = true;
      pages.Render(renderer);
  }
  ' VisualBasic

  ' サブページを先に生成します
  Dim subReport As New Report(Json.Read("report\example_subpage2.rrpt"))
  subReport.Fill(New ReportDataSource(getDataTable))
  Dim subPages As ReportPages = subReport.GetPages()

  Dim report As New Report(Json.Read("report\example_subpage1.rrpt"))
  ' 外枠帳票にサブページを登録します
  report.AddSubPages("subpage", subPages)
  ' 外枠帳票の中でサブページが正しく割り当てられるようにSubPageDataSourceを渡します
  report.Fill(New SubPageDataSource(subPages, "group1", "page1", "page2"))
  Dim pages As ReportPages = report.GetPages()

  ' PDF出力
  Using fs As New FileStream("output\example_subpage.pdf", IO.FileMode.Create)
      Dim renderer As New PdfRenderer(fs)
      pages.Render(renderer)
  End Using
  // Java

  // サブページを先に生成します
  Report subReport = new Report(ReadUtil.readJson("report/example_subpage2.rrpt"));
  subReport.fill(new ReportDataSource(getDataTable()));
  ReportPages subPages = subReport.getPages();

  Report report = new Report(ReadUtil.readJson("report/example_subpage1.rrpt"));
  // 外枠帳票にサブページを登録します
  report.addSubPages("subpage", subPages);
  // 外枠帳票の中でサブページが正しく割り当てられるようにSubPageDataSourceを渡します
  report.fill(new SubPageDataSource(subPages, "group1", "page1", "page2"));
  ReportPages pages = report.getPages();

  // PDF出力
  {
      FileOutputStream fos = new FileOutputStream("output/example_subpage.pdf");
      try{
          PdfRenderer renderer = new PdfRenderer(fos);
          pages.render(renderer);
      }finally{
          fos.close();
      }
  }

Copyright (c) 2013, SystemBase Co.,Ltd. All rights reserved.