段組み帳票

以下のように、明細の内容が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();
      }
  }