ページ挿入

このページでは、以下の帳票を作成します。

この帳票ではグループが終わる毎に集計ページが挿入されています。 さらに、最後のページにも別のデザインのページが追加されています。

ページ挿入のサンプル
サンプルについて
完成したサンプルが example フォルダ内に以下の名前で含まれています。 帳票定義ファイル: example_page[1-3].rrpt ソースコード: ExamplePage.cs、ExamplePage.vb、ExamplePage.java

カスタマイザのPageAddedメソッドを利用することで、グループが終了するたびに別ページを挿入することができます。 カスタマイザを実装するには、DefaultCustomizerクラスを継承します。 コードは以下のようになります。

  // C#
  
  // グループが終了するたびに集計ページを挿入するカスタマイザ
  private class Customizer : DefaultCustomizer
  {
      private ReportDesign reportDesign;

      public Customizer()
      {
          this.reportDesign = new ReportDesign(Json.Read("report\\example_page2.rrpt"));
      }

      public override void PageAdded(Report report, ReportPages pages, ReportPage page)
      {
          // このメソッドはページが追加されるたびに呼ばれます
          // 直前のページで"group_example"という識別子を持ったグループが終了しているかを調べます
          Group g = page.FindFinishedGroup("group_example");
          if (g != null)
          {
              // 直前に終了したグループのデータを用いて集計ページを作成し、挿入します
              Report _report = new Report(this.reportDesign);
              _report.Fill(g.Data);
              pages.AddRange(_report.GetPages());
          }
      }

  }
  ' VisualBasic

  ' グループが終了するたびに集計ページを挿入するカスタマイザ
  Private Class Customizer
      Inherits DefaultCustomizer

      Private reportDesign As ReportDesign

      Public Sub New()
          ' あらかじめ集計ページの帳票定義ファイルを読み込んでおきます
          Me.reportDesign = New ReportDesign(Json.Read("report\example_page2.rrpt"))
      End Sub

      Public Overrides Sub PageAdded( _
        ByVal report As Report, _
        ByVal pages As ReportPages, _
        ByVal page As ReportPage)
          ' このメソッドはページが追加されるたびに呼ばれます()
          ' 直前のページで"group_example"という識別子のグループが終了しているかを調べます
          Dim g As Group = page.FindFinishedGroup("group_example")
          If g IsNot Nothing Then
              ' 直前に終了したグループのデータを用いて集計ページを作成し、挿入します
              Dim _report As New Report(Me.reportDesign)
              _report.Fill(g.Data)
              pages.AddRange(_report.GetPages)
          End If
      End Sub

  End Class
  // Java

  // グループが終了するたびに集計ページを挿入するカスタマイザ
  private static class Customizer extends DefaultCustomizer{

      private ReportDesign reportDesign;

      public Customizer() throws Throwable{
          // あらかじめ集計ページの帳票定義ファイルを読み込んでおきます
          this.reportDesign = new ReportDesign(ReadUtil.readJson("report/example_page2.rrpt"));
      }

      @Override
      public void pageAdded(
              Report report,
              ReportPages pages,
              ReportPage page) {
          // このメソッドはページが追加されるたびに呼ばれます
          // 直前のページで"group_example"という識別子のグループが終了しているかを調べます
          Group g = page.findFinishedGroup("group_example");
          if (g != null){
              // 直前に終了したグループのデータを用いて集計ページを作成し、挿入します
              Report _report = new Report(this.reportDesign);
              _report.fill(g.data);
              pages.addAll(_report.getPages());
          }
      }

  }

PageAddedメソッドは改ページが行われるたびに呼ばれます。 引数のpagesにそれまでに生成されたページのリストが渡され、 pageには直前に生成されたページが渡されます。

今回行いたいことは、group_exampleという識別子が振られたグループが直前のページで終了していた場合、 集計用のページを挿入するということです。 FindFinishedGroupメソッドを呼ぶと、そのページで終了したグループから識別子に対応したものを返します。

グループがそのページで終了していた場合、その場で集計用のReportを作成してpagesに追加します。 その際、グループの持つdataをそのままデータソースとすることができます。

最後のページはpagesが作成された後で追加すればよいので、 カスタマイザの中で対応する必要はありません。 単にGetPagesメソッドの結果に対して新たにReportを作成して追加します。 最終的なコードは以下のようになります。

  // C#

  ReportPages pages;
  {
      // 第2引数にCustomizerオブジェクトを渡します
      Report report = new Report(Json.Read("report\\example_page1.rrpt"), new Customizer());
      report.Fill(new ReportDataSource(getDataTable()));
      pages = report.GetPages();
  }

  {
      Report report = new Report(Json.Read("report\\example_page3.rrpt"));
      report.Fill(DummyDataSource.GetInstance());
      // 最後のページを追加します
      pages.AddRange(report.GetPages());
  }

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

  Dim pages As ReportPages
  With Nothing
      ' 第2引数にCustomizerオブジェクトを渡します
      Dim report As New Report(Json.Read("report\example_page1.rrpt"), New Customizer)
      report.Fill(New ReportDataSource(getDataTable))
      pages = report.GetPages()
  End With

  With Nothing
      Dim report As New Report(Json.Read("report\example_page3.rrpt"))
      report.Fill(DummyDataSource.GetInstance)
      ' 最後のページを追加します
      pages.AddRange(report.GetPages)
  End With

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

  ReportPages pages;
  {
      // 第2引数にCustomizerオブジェクトを渡します
      Report report = new Report(ReadUtil.readJson("report/example_page1.rrpt"), new Customizer());
      report.fill(new ReportDataSource(getDataTable()));
      pages = report.getPages();
  }

  {
      Report report = new Report(ReadUtil.readJson("report/example_page3.rrpt"));
      report.fill(DummyDataSource.getInstance());
      // 最後のページを追加します
      pages.addAll(report.getPages());
  }

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