Jasper-reports-jasper-crosstabs

提供:Dev Guides
移動先:案内検索

JasperReports-クロス集計

クロス集計(クロス集計)レポートは、表形式の行と列にデータを配置するテーブルを含むレポートです。 クロス集計オブジェクトは、メインレポート内にクロス集計レポートを挿入するために使用されます。 クロスタブは、任意のレベルのデータ(名義、順序、間隔、または比率)で使用でき、通常、レポート変数に含まれる要約データを動的テーブルの形式で表示します。 変数は、合計、カウント、平均値などの集計データを表示するために使用されます。

クロス集計のプロパティ

JRXML要素<* crosstab *>は、レポートにクロスタブを挿入するために使用されます。

属性

以下は、<* crosstab *>要素の属性のリストです-

  • isRepeatColumnHeaders -改ページ後に列ヘッダーを再印刷するかどうかを示します。 デフォルト値は_true_です。
  • isRepeatRowHeaders -クロス集計列の区切り後に行ヘッダーを再印刷するかどうかを示します。 デフォルト値は_true_です。
  • columnBreakOffset -列の区切りが発生した場合、後続のクロスタブピースが同じページの前のクロスタブピースの下に配置される前のピクセル単位で測定された垂直方向のスペースの量を示します。 デフォルト値は10です。
  • runDirection -クロス集計データを左から右(LTR)または右から左(RTL)のどちらで埋めるかを示します。 デフォルト値はLTRです。
  • ignoreWidth -クロスタブが最初のクロスタブの幅制限を超えて伸び、列の区切りを生成しないかどうかを示します。 それ以外の場合は、クロスタブの幅制限内で列のレンダリングを停止し、すべての行がレンダリングを開始した後にのみ残りの列で続行します。 デフォルト値は_false_です。

サブ要素

<crosstab>要素には次のサブ要素があります-

  • <reportElement> -この要素は、その囲み内のクロスタブの位置、幅、および高さを定義します。 この要素の属性には、すべての標準<reportElement>属性が含まれます。
  • <crosstabParameter> -この要素は、クロスタブ内からレポート変数とパラメーターにアクセスするために使用されます。 この要素の属性は次のとおりです-
  • name-これはパラメータ名を定義します。
  • class-これはパラメータクラスを示します。
  • <parametersMapExpression> -この要素は、_java.util.Map_のインスタンスを含むレポート変数またはパラメーターを、クロスタブのパラメーターのセットとして渡すために使用されます。 この要素には 属性なし。
  • <crosstabDataset> -この要素は、クロスタブの設定に使用するデータセットを定義します(詳細な説明については次のセクションを参照してください)。 この要素の属性は次のとおりです-
  • isDataPreSorted-これは、データセット内のデータが事前にソートされているかどうかを示します。 デフォルト値は_false_です。
  • <crosstabHeaderCell> -この要素は、列ヘッダーと行ヘッダーが交わるクロスタブの左上隅にある領域のコンテンツを定義します。 このセルのサイズは、定義された行と列の幅と高さに基づいて自動的に計算されます。
  • <rowGroup> -この要素は、データを行に分割するために使用されるグループを定義します。 この要素の属性は次のとおりです-
  • name-これは行グループの名前を定義します。
  • width-これは行グループの幅を定義します。
  • headerPosition-これは、ヘッダーのコンテンツの位置を定義します(トップ、ミドル、ボトム、ストレッチ)。
  • totalPosition-これは、列全体の位置を定義します(開始、終了、なし)。 +この要素には、次のサブ要素が含まれます-
  • _ <バケット> _
  • _ <crosstabRowHeader> _
  • _ <crosstabTotalRowHeader> _
  • <columnGroup> -この要素は、データを列に分割するために使用されるグループを定義します。 この要素の属性は次のとおりです-
  • name-これは列グループ名を定義します。
  • height-これは、列グループヘッダーの高さを定義します。
  • headerPosition-これは、ヘッダーコンテンツの位置を定義します(Right、Left、Center、Stretch)。
  • totalPosition-これは列全体の位置を定義します(Start、End、None)。 +この要素には、次のサブ要素が含まれます-
  • _ <バケット> _
  • _ <crosstabColumnHeader> _
  • _ <crosstabTotalColumnHeader> _
  • <measure> -この要素は、行と列にわたって実行される計算を定義します。 この要素の属性は次のとおりです-
  • name-これはメジャー名を定義します。
  • class-これはメジャークラスを示します。
  • calculation-これは、クロス集計セル値間で実行される計算を示します。 その値は、Nothing、Count、DistinctCount、Sum、Average、Lowest、Highest、StandardDeviation、Variance、、_ First_のいずれかです。 デフォルト値は Nothing です。
  • <crosstabCell> -この要素は、非ヘッダーセルのデータのレイアウト方法を定義します。 この要素の属性は次のとおりです-
  • columnTotalGroup-これは、列の合計を計算するために使用するグループを示します。
  • height-これはセルの高さを定義します。
  • rowTotalGroup-これは、行の合計を計算するために使用するグループを示します。
  • width-これはセルの幅を定義します。
  • <whenNoDataCell> -この要素は、空のクロス集計セルに表示するものを定義します。 この要素には属性が含まれていません。

クロス集計でのデータのグループ化

クロス集計計算エンジンは、関連するデータセットレコードを反復処理することでデータを集計します。 データを集約するには、最初にデータをグループ化する必要があります。 クロスタブでは、行と列は*バケット*と呼ばれる特定のグループ項目に基づいています。 バケットの定義には次を含める必要があります-

  • bucketExpression-データグループアイテムを取得するために評価される式。
  • comparatorExpression-値の自然な順序が最良の選択ではない場合に必要です。
  • orderByExpression-データのソートに使用される値を示します。

クロスタブの行および列グループ(上記で定義)は*バケット*に依存しています。

組み込みクロス集計合計変数

以下は、メジャーの現在の値のリストであり、セルに対応するさまざまなレベルの合計は、次のスキームに従って命名された変数を介してアクセスできます

  • メジャー計算の現在の値は、メジャーと同じ名前の変数に保存されます。
  • _ <Measure> _ <Column Group> ALL-これにより、同じ行の列グループ内のすべてのエントリの合計が得られます。
  • _ <メジャー> _ <行グループ> ALL-これにより、同じ列の行グループ内のすべてのエントリの合計が得られます。
  • _ <Measure> _ <Row Group> _ <Column Group> ALL-これにより、行グループと列グループの両方のすべてのエントリに対応する合計が得られます。

クロス集計を実証するために、新しいレポートテンプレート(jasper_report_template.jrxml)を作成しましょう。 ここでは、概要セクションにクロスタブを追加します。 ディレクトリ C:\ tools \ jasperreports-5.0.1 \ test に保存します。 ファイルの内容は以下のとおりです-

<?xml version = "1.0" encoding = "UTF-8"?>

<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
   http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
   name = "jasper_report_template" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <field name = "name" class = "java.lang.String"/>
   <field name = "country" class = "java.lang.String"/>

   <title>
      <band height = "70">

         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>

         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>

            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>

            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>

            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>

         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>

            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>

            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
         </textField>

      </band>
   </title>

   <summary>
      <band height = "60">

      <crosstab>
         <reportElement width = "782" y = "0" x = "0" height = "60"/>

         <rowGroup name = "nameGroup" width = "100">

            <bucket>
               <bucketExpression class = "java.lang.String">
                  <![CDATA[$F{name}]]>
               </bucketExpression>
            </bucket>

            <crosstabRowHeader>

               <cellContents>
                  <box border = "Thin" borderColor = "black"/>

                  <textField>
                     <reportElement width = "100" y = "0" x = "0" height = "20"/>
                     <textElement textAlignment = "Right"
                        verticalAlignment = "Middle"/>

                     <textFieldExpression>
                        <![CDATA[$V{nameGroup}]]>
                     </textFieldExpression>
                  </textField>

               </cellContents>

            </crosstabRowHeader>

         </rowGroup>

         <columnGroup name = "countryGroup" height = "20">
            <bucket>

               <bucketExpression class = "java.lang.String">
                  $F{country}
               </bucketExpression>
            </bucket>

            <crosstabColumnHeader>
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  <textField isStretchWithOverflow = "true">
                     <reportElement width = "60" y = "0" x = "0" height = "20"/>
                     <textElement verticalAlignment = "Bottom"/>
                     <textFieldExpression>
                        <![CDATA[$V{countryGroup}]]>
                     </textFieldExpression>
                  </textField>
               </cellContents>
            </crosstabColumnHeader>

         </columnGroup>

         <measure name = "tailNumCount" class = "java.lang.Integer"
            calculation = "Count">
            <measureExpression>$F{country}</measureExpression>
         </measure>

         <crosstabCell height = "20" width = "60">
            <cellContents backcolor = "#FFFFFF">
               <box borderColor = "black" border = "Thin"/>
               <textField>
                  <reportElement x = "5" y = "0" width = "55" height = "20"/>
                  <textElement textAlignment = "Left"
                     verticalAlignment = "Bottom"/>
                  <textFieldExpression class = "java.lang.Integer">
                      $V{tailNumCount}
                  </textFieldExpression>
               </textField>
            </cellContents>
         </crosstabCell>

      </crosstab>

      </band>
   </summary>

</jasperReport>

上記のファイルの詳細は次のとおりです-

  • クロスタブは、<crosstab>要素によって定義されます。
  • <rowGroup>要素は、データを行に分割するグループを定義します。 ここでは、各行に異なる名前のデータが表示されます。
  • <bucket>要素と<bucketExpression>要素は、<rowGroup>のグループ区切り文字として使用するレポート式を定義します。 ここでは、名前で行を分割するために、名前フィールドを区切り文字として使用しました。
  • <crosstabRowHeader>要素は、行ヘッダーとして使用される式を定義します。 単一のサブ要素、つまり<cellContents>が含まれ、クロスタブ内の内部バンドのように機能します。 <crosstabRowHeader>内のテキストフィールドに変数名を定義する代わりに、<name>属性を介して<rowGroup>に名前を割り当てているため、暗黙的な変数が作成されます。 <crosstabRowHeader>要素は、行全体のヘッダーセルの内容を定義します。 唯一のサブ要素として単一の<cellContents>要素を取ります。
  • <columnGroup>要素とそのサブ要素は、行ではなく列に影響することを除いて、<rowGroup>要素に類似しています。
  • <measure>要素は、行と列にわたって実行される計算を定義します。 _calculation_属性は_Count_に設定されます。
  • <crosstabCell>要素は、ヘッダー以外のセルのデータのレイアウト方法を定義します。 この要素には、その唯一のサブ要素として単一の<crosstabCell>要素も含まれます。

レポート入力のJavaコードは変更されません。 ファイル C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides \ JasperReportFill.java の内容は以下のとおりです-

package com.finddevguides;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName =
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
     /**
 *Passing ReportTitle and Author as parameters
      */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

POJOファイル C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides \ DataBean.java の内容は次のとおりです-

package com.finddevguides;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

ファイル C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides \ DataBeanList.java の内容は次のとおりです-

package com.finddevguides;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

  /**
 *This method returns a DataBean object,
   * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);

      return dataBean;
   }
}

レポート生成

次に、通常のANTビルドプロセスを使用して、上記のファイルをコンパイルして実行します。 ファイルbuild.xmlの内容(ディレクトリC:\ tools \ jasperreports-5.0.1 \ testに保存)は以下のとおりです。

インポートファイル-baseBuild.xmlは、チャプターリンク:/jasper_reports/jasper_environment_setup [Environment Setup]から取得され、build.xmlと同じディレクトリに配置する必要があります。

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the
      report stored in the .JRprint file.">

      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint"/>
         <classpath refid = "classpath"/>
      </java>
   </target>

   <target name = "compilereportdesing" description = "Compiles the JXML file and
      produces the .jasper file.">

      <taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
         <classpath refid = "classpath"/>
      </taskdef>

      <jrc destdir = ".">
         <src>
            <fileset dir = ".">
               <include name = "*.jrxml"/>
            </fileset>
         </src>
         <classpath refid = "classpath"/>
      </jrc>

   </target>

</project>

次に、コマンドラインウィンドウを開き、build.xmlが配置されているディレクトリに移動します。 最後に、次のようにコマンド ant -Dmain-class = com.finddevguides.JasperReportFill (viewFullReportがデフォルトのターゲットです)を実行します-

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.finddevguides.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting to
   [javac] Compiling 3 source files to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faql#noconfig
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

run:
   [echo] Runnin class : com.finddevguides.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger (
   net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 20 minutes 53 seconds

上記のコンパイルの結果、JasperViewerウィンドウが開き、以下の画面に表示されます-

Jasperレポートクロス集計の例

ここでは、各国と名前が集計されていることがわかります。