Jasper-reports-quick-guide
JasperReports-はじめに
レポートとは
レポートは、意味のある、明確に定義され、要約された情報のプレゼンテーションです。 通常、日常的な活動は自動化され、データは意思決定をサポートする「レポート」にまとめられます。 レポートは、通常の乱雑なデータをチャート、グラフ、およびその他の形式のグラフィカル表現に表します。
レポートテンプレート
一般に、ほとんどの商用レポート生成ツールでは、次のレイアウトを採用してレポートを生成します。
TITLE | PAGEHEADER | COLUMNHEADER | DETAIL | COLUMNFOOTER | PAGEFOOTER | SUMMARY |
以下は、図に記載されている各要素の説明です-
S.NO | Element and Description |
---|---|
1 |
title タイトルには、レポートの「タイトル」が含まれます。 レポートの最初に1回だけ表示されます(「チュートリアルポイントレポート」など)。 |
2 |
pageHeader PageHeaderには、日付と時刻の情報や組織名が含まれる場合があります。 これは各ページの上部に表示されます。 |
3 |
columnHeader ColumnHeaderには、レポートに表示する特定のフィールドの名前がリストされます。たとえば、「著者名」、「開始時間」、「終了時間」、「勤務時間」、「日付」などです。 |
4 |
detail 詳細は、特定のフィールドのエントリ(columnHeaderにリストされている)が表示される部分です。たとえば、「Manisha」、「9:00」、「18:00」、「9」、「10.02.2013」です。 |
5 |
columnFooter ColumnFooterは、フィールドの合計を表示する場合があります。たとえば、「Total Hours Worked: "180.」 |
6 |
pageFooter PageFooterにはページ数情報が含まれる場合があります。 たとえば、「1/23」など、各ページの下部に表示されます。 |
7 |
summary 概要には、「詳細」部分から推測された情報が含まれます。たとえば、各著者の労働時間数をリストした後、各著者の労働時間の合計を円グラフやグラフなどの視覚的なグラフに入れることができます。 より良い比較のために。 |
JasperReports
レポート開発中に直面する一般的な問題は次のとおりです-
- コアの変更-通常、レポートのコアロジックを変更するために必要なビジネスの変更または拡張を反映します。
- 結果のエクスポート-レポートは、HTML、テキスト、PDF、MS Excel、RTF、ODT、カンマ区切り値、XML、画像など、さまざまな形式にエクスポートできます。
- 複雑なレポート-サブレポートとクロスタブレポートが良い例です。
- グラフレポート-グラフ、円グラフ、XYライン、棒グラフ、メーター、時系列などの視覚的なグラフ。
上記のポイントのオーバーヘッドを取り除き、レポートプロセスを容易にするために、多くのフレームワーク、ツール、ライブラリ、およびサードパーティアプリケーションが導入されました。 JasperReports はその1つです。
*JasperReports* は、オープンソースのJavaレポートエンジンです。 Javaベースであり、独自の式構文はありません。 JasperReportsには、リッチコンテンツを画面、プリンター、またはPDF、HTML、XLS、RTF、ODT、CSV、TXT、およびXMLファイルに配信する機能があります。 スタンドアロンのツールではないため、単独でインストールすることはできません。 代わりに、アプリケーションのCLASSPATHにライブラリを含めることにより、Javaアプリケーションに埋め込まれます。
JasperReportsはJavaクラスライブラリであり、エンドユーザー向けではなく、アプリケーションにレポート機能を追加する必要があるJava開発者を対象としています。
JasperReportsの機能
JasperReportsの重要な機能のいくつかは-
- 柔軟なレポートレイアウトがあります。
- データをテキストまたはグラフィックで表示できます。
- 開発者は複数の方法でデータを提供できます。
- 複数のデータソースからデータを受け入れることができます。
- 透かしを生成できます(透かしは、主画像の上に置かれる副画像のようなものです)。
- サブレポートを生成できます。
- レポートをさまざまな形式でエクスポートできます。
JasperReports-環境設定
JasperReportsは、純粋なJavaライブラリであり、スタンドアロンアプリケーションではありません。 単独で実行することはできないため、別のクライアントまたはサーバー側のJavaアプリケーションに組み込む必要があります。 Javaベースであるため、Java(JDK 1.3以上)をサポートする任意のプラットフォームで実行できます。 JasperReportのすべての機能は、単一のJARファイル、jasperreports-x.x.x.jarに集められています。 このJARと必須およびオプションのライブラリ(.ZIPファイル)は、次のサイトからダウンロードできます:http://sourceforge.net/projects/jasperreports/files/jasperreports/[JasperReport Library Link]。 このリンクから最新バージョンをダウンロードしてください。
ZIPファイルには、JasperReportsのソースコード、依存JAR、およびJasperReportの機能を示す多くの例とともに、JasperReports JARファイルが含まれています。
JasperReport環境
レポートの作成を開始するには、環境を準備する必要があります。 ダウンロードしたJasperReport.ZIPファイルを任意の場所に解凍します(この例では、C:\ tools \ jasperreports-5.0.1に解凍しました)。 抽出されたファイルのディレクトリ構造は、以下に示すものと同じです-
ここにすべてのディレクトリの詳細があります-
- build-コンパイルされたJasperReportクラスファイルが含まれています。
- demo-JasperReportsの機能のいくつかの側面を示すさまざまな例が含まれています。
- dist-jasperreports-x.x.x.jarファイルが含まれています。 JasperReportsを利用するために、このJARファイルをCLASSPATHに追加します。
- docs-JasperReportsドキュメントのローカルコピーが含まれています。
- lib-JasperReportsの構築とアプリケーションでの使用の両方に必要なすべてのJARが含まれています。
- src-JasperReportsのソースコードが含まれています。
- build.xml-JasperReportsのソースコードをビルドするためのANTビルドファイル。 JasperReportsを変更するつもりがない場合、JasperReportsはコンパイルされた形式で配布されるため、このファイルを使用する必要はありません。
- changes.txt-JasperReportsクラスライブラリの現在のバージョンと以前のバージョンの違いを説明するテキストドキュメント。
- license.txt-LGPL(Lesser General Public License)ライセンスの全文を含むテキストドキュメント。
- readme.txt-提供された例をビルドおよび実行する方法に関する指示を含むテキストドキュメント。
基本的に、レポートの生成には、_dist_の下のjasperreports-x.x.x.jarと_lib_ディレクトリの下のJARのみを使用します。 JasperReportsはオープンソースツールであるため、実行中にjasperreports-x.x.x.jarで欠陥またはバグが認識された場合、build.xmlファイルを使用して修正し、JARを再構築できます。
CLASSPATHを設定する
JasperReportを使用するには、次のファイルをCLASSPATHに設定する必要があります-
- jasperreports-x.x.x.jar、ここでx.x.xはJasperReportsバージョンです。 これは、ディレクトリC:\ tools \ jasperreports-x.x.x \ distの下にあります)。
- _lib_サブディレクトリ(C:\ tools \ jasperreports-x.x.x \ lib)の下のすべてのJARファイル。
インストール時に、JasperReportバージョン5.0.1を使用しました。 「マイコンピュータ」を右クリックして「プロパティ」を選択し、「詳細」タブの下の「環境変数」ボタンをクリックします。 次に、この C:\ tools \ jasperreports-5.0.1 \ dist \ jasperreports-5.0.1.jar:C:\ tools \ jasperreports-5.0.1 \ lib で「パス」変数を更新します。 これで、レポートを作成する準備が整いました。
このチュートリアルのすべての例では、ANTタスクを使用してレポートを生成しました。 build ファイルは、レポートの生成に必要なすべてのJARのインポートを処理します。 したがって、前述のようにCLASSPATHを設定しても、ANTを使用せずにレポートを生成したい場合にのみ役立ちます。
ビルド設定
このチュートリアルのすべての例-
- シンプルなテキストエディタを使用して記述されています。
- ディレクトリC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguidesに保存されています。 Apache ANTを使用して、コマンドプロンプトからコンパイルおよび実行されています。 baseBuild.xml ファイルを使用します。これは、以降の章でANT *build.xml ファイルにインポートします。 このファイルをC:\ tools \ jasperreports-5.0.1 \ testに保存します。 以下はbaseBuild.xmlファイルの内容です-
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportExample" basedir = ".">
<description>Previews our JasperReport XML Design</description>
<property name = "file.name" value = "jasper_report_template"/>
<!-- Directory where the JasperReports project file was extracted
needs to be changed to match the local environment -->
<property name = "jasper.dir" value = "../"/>
<property name = "dist.dir" value = "${jasper.dir}/dist"/>
<property name = "lib.dir" value = "${jasper.dir}/lib"/>
<property name = "src.dir" value = "src"/>
<property name = "classes.dir" value = "classes"/>
<property name = "main-class" value = "com.finddevguides.HelpMe"/>
<path id = "classpath">
<pathelement location = "./"/>
<pathelement location = "${classes.dir}"/>
<fileset dir = "${lib.dir}">
<include name = "**/*.jar"/>
</fileset>
<fileset dir = "${dist.dir}">
<include name = "**/*.jar"/>
</fileset>
</path>
<target name = "compile" depends = "clean-sample">
<mkdir dir = "${classes.dir}"/>
<javac srcdir = "${src.dir}" destdir = "${classes.dir}"
classpathref = "classpath"/>
</target>
<target name = "run" depends = "compile">
<echo message = "Running class : ${main-class}"/>
<java fork = "true" classname = "${main-class}">
<classpath>
<path refid = "classpath"/>
</classpath>
</java>
</target>
<target name = "clean-sample">
<delete dir = "${classes.dir}"/>
<delete file = "./${file.name}.jasper"/>
<delete file = "./${file.name}.jrprint"/>
</target>
</project>
このファイルには、ディレクトリのクリーニング、Javaファイルのコンパイル、クラスファイルの実行など、必要なすべてのターゲットが含まれています。
以下は、baseBuild.xmlのさまざまなディレクトリで言及されている詳細です。 現在のディレクトリがC:\ tools \ jasperreports-5.0.1 \ testであると仮定)-
- jasper.dir-はC:\ tools \ jasperreports-5.0.1ディレクトリです
- lib.dir-はC:\ tools \ jasperreports-5.0.1 \ libディレクトリです
- src.dir-はC:\ tools \ jasperreports-5.0.1 \ test \ srcです
- classes.dir-はC:\ tools \ jasperreports-5.0.1 \ test \ classesです
- main-class-com.finddevguides.HelpMe。 このクラスは、コマンドラインからクラスファイル名が渡されないときに実行される単純なクラスです。 このファイルをC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguidesに保存します。
package com.finddevguides;
public class HelpMe {
public static void main(String[] args) {
System.out.println("This is the default class executed."
+ "Please pass the fully qualified class" + " name to be executed as command line"
+ " parameter, for example," + " com.finddevguides.HelpMe ");
}
}
ジャスパーマネージャークラス
JRXMLレポートデザインのコンパイル、レポートの入力、レポートの印刷、PDF、HTMLおよびXMLファイルへのエクスポート、生成されたレポートの表示、およびレポートデザインに使用されるクラスがいくつかあります。
これらのクラスのリストは-
- net.sf.jasperreports.engine.JasperCompileManager-JRXMLレポートテンプレートをコンパイルするために使用されます。
- net.sf.jasperreports.engine.JasperFillManager-データソースからのデータをレポートに入力するために使用されます。
- net.sf.jasperreports.engine.JasperPrintManager-JasperReportsライブラリによって生成されたドキュメントの印刷に使用されます。
- net.sf.jasperreports.engine.JasperExportManager-レポート入力プロセスで作成されたドキュメントのPDF、HTML、またはXMLコンテンツを取得するために使用されます。
- net.sf.jasperreports.view.JasperViewer-レポートをロードおよび表示できる単純なJava Swingアプリケーションを表します。
- net.sf.jasperreports.view.JasperDesignViewer-設計時にレポートテンプレートをプレビューするために使用されます。
Apache ANTのセットアップ
Apache ANTを使用してすべての例をビルドします。 リンクを確認してください:/ant/ant_environment [ANT-Environment Setup]の章で、システムにApache ANTをセットアップしてください。
JasperReports-ライフサイクル
JasperReportsの主な目的は、簡単で柔軟な方法で文書を印刷できるページ指向の作成です。 次のフローチャートは、レポート作成中の一般的なワークフローを示しています。
画像に示されているように、ライフサイクルには次の明確なフェーズがあります-
- link:/jasper_reports/jasper_report_designs [レポートの設計]-このステップでは、レポートレイアウトの定義を含むXMLドキュメントであるJRXMLファイルを作成します。 任意のテキストエディターまたはhttp://community.jaspersoft.com/wiki/ireport-designer-getting-started[iReportDesigner]を使用して手動で作成できます。 iReportDesignerを使用する場合、レイアウトは視覚的な方法で設計されるため、JRXMLの実際の構造は無視できます。
- link:/jasper_reports/jasper_compiling_report_design [レポートのコンパイル]-このステップでは、JRXMLはJasperファイル(* .jasper)と呼ばれるバイナリオブジェクトにコンパイルされます。 このコンパイルはパフォーマンス上の理由で行われます。 Jasperファイルは、レポートを実行するためにアプリケーションと共に出荷する必要があるものです。
- link:/jasper_reports/jasper_filling_reports [レポートの実行(レポートへのデータの入力)]-このステップでは、アプリケーションからのデータがコンパイルされたレポートに入力されます。 クラスnet.sf.jasperreports.engine.JasperFillManagerは、レポートにデータを入力するために必要な機能を提供します。 Jasper印刷ファイル(* .jrprint)が作成され、レポートの印刷またはエクスポートに使用できます。
- link:/jasper_reports/jasper_exporting_reports [レポートを目的の形式にエクスポート]-この手順では、前の手順で作成したJasper印刷ファイルを、JasperExportManagerを使用して任意の形式にエクスポートできます。 Jasperはさまざまな形式のエクスポートを提供するため、同じ入力で、データの複数の表現を作成できます。
上記の各ステップの詳細な概要は、以降の章で説明します。
JasperReports-デザイン
JasperReportのJRXMLテンプレート(またはJRXMLファイル)は、拡張子が.jrxmlの標準XMLファイルです。 すべてのJRXMLファイルには、タグ<jasperReport>がルート要素として含まれています。 これには、多くのサブ要素が含まれます(これらはすべてオプションです)。 JasperReportフレームワークは、さまざまな種類のデータソースを処理できます。 このチュートリアルでは、Javaデータオブジェクトのコレクション(Java Beanを使用)をJasperReport Engineに渡すだけで、基本的なレポートを生成する方法を示します。 最終レポートには、名前と国を含むカテゴリを持つ人々のリストが表示されます。
この章では、次の手順について説明します— JasperReportの設計方法-
- JRXMLレポートテンプレートの作成。
- XMLレポートテンプレートのプレビュー。
JRXMLレポートテンプレートの作成
テキストエディタを使用して jasper_report_template.jrxml である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">
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3" width = "535"
height = "15" backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]> </text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0" width = "535"
height = "14" backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]> </text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
上記のレポートテンプレートの主なフィールドの詳細は次のとおりです-
- <queryString>-これは空です(Java Beansを介してデータを渡しているため)。 通常、レポート結果を取得するSQLステートメントが含まれます。 <field name>-この要素は、データソースまたはクエリからレポートテンプレートにデータをマップするために使用されます。 name *はレポート本文で再利用され、大文字と小文字が区別されます。
- <fieldDescription>-この要素は、フィールド名をXMLファイル内の適切な要素にマップします。
- <staticText>-これは、データソース、変数、パラメーター、またはレポート式に依存しない静的テキストを定義します。
- <textFieldExpression>-これは、結果フィールドの外観を定義します。
- $ F \ {country}-これは、タグ<field name>の定義済みフィールドの結果の値を含む変数です。
- <band>-バンドにはデータが含まれ、レポートに表示されます。
レポートデザインの準備ができたら、C:\ディレクトリに保存します。
XMLレポートテンプレートのプレビュー
JasperReports JARファイルにはユーティリティ_net.sf.jasperreports.view.JasperDesignViewer_が用意されており、コンパイルまたは入力することなくレポートデザインをプレビューできます。 このユーティリティはスタンドアロンJavaアプリケーションであるため、ANTを使用して実行できます。
ANTターゲット viewDesignXML を作成して、JRXMLを表示します。 したがって、C:\ tools \ jasperreports-5.0.1 \ testディレクトリの下に build.xml を作成して保存します(JRXMLが配置されているディレクトリと同じディレクトリに配置する必要があります)。 ここにbuild.xmlファイルがあります-
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewDesignXML" basedir = ".">
<import file = "baseBuild.xml"/>
<target name = "viewDesignXML" description = "Design viewer is
launched to preview the JXML report design.">
<java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
<arg value = "-XML"/>
<arg value = "-F${file.name}.jrxml"/>
<classpath refid = "classpath"/>
</java>
</target>
</project>
次に、コマンドプロンプトを開き、build.xmlが配置されているディレクトリに移動しましょう。 コマンド ant を実行します(viewDesignXMLがデフォルトのターゲットであるため)。 出力は次のとおりです-
C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
viewDesignXML:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[java] log4j:WARN Please initialize the log4j system properly.
Log4jの警告は無視できます。上記の実行の結果、「JasperDesignViewer」というラベルのウィンドウが開き、レポートテンプレートのプレビューが表示されます。
ご覧のとおり、JasperDesignViewerは実際のデータソースまたはレポートパラメーターにアクセスできないため、データを取得するためのレポート式のみが表示されます。 ウィンドウを閉じるか、コマンドラインウィンドウでCtrl-cを押して、JasperDesignViewerを終了します。
JasperReports-レポートデザインのコンパイル
前の章でJasperReportテンプレート(JRXMLファイル)を生成しました。 このファイルを直接使用してレポートを生成することはできません。 Jasper ファイルと呼ばれるJasperReportのネイティブバイナリ形式にコンパイルする必要があります。 コンパイル時に、JasperDesignオブジェクトをJasperReportオブジェクトに変換します-
インターフェース_net.sf.jasperreports.engine.design.JRCompiler_は、コンパイル時に中心的な役割を果たします。 このインターフェイスには、レポート式に使用される言語に応じていくつかの実装があり、コンパイラー実装が実行時に評価できる限り、Java、Groovy、JavaScript、またはその他のスクリプト言語で記述できます。
次の2つの方法でJRXMLファイルをコンパイルできます-
- プログラムによるコンパイル。
- ANTタスクによるコンパイル。
JRXMLのプログラムによるコンパイル
JasperReports APIは、JasperReportをコンパイルするためのファサードクラス_net.sf.jasperreports.engine.JasperCompileManager_を提供します。 このクラスは、レポートテンプレートをコンパイルするためのいくつかのパブリックな静的メソッドで構成されています。 テンプレートのソースは、ファイル、入力ストリーム、メモリオブジェクトなどです。
JRXMLファイル(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">
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3"
width = "535" height = "15" backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]> </text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0"
width = "535" height = "14" backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]> </text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
次のコードは、上記の_jasper_report_template.jrxml_ファイルのコンパイルを示しています。
package com.finddevguides;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
public class JasperReportCompile {
public static void main(String[] args) {
String sourceFileName = "C://tools/jasperreports-5.0.1/test" +
"/jasper_report_template.jrxml";
System.out.println("Compiling Report Design ...");
try {
/**
*Compile the report to a file name same as
* the JRXML file name
*/
JasperCompileManager.compileReportToFile(sourceFileName);
} catch (JRException e) {
e.printStackTrace();
}
System.out.println("Done compiling!!! ...");
}
}
テンプレートのコンパイル
次のステップとして、上記のコンテンツをファイル C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides \ JasperReportCompile.java に保存し、次のようにbuild.xmlファイルに_baseBuild.xml_をインポートします。 baseBuild.xmlにはすでに compile および run ターゲットがあります-
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "run" basedir = ".">
<import file = "baseBuild.xml"/>
</project>
次に、コマンドラインウィンドウを開き、build.xmlが配置されているディレクトリに移動します。 最後に、コマンド ant -Dmain-class = com.finddevguides.JasperReportCompile を-として実行します。
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.finddevguides.JasperReportCompile
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
compile:
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:27:
warning: 'includeantruntime' was not set, defaulting to
build.sysclasspath=last;set to false for repeatable builds
[javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes
run:
[echo] Runnin class : com.finddevguides.JasperReportCompile
[java] Compiling Report Design ...
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[java] log4j:WARN Please initialize the log4j system properly.
[java] Done compiling!!! ...
BUILD SUCCESSFUL
Total time: 8 seconds
上記のコンパイルの結果、テンプレートファイル_jasper_report_template.jasper_がC:\ tools \ jasperreports-5.0.1 \ testディレクトリに生成されたことがわかります。
コンパイル済みレポートテンプレートのプレビュー
_net.sf.jasperreports.view.JasperDesignViewer_を使用して、コンパイルされたレポートテンプレートとJRXMLテンプレートをプレビューできます。
さらに先に進むには、上記のbuild.xmlファイルに新しいターゲット viewDesign を追加して、コンパイルされたレポートをプレビューできるようにします。 以下は、修正されたbuild.xmlです-
インポートファイル-baseBuild.xmlは、チャプターリンク:/jasper_reports/jasper_environment_setup [Environment Setup]から選択され、build.xmlと同じディレクトリに配置する必要があります。
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewDesign" basedir = ".">
<import file = "baseBuild.xml"/>
<target name = "viewDesign" description="Design viewer is launched
to preview the compiled report design.">
<java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
<arg value = "-F${file.name}.jasper"/>
<classpath refid = "classpath"/>
</java>
</target>
</project>
コマンドプロンプトでコマンド- ant (viewDesignがデフォルトのターゲット)を実行しましょう。 JasperDesignViewerウィンドウが開き、以下のようにJasperファイルが表示されます-
ANTタスクを介したコンパイル
レポートテンプレートのコンパイルは、実行時ジョブよりも設計時ジョブに似ているため、JasperReportライブラリにはカスタムANTタスクがあります。 特定の状況では、JRXMLファイルが実行時に作成されると、このANTタスクを使用できません。 カスタムANTタスクはJRCと呼ばれ、_net.sf.jasperreports.ant.JRAntCompileTask_クラスによって実装されます。 その構文と動作は、組み込みの <javac> ANTタスクに非常に似ています。
テンプレートのコンパイル
新しいターゲット compilereportdesing を既存のbuild.xmlに追加しましょう。 ここでは、ソースフォルダーは、ネストされた<src>タグとファイルセットを使用して指定されます。 ネストされたソースタグを使用すると、さまざまな場所に散在し、単一のルートレポートソースフォルダーの下にグループ化されていないレポートテンプレートをコンパイルできます。 以下は、修正されたbuild.xmlです-
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "compilereportdesing" basedir = ".">
<import file = "baseBuild.xml"/>
<target name = "viewDesign" description = "Design viewer is
launched to preview the compiled report design.">
<java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
<arg value = "-F${file.name}.jasper"/>
<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 を実行します(compilereportdesingがデフォルトのターゲットです)。出力は次のとおりです-
C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
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.
BUILD SUCCESSFUL
Total time: 5 seconds
ファイル_jasper_report_template.jasper_がファイルシステム(この例ではC:\ tools \ jasperreports-5.0.1 \ testディレクトリ)に生成されます。 このファイルは、net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile()を呼び出してプログラムで生成されたファイルと同じです。 ant viewDesign を実行して、このジャスパーファイルをプレビューできます。
JasperReports-レポートの記入
レポート作成ツールの主な目的は、高品質のドキュメントを作成することです。 レポート入力プロセスは、データのセットを操作することでレポートツールがこれを達成するのに役立ちます。
レポート記入プロセスに必要な主な入力は次のとおりです-
- レポートテンプレート-これは実際のJasperReportファイルです。
- レポートパラメータ-これらは基本的に、レポート入力時にエンジンに渡される名前付きの値です。 それらについては、link:/jasper_reports/jasper_report_parameters [Report Parameter]の章で説明します。
- データソース-SQLクエリ、XMLファイル、csvファイル、HQL(Hibernate Query Language)クエリ、Java Beansのコレクションなど、さまざまなデータソースからJasperファイルを入力できます。 これについては、link:/jasper_reports/jasper_report_data_sources [レポートデータソース]の章で詳しく説明します。
このプロセスによって生成される出力は、表示、印刷、または他の形式へのエクスポートが可能な .jrprint ドキュメントです。 ファサードクラス_net.sf.jasperreports.engine.JasperFillManager_は通常、レポートテンプレートにデータを入力するために使用されます。 このクラスには、レポートテンプレートを埋めるさまざまな_fillReportXXX()_メソッドがあります(テンプレートは、ディスクに配置したり、入力ストリームから選択したり、インメモリとして直接提供したりできます)。
このファサードクラスには、fillReportXXX()メソッドの2つのカテゴリがあります-
- 最初のタイプは、3番目のパラメーターとしてjava.sql.Connectionオブジェクトを受け取ります。 ほとんどの場合、レポートにはリレーショナルデータベースのデータが入力されます。 これは以下によって達成されます-
- JDBCを介してデータベースに接続します。
- レポートテンプレート内にSQLクエリを含めます。
- JasperReportsエンジンは、渡された接続を使用してSQLクエリを実行します。
- このようにして、レポートを埋めるためのレポートデータソースが生成されます。
- 2番目のタイプは、入力が必要なデータが他のフォームで利用可能な場合に、net.sf.jasperreports.engine.JRDataSourceオブジェクトを受け取ります。
レポートテンプレートの入力
レポートテンプレートを作成しましょう。 JRXMLファイル(C:\ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml)の内容は以下のとおりです-
<?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">
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3"
width = "535" height = "15" backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]> </text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0"
width = "535" height = "14" backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]> </text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
次に、Javaデータオブジェクト(Java Bean)のコレクションをJasperReport Engineに渡して、このコンパイル済みレポートに入力します。
データオブジェクト(Java Bean)を表すPOJO DataBean.javaを記述します。 このクラスは、2つのStringオブジェクト、つまり 「名前」と「国」。 それをディレクトリ C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides に保存します。
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;
}
}
Java Beanオブジェクトのコレクションを生成するビジネスロジックを持つクラスDataBeanList.javaを記述します。 これはさらにJasperReportsエンジンに渡され、レポートを生成します。 ここでは、リストに4つのDataBeanオブジェクトを追加しています。 それをディレクトリ C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides に保存します。
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;
}
}
メインクラスファイル JasperReportFill.java を作成します。このファイルは、クラス(DataBeanList)からJava Beanコレクションを取得し、それをJasperReportsエンジンに渡して、レポートテンプレートに入力します。 それをディレクトリ C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides に保存します。
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();
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
レポートを生成する
通常のANTビルドプロセスを使用して、これらのファイルをコンパイルして実行します。 build.xmlファイルは以下のとおりです-
インポートファイル-baseBuild.xmlは、チャプターリンク:/jasper_reports/jasper_environment_setup [Environment Setup]から選択され、build.xmlと同じディレクトリに配置する必要があります。
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
<import file = "baseBuild.xml"/>
<target name = "executereport" depends = "compile,compilereportdesing,run">
<echo message = "Im here"/>
</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 ( executereport がデフォルトのターゲット)を実行します-
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.finddevguides.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
compile:
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:27:
warning: 'includeantruntime' was not set, defaulting to
build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 1 source file to
C:\tools\jasperreports-5.0.1\test\classes
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.
BUILD SUCCESSFUL
Total time: 8 seconds
上記の実行の結果、ファイル_jasper_report_template.jrprint_が_.jasper_ファイルと同じディレクトリに生成されます(この場合、C:\ tools \ jasperreports-5.0.1 \ testに生成されます)。
ジャスパーレポート-レポートの表示と印刷
レポート入力プロセス_JasperPrintオブジェクト_の出力は、組み込みのビューアコンポーネントを使用して表示したり、印刷したり、PDF、HTML、RTF、XLS、ODT、CSV、XMLなどの一般的なドキュメント形式にエクスポートしたりできます。 Jasperドキュメントの表示と印刷についてはこの章で説明し、エクスポートについては次の章で説明します。 リンク:/jasper_reports/jasper_exporting_reports ['レポートのエクスポート']
レポートを表示する
JasperReportは、生成されたレポートを元の形式で表示するためのビルトインビューアーを提供します。 これはスイングベースのコンポーネントであり、他のJavaアプリケーションは、表示または印刷するためにドキュメントを他の形式にエクスポートすることなく、このコンポーネントを統合できます。 _net.sf.jasperreports.view.JRViewer_クラスは、この視覚的なコンポーネントを表します。 このクラスは、サブクラス化することにより、アプリケーションのニーズに応じてカスタマイズすることもできます。
JasperReportsには、レポートを表示するための視覚コンポーネントを使用するSwingアプリケーションもあります。 このアプリケーションは、*。jrprintが生成されるのと同じ形式でレポートを表示するのに役立ちます。 このSwingアプリケーションは、_net.sf.jasperreports.view.JasperViewer_クラスに実装されています。 このクラスを使用してレポートを表示するには、ANTターゲットにラップする必要があります。
生成されたレポートの表示
次の例は、JasperViewerクラスを使用してレポートを表示する方法を示しています-
レポートテンプレートを作成しましょう。 JRXMLファイル(C:\ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml)の内容は以下のとおりです-
<?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">
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3"
width = "535" height = "15" backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]> </text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0"
width = "535" height = "14" backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]> </text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
次に、Javaデータオブジェクト(Java Bean)のコレクションをJasperReports Engineに渡して、このコンパイル済みレポートに入力します。
データオブジェクト(Java Bean)を表すPOJO DataBean.javaを記述します。 このクラスは、2つのStringオブジェクト、つまり 「名前」と「国」。それをディレクトリ C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides に保存します。
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;
}
}
Java Beanオブジェクトのコレクションを生成するビジネスロジックを持つクラスDataBeanList.javaを記述します。 これはさらにJasperReportsエンジンに渡され、レポートを生成します。 ここでは、リストに4つのDataBeanオブジェクトを追加しています。 それをディレクトリ C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides に保存します。
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;
}
}
メインクラスファイル JasperReportFill.java を作成します。このファイルは、クラス(DataBeanList)からJava Beanコレクションを取得し、それをJasperReportsエンジンに渡して、レポートテンプレートに入力します。 それをディレクトリ C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides に保存します。
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();
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
ターゲット viewFillReport をbuild.xmlファイルに書き込みましょう。 build.xmlファイルは次のとおりです-
インポートファイル-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 を実行します(viewFillReportがデフォルトのターゲットです)。 その結果、以下の画面に示すように、JasperViewerウィンドウが表示されます-
レポートの印刷
JasperReportsライブラリによって生成されたドキュメントを独自の形式(つまり、 _JasperPrint_オブジェクト)_net.sf.jasperreports.engine.JasperPrintManager_クラスを使用します。 これは、Java 2 Printing APIに依存するファサードクラスです。 JasperReportドキュメントがHTMLやPDFなどの他の形式にエクスポートされたら、ドキュメントを印刷することもできます。
生成されたレポートの印刷
次のコードは、レポートの印刷を示しています。 既存のクラスJasperReportFillを更新しましょう。 JasperPrintManager.printReport()_メソッドを使用します。 このメソッドは、ソースファイル名(ここでは、JasperFillManager.fillReportToFile()メソッドを使用して前のステップで生成した.jrprint_ファイルを渡します)を最初のパラメーターとして使用します。 2番目のパラメーターは、標準の印刷ダイアログを表示するためのブール値です(ここでは true に設定しています)。
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.JasperPrintManager;
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";
String printFileName = null;
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource = new
JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
try {
printFileName = JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
if(printFileName != null){
JasperPrintManager.printReport( printFileName, true);
}
} catch (JRException e) {
e.printStackTrace();
}
}
}
次に、このファイルをディレクトリ C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides に保存します。 ANTを使用してこのファイルをコンパイルして実行します。 build.xmlの内容は以下のとおりです-
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
<import file = "baseBuild.xml"/>
<target name = "executereport" depends = "compile,compilereportdesing,run">
<echo message = "Im here"/>
</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.JasperReportPrint を実行します。 その結果、印刷ダイアログボックスが表示されます。 [OK]をクリックしてドキュメントを印刷します。
JasperReports-レポートのエクスポート
前の章で、JasperReportで生成されたドキュメントを印刷および表示する方法を見てきました。 ここでは、これらのレポートをPDF、HTML、XLSなどの他の形式に変換またはエクスポートする方法を説明します。 この機能を実現するために、ファサードクラス_net.sf.jasperreports.engine.JasperExportManager_が提供されています。 エクスポートとは、_JasperPrint_オブジェクト(.jrprintファイル)を別の形式に変換することです。
次のコード(JasperReportExport.java)は、JasperReportドキュメントのエクスポートプロセスを示しています。 JasperExportManagerは、レポートをPDF、HTML、およびXMLのみにエクスポートするメソッドを提供します。 XLS形式にエクスポートするために、クラス_net.sf.jasperreports.engine.export.JRXlsExporter_を使用しました。 このコードは、次の3つのファイルを生成します-
- sample_report.pdf
- sample_reportl
- sample_report.xls
他の形式へのエクスポート
レポートテンプレートを作成しましょう。 JRXMLファイル(C:\ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml)の内容は以下のとおりです-
<?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">
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3"
width = "535" height = "15" backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]> </text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0"
width = "535" height = "14" backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text><![CDATA[]]> </text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
次に、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;
}
}
メインクラスファイル JasperReportFill.java を作成します。このファイルは、クラス(DataBeanList)からJava Beanコレクションを取得し、それをJasperReportsエンジンに渡して、レポートテンプレートに入力します。 それをディレクトリ C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides に保存します。
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.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRXlsExporter;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName = "c://tools/jasperreports-5.0.1/"
+ "test/jasper_report_template.jasper";
String printFileName = null;
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource =
new JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
try {
printFileName = JasperFillManager.fillReportToFile(sourceFileName,
parameters, beanColDataSource);
if (printFileName != null) {
/**
*1- export to PDF
*/
JasperExportManager.exportReportToPdfFile(printFileName,
"C://sample_report.pdf");
/**
*2- export to HTML
*/
JasperExportManager.exportReportToHtmlFile(printFileName,
"C://sample_reportl");
/**
*3- export to Excel sheet
*/
JRXlsExporter exporter = new JRXlsExporter();
exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME,
printFileName);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
"C://sample_report.xls");
exporter.exportReport();
}
} catch (JRException e) {
e.printStackTrace();
}
}
}
ここには、ジャスパー印刷ファイルをpdf、html、xls形式にエクスポートするロジックが含まれています。
レポートを生成する
通常のANTビルドプロセスを使用して、上記のファイルをコンパイルして実行しましょう。 build.xmlファイルは以下のとおりです-
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
<import file = "baseBuild.xml"/>
<target name = "executereport" depends = "compile,compilereportdesing,run">
<echo message = "Im here"/>
</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が配置されているディレクトリC:\ tools \ jasperreports-5.0.1 \ testに移動します。 最後に、コマンド ant -Dmain-class = com.finddevguides.JasperReportFill を実行します。 出力は次のとおりです-
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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 t
[javac] Compiling 4 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.
executereport:
[echo] Im here
BUILD SUCCESSFUL
Total time: 32 seconds
上記の実行の結果、3つのファイルsample_report.pdf、sample_reportl、sample_report.xlsがC:\ディレクトリに生成されます。
レポートパラメータ
レポートを入力するための主な入力は、レポートテンプレート、パラメーター、およびデータソースです。 この章ではパラメータについて説明し、次の章ではデータソースについて説明します。
パラメータはオブジェクト参照であり、レポート入力操作中にレポートエンジンに渡されます。 データソースを介して渡すことができないデータは、パラメーターを使用して渡すことができます。 著者名、レポートのタイトルなどのデータ パラメータを介して渡すことができます。 JasperReportsテンプレートまたはJRXMLテンプレートには、0個以上のパラメーター要素を含めることができます。
パラメータ宣言
次のようなパラメータ宣言-
<parameter name = "exampleParameter" class = "java.lang.String"/>
名前属性
<parameter>要素の_name_属性は必須です。 レポート式のパラメーターを名前で参照します。 パラメータ名は単一の単語である必要があります。 ドットやコンマなどの特殊文字を含めることはできません。
クラス属性
_class_属性も必須であり、パラメーター値のクラス名を指定します。 デフォルト値は_java.lang.String_です。 これは、実行時に使用可能な任意のクラスに変更できます。 レポートパラメーターのタイプに関係なく、エンジンは$ P \ {}トークンが使用されているレポート式のキャストを処理するため、手動キャストを行う必要はありません。
レポートパラメータ値は、常にパラメータ名をキーとして持つjava.util.Mapオブジェクトにパックされます。 データベースから取得したデータセットをさらにカスタマイズするために、レポートのクエリ文字列でレポートパラメーターを使用できます。 これらは、レポートのデータを提供するクエリの動的フィルターのように機能します。
組み込みパラメーター
以下は、式で使用する準備ができて、事前に定義されたレポートパラメータです-
S.NO | Parameter Name and Description |
---|---|
1 |
REPORT_PARAMETERS_MAP すべてのユーザー定義および組み込みパラメーターを含むマップが含まれています。 |
2 |
REPORT_CONNECTION これは、JDBCデータソースに使用されるユーザー提供のクラスjava.sql.Connectionを指します。 |
3 |
REPORT_DATA_SOURCE これは、組み込みのデータソースタイプの1つまたはユーザー定義の1つを表す、JRDataSourceのユーザー提供のインスタンスです。 |
4 |
REPORT_MAX_COUNT これは_java.lang.Integer_値であり、ユーザーはデータソースからのレコードを制限できます。 |
5 |
REPORT_SCRIPTLET これは_net.sf.jasperreports.engine.JRAbstractScriptlet_を指し、ユーザーが提供するレポートスクリプトレットのインスタンスが含まれます。 |
6 |
REPORT_LOCALE これは、リソースバンドルの目的のロケールを含む_java.util.Locale_インスタンスです。 |
7 |
REPORT_RESOURCE_BUNDLE これは_java.util.ResourceBundle_オブジェクトを指し、ローカライズされたメッセージが含まれます。 |
8 |
REPORT_TIME_ZONE これは_java.util.TimeZone_インスタンスであり、日付のフォーマットに使用されます。 |
9 |
REPORT_VIRTUALIZER これは_net.sf.jasperreports.engine.JRVirtualizer_オブジェクトのインスタンスであり、ページの仮想化に使用されます(メモリ消費を最適化します)。 |
10 |
REPORT_CLASS_LOADER これは、画像、フォント、サブレポートテンプレートなどのリソースをロードするためのレポート入力プロセス中に使用される_java.lang.ClassLoader_インスタンスです |
11 |
IS_IGNORE_PAGINATION _java.lang.Boolean.TRUE_に設定すると、レポートは1つの長いページで生成され、改ページは発生しません。 |
例
_ReportTitle_と_Author_をレポート(JasperReportFill.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;
}
}
<* ReportTitle >および< Author *>のパラメーターを既存のレポートテンプレートに追加しましょう(チャプターリンク:/jasper_reports/jasper_report_designs [Report Designs])。 レポートのタイトルと作成者は、レポートの先頭に表示されます。 改訂されたレポートテンプレート(jasper_report_template.jrxml)は次のとおりです。 C:\ tools \ jasperreports-5.0.1 \ testディレクトリに保存します-
<?xml version = "1.0"?>
<!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" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<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>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text>
<![CDATA[Country]]>
</text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
レポート生成
通常の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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 7 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: 18 seconds
上記のコンパイルの結果、次の画面に示すようにJasperViewerウィンドウが開きます-
ここで、レポートの先頭にReportTitleの「連絡先のリスト」と作成者の「Manishaによって準備」が表示されていることがわかります。
レポートデータソース
データソースは構造化されたデータコンテナです。 レポートの生成中に、JasperReportsエンジンはデータソースからデータを取得します。 データベース、XMLファイル、オブジェクトの配列、およびオブジェクトのコレクションからデータを取得できます。 チャプターリンク:/jasper_reports/jasper_filling_reports [Filling Reports]で確認したように、fillReportXXX()メソッドは、 net.sf.jasperreports.engine.JRDataSourceの形式で、レポートのデータソースを受け取る必要があります。 オブジェクトまたは java.sql.Connection (レポートデータがリレーショナルデータベースで見つかった場合)。
JRDataSourceインターフェイスには、実装する必要がある2つのメソッドしかありません-
- public boolean next()はJRExceptionをスローします。
- レポート入力時に、このメソッドは、データを反復処理するときにレポートエンジンによってデータソースオブジェクトで呼び出されます。
- public Object getFieldValue(JRField jrField)はJRExceptionをスローします。
- このメソッドは、現在のデータソースレコードの各レポートフィールドの値を提供します。
データソースからデータを取得する唯一の方法は、レポートフィールドを使用することです。 JRDataSourceインターフェイスには、データソースのレコードを取得する方法に応じて、いくつかのデフォルトの実装があります。
データソースの実装
以下の表は、データソースとその実装クラスをまとめたものです-
Datasource | Implementation Class |
---|---|
JDBC | net.sf.jasperreports.engine.JRResultSetDataSource |
JavaBean | net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource |
Map-based | net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource |
TableModel | net.sf.jasperreports.engine.data.JRTableModelDataSource |
XML | net.sf.jasperreports.engine.data.JRXmlDataSource |
CSV | net.sf.jasperreports.engine.data.JRCsvDataSource |
XLS | net.sf.jasperreports.engine.data.JRXlsDataSource |
Empty | net.sf.jasperreports.engine.JREmptyDataSource |
JDBCデータソース
クラス JRResultSetDataSource は_java.sql.ResultSet_オブジェクトを作成します。 これは、リレーショナルデータベースからレポートデータが抽出されるときに最も一般的に使用されるデータソース実装です。 代わりに_java.sql.Connection_がエンジンに渡される場合、最初に関連するクエリが実行され、返された_java.sql.ResultSet_オブジェクトがJRResultSetDataSourceインスタンスに格納されます。
JavaBeanデータソース
クラス JRBeanArrayDataSource および JRBeanCollectionDataSource は、JavaBeanオブジェクトの配列とコレクションをラップできる実装を表します。 配列またはコレクション内の各オブジェクトは、このタイプのデータソースの1つのレコードと見なされます。 特定のJavaBeanプロパティと対応するレポートフィールド間のマッピングは、命名規則によって行われます。 レポートフィールドの名前は、JavaBeans仕様で指定されているJavaBeanプロパティの名前と同じである必要があります。
このチュートリアルのすべての例では、JRBeanCollectionDataSourceを使用しました。
マップベースのデータソース
実装クラス JRMapArrayDataSource および JRMapCollectionDataSource は、親アプリケーションが既に_java.util.Map objects_として使用可能なレポートデータをメモリ内に保存している場合に役立ちます。 ラップされた配列またはコレクション内の各Mapオブジェクトは、データソース内の仮想レコードと見なされ、各レポートフィールドの値は、キーとして指定されたレポートフィールドを使用してマップから抽出されます。
TableModelデータソース
多くのクライアント側アプリケーションでは、データは表形式で表示されます。 多くのアプリケーションの一般的な要件は、ユーザーがこの表形式をレポートとして印刷できるようにすることです。 実装クラス JRTableModelDataSource は、表形式からレポートを生成するタスクをSwingアプリケーションにとって簡単にします。 このクラスはjavax.swing.table.TableModelオブジェクトをラップします。 ラップされたTableModelオブジェクトの列には、名前または0ベースのインデックスのいずれかでアクセスできます。
XMLデータソース
クラス JRXmlDataSource は、XOM式を使用してXMLドキュメントからデータを選択するDOMに基づくデータソース実装です。 XMLデータソースのレコードは、XPath式で選択されたノード要素によって表されます。 フィールドの値は、フィールドの説明(JRXMLの<fieldDescription>要素)で提供されるXPath式を使用して各レコードから取得されます。
XPathは、XMLドキュメントの属性と要素をナビゲートするために使用される言語です。 XPathの詳細については、http://www.w3.org/TR/xpathをご覧ください。
CSVデータソース
*JRCsvDataSource* は、構造化テキストファイルからデータを取得するデータソースの実装を表します。通常、CSV。 フィールド値は、列インデックスを使用して取得されます。
XLSデータソース
*JRXlsDataSource* は、Excelドキュメントからデータを取得するデータソースの実装を表します。 このデータソース実装のレポートフィールドマッピングは、フィールド列インデックスにも基づいています。
空のデータソース
*JREmptyDataSource* クラスは、指定された数の仮想空レコードが内部にあるデータソースをシミュレートします。 UIツールで使用され、基本的なレポートプレビュー機能を提供したり、特別なレポートテンプレートで使用したり、テストやデバッグの目的で使用したりします。
巻き取り可能なデータソース
*net.sf.jasperreports.engine.JRRewindableDataSource* は、基本的な_JRDataSource_インターフェースを拡張します。 moveFirst()と呼ばれるメソッドを1つだけインターフェースに追加します。 このメソッドは、データソースの最初の要素にカーソルを移動することを目的としています。
巻き戻し可能なデータソースは、isSplitAllowed = "false"設定が原因で分割が許可されていないサブレポートをバンド内に配置し、現在のページにサブレポートを表示するための十分なスペースがない場合に役立ちます。
上記のすべてのデータソース実装は、 JRResultSetDataSource を除いて巻き戻し可能です。これは、レコードポインターを戻すことをサポートしていないためです。 これは、サブレポートに渡す前にjava.sql.ResultSetをラップするためにこのデータソースを手動で使用する場合にのみ問題を引き起こします。 SQLクエリがサブレポートテンプレートにある場合、問題はありません。エンジンが次のページでサブレポートを再起動するときに、SQLクエリが再度実行されるためです。
データソースプロバイダー
JasperReportsライブラリには、 net.sf.jasperreports.engine.JRDataSourceProvider というインターフェースがあります。 これは、データソースオブジェクトの作成と破棄に役立ちます。 GUIツールを使用してレポートテンプレートを作成する場合、レポートのデータソースをカスタマイズするための特別なツールが必要です。 JRDataSourceProviderは、カスタムデータソースを設計ツールにプラグインする標準的な方法です。 このインターフェイスのカスタム実装では、データソースオブジェクトの作成と破棄を可能にする次のメソッドと、可能な場合はデータソース内の利用可能なレポートフィールドをリストするメソッドを実装する必要があります-
public boolean supportsGetFieldsOperation();
public JRField[] getFields(JasperReport report)
throws JRException, UnsupportedOperationException;
public JRDataSource create(JasperReport report) throws JRException;
public void dispose(JRDataSource dataSource) throws JRException;
レポートフィールド
レポートフィールドは、データソースとレポートテンプレート間のデータのマッピングを表す要素です。 レポート式でフィールドを組み合わせて、目的の出力を取得できます。 レポートテンプレートには、0個以上の<field>要素を含めることができます。 レポートフィールドを宣言するとき、データソースはレポートテンプレートで定義されたすべてのフィールドに対応するデータを提供する必要があります。
フィールド宣言
フィールド宣言は以下に示すように行われます-
<field name = "FieldName" class = "java.lang.String"/>
名前属性
<field>要素の_name_属性は必須です。 レポート式のフィールドを名前で参照します。
クラス属性
_class_属性は、フィールド値のクラス名を指定します。 デフォルト値は_java.lang.String_です。 これは、実行時に使用可能な任意のクラスに変更できます。 レポートフィールドのタイプに関係なく、エンジンは$ F \ {}トークンが使用されているレポート式でのキャストを処理するため、手動キャストが不要になります。
フィールドの説明
<fieldDesciption>要素はオプションの要素です。 これは、カスタムデータソースを実装するときに非常に便利です。 たとえば、実行時にカスタムデータソースからフィールドの値を取得できるキーまたは情報を保存できます。 フィールド名の代わりに<fieldDesciption>要素を使用することにより、データソースからフィールド値を取得するときに、フィールドの命名規則の制限を簡単に克服できます。
以下は、既存のJRXMLファイルからのコードの一部です(チャプターリンク:/jasper_reports/jasper_report_designs [Report Designs])。 ここでは、 _ name ' 、 ' class_ 、および fieldDescription 要素の使用法を確認できます。
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
フィールドを並べ替える
データの並べ替えが必要で、データソースの実装がそれをサポートしていないとき(例: CSVデータソース)、JasperReportsは、メモリ内のフィールドベースのデータソースソートをサポートしています。 並べ替えは、レポートテンプレートの1つ以上の<sortField>要素を使用して実行できます。
少なくとも1つの並べ替えフィールドが指定されている場合、レポート入力プロセス中に、データソースが_JRSortableDataSource_インスタンスに渡されます。 これにより、データソースからすべてのレコードがフェッチされ、指定されたフィールドに従ってメモリ内でソートが実行され、元のデータソースが置き換えられます。
ソートフィールド名は、レポートフィールド名と同一である必要があります。 ソートに使用されるフィールドには、java.util.Comparableを実装する型が必要です。 自然順序ソートは、タイプjava.lang.Stringのフィールドを除くすべてのフィールドに対して実行されます(ストリングタイプの場合、レポート入力ロケールに対応するコレーターが使用されます)。 複数の並べ替えフィールドを指定すると、フィールドはレポートテンプレートに表示される順序で並べ替えキーとしてフィールドを使用して実行されます。 次の例は、ソート機能を示しています。
ソートされたレポートの例
<* sortField *>要素を既存のレポートテンプレートに追加しましょう(チャプターリンク:/jasper_reports/jasper_report_designs [レポートデザイン])。 フィールド_country_を降順でソートしましょう。 改訂されたレポートテンプレート(jasper_report_template.jrxml)は次のとおりです。 C:\ tools \ jasperreports-5.0.1 \ testディレクトリに保存します-
<?xml version = "1.0"?>
<!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" pageWidth = "595" pageHeight = "842"
columnWidth = "515" leftMargin = "40" rightMargin = "40"
topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<sortField name = "country" order = "Descending"/>
<sortField name = "name"/>
<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>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
レポート入力の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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 7 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: 18 seconds
上記のコンパイルの結果、JasperViewerウィンドウが開き、以下の画面に表示されます-
ここでは、国名がアルファベット順に降順で配置されていることがわかります。
レポート表現
レポート式はJasperReportsの強力な機能であり、計算されたデータをレポートに表示できます。 計算データは、静的データではなく、レポートパラメーターまたはデータソースフィールドとして明確に渡されないデータです。 レポート式は、レポートパラメーター、フィールド、および静的データを組み合わせて構築されます。 Java言語は、デフォルトでレポート式を作成するために使用されます。 Groovyスクリプト言語、JavaScript、BeanShellスクリプトなど、レポート式用の他のスクリプト言語は、JasperReportsコンパイラーでサポートされています。
この章では、レポート式がJava言語のみを使用して記述されていることを前提に、レポート式がどのように機能するかを説明します。 JRXMLレポートテンプレートには、式を定義する要素がいくつかあります-
- <変数式>
- <initialValueExpression>
- <groupExpression>
- <printWhenExpression>
- <imageExpression>
- <textFieldExpression>
式の宣言
基本的に、すべてのレポート式はJava式であり、レポートフィールド、レポート変数、およびレポートパラメーターを参照できます。
式のフィールド参照
式でレポートフィールド参照を使用するには、以下に示すように、フィールドの名前を** $ F \ {* and } *文字シーケンスの間に配置する必要があります-
<textfieldexpression>
$F{Name}
</textfieldexpression>
以下は、既存のJRXMLファイルからのコードの一部です(チャプターリンク:/jasper_reports/jasper_report_designs [Report Designs)]-
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
式の変数参照
式で変数を参照するには、以下の例に示すように、* $ V \ { and } *の間に変数の名前を入れる必要があります-
<textfieldexpression>
"Total height : " + $V{SumOfHeight} + " ft."
</textfieldexpression>
式のパラメーターリファレンス
式でパラメータを参照するには、以下の例に示すように、パラメータの名前を** $ P \ {* and } *の間に配置する必要があります-
<textfieldexpression>
"ReportTitle : " + $P{Title}
</textfieldexpression>
次に、既存のJRXMLファイルのコードを示します。これは、式内のパラメーターの参照を示しています。 (チャプターリンクからのJRXML:/jasper_reports/jasper_report_designs [レポートデザイン])-
<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>
上で見たように、パラメーター、フィールド、および変数の参照は実際には実際のJavaオブジェクトです。 レポートテンプレートで作成されたパラメーター、フィールド、または変数の宣言からクラスを知ると、式のオブジェクト参照でメソッドを呼び出すこともできます。
次の例は、java.lang.Stringレポートフィールド「Name」から最初の文字を抽出して表示する方法を示しています-
<textFieldExpression>
$F{Name}.substring(0, 1)
</textFieldExpression>
式のリソースバンドルリファレンス
式でリソースを参照するには、以下の例に示すように、_ $ _を** $ R \ {* and } *の間に配置する必要があります-
<textfieldexpression>
$R{report.title}
</textfieldexpression>
ランタイム提供のロケールと_report.title_キーに基づいて、レポートテンプレートに関連付けられたリソースバンドルがロードされます。 したがって、リソースバンドルから文字列値を抽出することにより、レポートのタイトルが表示されます。 国際化の詳細については、章のリンク:/jasper_reports/jasper_Internationalization [Internationalization]を参照してください。
電卓
計算機はJasperReportsのエンティティであり、レポート入力時に式を評価し、変数またはデータセットをインクリメントします。 コンパイルプロセス中に、コンパイラによって情報が生成され、コンパイルレポートに保存されます。 この情報は、レポート入力時にnet.sf.jasperreports.engine.fill.JRCalculatorクラスのインスタンスを構築するために使用されます。
Javaソースファイルは、Javaベースのレポートコンパイラによってオンザフライで生成およびコンパイルされます。 この生成されたクラスはJRCalculatorのサブクラスであり、それをコンパイルして生成されたバイトコードはJasperReportオブジェクト内に保存されます。 このbytcodeは、レポートの入力時にロードされ、結果のクラスがインスタンス化されて、式の評価に必要な計算機オブジェクトが取得されます。
条件式
JasperReportsは、変数式を定義するときにif-elseステートメントをサポートしません。 代わりに、三項演算子 \ {cond}を使用できますか? \ {ステートメント1}:\ {ステートメント2} 。 この演算子をJava式内にネストして、複数の条件に基づいて目的の出力を取得できます。
レポートの条件式の例
既存のレポートテンプレート(チャプターリンク:/jasper_reports/jasper_report_designs [Report Designs])を変更して、フィールド国の条件式を追加してみましょう。 改訂されたレポートテンプレート(jasper_report_template.jrxml)は次のとおりです。 C:\ tools \ jasperreports-5.0.1 \ testディレクトリに保存します-
<?xml version = "1.0"?>
<!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" pageWidth = "595" pageHeight = "842"
columnWidth = "515" leftMargin = "40" rightMargin = "40"
topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<sortField name = "country" order = "Descending"/>
<sortField name = "name"/>
<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>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}.isEmpty() ? "NO COUNTRY" : $F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
レポート入力の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;
}
}
Java Beanリストに、国フィールドが空の新しいレコードを追加します。 ファイル 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"));
dataBeanList.add(produce("Tanmay", ""));
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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 build.sysclasspath=last;
set to false for repeatable builds
[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: 5 minutes 5 seconds
C:\tools\jasperreports-5.0.1\test>
上記のコンパイルの結果、JasperViewerウィンドウが開き、以下の画面に表示されます-
ここでは、最後のレコードについて、フィールドcountryのデータを渡さなかったことがわかります。「NO COUNTRY」が印刷されています。
レポート変数
レポート変数は、レポート式の上に構築された特別なオブジェクトです。
レポート変数は、次のタスクを簡素化します-
- レポート式は、レポートテンプレート全体で頻繁に使用されます。 これらの式は、レポート変数を使用して一度だけ宣言できます。
- レポート変数は、カウント、合計、平均、最低、最高、分散などの対応する式の値に基づいてさまざまな計算を実行できます。
レポートデザインで変数が定義されている場合、これらは式の新しい変数によって参照できます。 したがって、変数がレポート設計で宣言される順序は重要です。
可変宣言
変数宣言は次のとおりです-
<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
incrementGroup = "CityGroup" calculation = "Count">
<variableExpression>
<![CDATA[Boolean.TRUE]]>
</variableExpression>
</variable>
上記のように、<variable>要素には多くの属性が含まれています。 これらの属性は以下にまとめられています-
名前属性
_parameters_および_fields_と同様に、</variable>要素の_name_属性は必須です。 レポート式で宣言された名前で変数を参照できます。
クラス属性
変数値のクラス名を指定する_class_属性も必須です。 デフォルト値は_java.lang.String_です。 これは、レポートのコンパイル時とレポートの入力時の両方で、クラスパスで使用可能な任意のクラスに変更できます。 エンジンは、$ V \ {}トークンが使用されるレポート式の型キャストを処理します。したがって、手動の型キャストは必要ありません。
計算
この属性は、レポートに入力するときに変数に対して実行する計算を決定します。 次のサブセクションでは、<variable>要素の計算属性に使用できるすべての値について説明します。
- Average-変数値は、変数式のすべての非ヌル値の平均です。 数値変数にのみ有効です。
- Count-変数値は、変数式のnull以外のインスタンスのカウントです。
- First-変数値は、変数式の最初のインスタンスの値です。 後続の値は無視されます。
- Highest-変数値は、変数式の最大値です。
- Lowest-変数値は、レポート内の変数式の最小値です。
- Nothing-変数に対して計算は実行されません。
- StandardDeviation-変数値は、レポート式に一致するすべての非ヌル値の標準偏差です。 数値変数にのみ有効です。
- Sum-変数値は、レポート式によって返されるすべての非ヌル値の合計です。
- System-変数値はカスタム計算です(JasperReportsのスクリプトレット機能を使用して、その変数の値を自分で計算します)。
- Variance-変数値は、レポート変数の式の評価によって返されるすべての非ヌル値の分散です。
Incrementer FactoryClass
この属性は、レポートの現在のレコードを埋めるときに変数の値を計算するために使用されるクラスを決定します。 デフォルト値は、 net.sf.jasperreports.engine.fill.JRIncrementerFactory を実装する任意のクラスです。 ファクトリクラスは、変数に設定された_calculation_属性に応じて、実行時にインクリメンターオブジェクトをインスタンス化するためにエンジンによって使用されます。
IncrementType
これにより、変数の値をいつ再計算するかが決まります。 この属性は、以下のように値を使用します-
- Column-変数値は各列の最後で再計算されます。
- Group-incrementGroupで指定されたグループが変更されると、変数値が再計算されます。
- None-変数値はすべてのレコードで再計算されます。
- Page-変数値は、すべてのページの最後で再計算されます。
- Report-変数値は、レポートの最後に1回再計算されます。
IncrementGroup
これにより、_incrementType_が_Group_の場合に、変数値が再計算されるグループの名前が決まります。 これは、JRXMLレポートテンプレートで宣言されたグループの名前を取ります。
ResetType
これにより、変数の値がいつリセットされるかが決まります。 この属性は、以下のように値を使用します-
- Column-変数値は各列の先頭でリセットされます。
- Group-incrementGroupで指定されたグループが変更されると、変数値がリセットされます。
- None-変数値はリセットされません。
- Page-変数値は、すべてのページの先頭でリセットされます。 *Report-変数値は、レポートの先頭で1回だけリセットされます。
ResetGroup
これは、_resetType_が_Group_の場合に、変数値がリセットされるグループの名前を決定します。 この属性の値は、JRXMLレポートテンプレートで宣言されたグループの名前になります。
組み込みレポート変数
次のように、式ですぐに使用できる組み込みのシステム変数がいくつかあります-
S.NO | Variable Name and Description |
---|---|
1 |
この変数の値は、現在のページ番号です。 JasperReportsのテキストフィールド要素の特別な機能である_evaluationTime_属性を使用して、現在のページ番号とページの総数の両方を表示するために使用できます。 |
2 |
COLUMN_NUMBER この変数には、現在の列番号が含まれます。 |
3 |
REPORT_COUNT このレポート変数には、処理されたレコードの総数が含まれます。 |
4 |
PAGE_COUNT この変数には、現在のページの生成時に処理されたレコードの数が含まれます。 |
5 |
COLUMN_COUNT この変数には、現在の列を生成するときに処理されたレコードの数が含まれます。 |
6 |
GroupName_COUNT この変数の名前は、対応するグループの名前から派生し、_COUNTシーケンスの接尾辞が付きます。 この変数には、現在のグループのレコード数が含まれます。 |
例
変数( countNumber )を既存のレポートテンプレートに追加しましょう(チャプターリンク:/jasper_reports/jasper_report_designs [Report Designs])。 各レコードにカウントのプレフィックスを付けます。 改訂されたレポートテンプレート(jasper_report_template.jrxml)は次のとおりです。 C:\ tools \ jasperreports-5.0.1 \ testディレクトリに保存します-
<?xml version = "1.0"?>
<!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" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription>
<![CDATA[country]]>
</fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription>
<![CDATA[name]]>
</fieldDescription>
</field>
<variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
<variableExpression>
<![CDATA[Boolean.TRUE]]>
</variableExpression>
</variable>
<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>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[" " + String.valueOf($V{countNumber}) +"."+$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
レポート入力の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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 7 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: 18 seconds
上記のコンパイルの結果、以下の画面のようにJasperViewerウィンドウが開きます-
ここでは、各レコードのカウントがプレフィックスとして付けられていることがわかります。
レポートセクション
簡単なレポートテンプレートの構造については、章のリンク:/jasper_reports/jasper_getting_started [Getting Started]で説明しました。 同様の行で、JasperReportsはレポートテンプレートを複数のセクションに構造化します。 セクションは、指定された高さを持つレポートの一部であり、線、長方形、画像、テキストフィールドなどのレポートオブジェクトを含めることができます。
レポートエンジンは、レポート入力時に、指定されたレポートデータソースの仮想レコードを反復処理します。 各セクションの定義された動作に応じて、エンジンは適切なときに各レポートセクションをレンダリングします。 たとえば、詳細セクションは、データソースの各レコードに対して表示されます。 改ページが発生すると、ページヘッダーセクションとページフッターセクションが必要に応じてレンダリングされます。
JasperReportsでは、用語とレポートセクションは「レポートバンド」とも呼ばれます。 セクションは、1つ以上のバンドで構成されます。 これらのセクションは、レポート生成時に繰り返し記入され、最終ドキュメントを準備します。
主なセクション
JasperReportsのレポートテンプレートには、次のメインセクションがあります-
<title></title>
<pageheader></pageheader>
<columnheader></columnheader>
<groupheader></groupheader>
<detail></detail>
<groupfooter></groupfooter>
<columnfooter></columnfooter>
<pagefooter></pagefooter>
<lastpagefooter></lastpagefooter>
<summary></summary>
<nodata></nodata>
<background></background>
次の表は、各セクションをまとめたものです-
S.NO | Section and Description |
---|---|
1 |
Title このセクションは、レポートの最初に1回だけ表示されます。 |
2 |
Page Header このセクションは、生成されたドキュメントの各ページの先頭に表示されます。 |
3 |
Column Header このセクションは、生成されたドキュメントの各列の先頭に表示されます。 レポートに定義されている列が1つだけの場合、列ヘッダーとフッターセクションは無視されます。 |
4 |
Group Header このセクションは、レポートグループによって導入されます(チャプターリンク:/jasper_reports/jasper_report_groups [Groups])。 グループ化式の値が変更されるたびに、グループヘッダーセクションが詳細セクションの上に印刷されます。 複数のグループが定義されている場合、グループヘッダーはグループ定義の順序で印刷されます。 |
5 |
Detail このセクションは、レポートのデータソースから提供されるデータの各行に対して繰り返されます。 詳細セクションは、複数のバンドで構成できます。 |
6 |
Group Footer このセクションは、レポートグループによって導入されます(チャプターリンク:/jasper_reports/jasper_report_groups [Groups])。 グループ化式の値が変更される前に、グループフッターセクションが詳細セクションの下に印刷されます。 グループフッターは、データソースのデータの最後の行に対して常に印刷されます。 複数のグループが定義されている場合、グループフッターはグループ定義の逆の順序で印刷されます。 |
7 |
Column Footer このセクションは、各列の下部に表示されます。 レポートの列数が1の場合、列ヘッダーセクションとフッターセクションは無視されます。 |
8 |
Page Footer このセクションは、各ページの下部に表示されます。 |
9 |
Last Page Footer このセクションは、レポートの最後のページの通常のページフッターを置き換えます。 場合によっては、要約セクションも存在するため、これはドキュメントの最後のページではない可能性があります。 このセクションは、最後のページの下部に要約情報を表示する必要がある場合に役立ちます。 |
10 |
Summary このセクションは、レポートの最後に一度だけ表示されます。 |
11 |
No Data このセクションは、[データ印刷レポートなしの場合]プロパティが[データなしセクション]に設定されている場合に印刷されます。 <noData>セクションがレポートテンプレートで定義され、データソースが空の場合、<noData>セクションが記入時に考慮される唯一のセクションになり、そのコンテンツがレポート出力を生成します。 |
12 |
Background 背景セクションはすべてのページに表示され、次のページにオーバーフローすることはできません。 このセクションに配置された要素は、ページの初期化時に評価され、バックグラウンドで表示されます。 他のすべてのページオブジェクトは、背景オブジェクトの上に表示されます。 このセクションは、ページの透かしを作成するのに役立ちます。 |
セクション、要素、属性の関係
次の図は、レポートのセクション内の要素と属性の関係を示しています。
セクション要素
上記のレポートセクションはすべてオプションです。 ただし、どのレポートテンプレートにも、そのようなセクションが少なくとも1つあります。 これらの各セクションには、単一の<* band >要素が唯一のサブ要素として含まれています。 < band *>には、ゼロ個以上の次のサブ要素を含めることができます-
_ <line>、<rectangle>、<ellipse>、<image>、<staticText>、<textField>、<subReport>、または<elementGroup> _
これらの各要素には、最初の要素として1つの<* reportElement >が含まれている必要があります(elementGroupを除く)。 < reportElement *>は、その特定の要素のデータのレイアウト方法を決定します。 変数やパラメーターとは異なり、通常、レポートテンプレート内の個々の要素を取得する必要がないため、レポート要素に名前を付ける必要はありません。
以下の表は、<* reportElement *>の属性をまとめたものです-
Attribute | Description | Valid Values |
---|---|---|
x | Specifies the x coordinate of the band element. | An integer value indicating the x coordinate of the element in pixels. This attribute is required. |
y | Specifies the y coordinate of the band element. | An integer value indicating the y coordinate of the element in pixels. This attribute is required. |
width | Specifies the width of the band element. | An integer value indicating the element width in pixels. This attribute is required. |
height | Specifies the height of the band element. | An integer value indicating the element height in pixels. This attribute is required. |
key | Unique identifier of band element. | A unique string value. |
stretchType | Specifies how does the element stretch when the containing band stretches |
NoStretch (default) − The element will not stretch.
|
positionType | Specifies the element’s position when the band stretches. |
Float − The element will move depending on the size of the surrounding elements.
|
isPrintRepeatedValues | Specifies if repeated values are printed. |
true (default) − Repeated values will be printed.
|
mode | Specifies the background mode of the element | Opaque, Transparent |
isRemoveLineWhenBlank | Specifies if the element should be removed when it is blank and there are no other elements in the same horizontal space. | true, false |
isPrintInFirstWholeBand | Specifies if the element must be printed in a whole band, that is, a band that is not divided between report pages or columns. | true, false |
isPrintWhenDetailOverFlows | Specifies if the element will be printed when the band overflows to a new page or column. | true, false |
printWhenGroupChanges | Specifies that the element will be printed when the specified group changes. | A string value. |
forecolor | Specifies the foreground color of the element. | Either a hexadecimal RGB value preceded by the # character, or one of the following predefined values: black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, yellow, white. |
backcolor | Specifies the background color of the element. | Same as Valid Values for forecolor |
セクション属性
レポートセクションの属性は次のとおりです-
高さ
セクションの高さは、その特定のセクションのピクセル単位の高さを指定し、レポート設計全体で非常に重要です。
式を印刷
セクションを印刷するかどうかを決定するブール式。
分割可能
セクションが現在のページに収まらない場合にセクションを分割できるかどうかを示すフラグ。 trueの場合、セクションは次のページに転送されます。 セクションが次のページに収まらない場合、フラグの値に関係なくセクションが分割されることに注意してください。 _splitType_は次の値を取ることができます-
- _splitType = "Stretch:" _ストレッチされたコンテンツを分割します。 セクションが現在のページで拡大する場合(利用可能なスペースが宣言された高さよりも小さい場合)、元の高さに追加される領域は次のページに分割できます。
- _splitType = "Prevent:" _最初の試行で分割しないようにします。 セクションが次のページに収まらない場合、バンド分割防止は最初の分割試行でのみ有効であるため、分割は通常行われます。
- _splitType = "Immediate:" _すぐに分割します。 バンドは、最上部の要素である上記以外の場所で分割できます。
例
各セクションのデモを行うために、レポートテンプレート(jasper_report_template.jrxml)を作成しましょう。 このファイルを C:\ tools \ jasperreports-5.0.1 \ test ディレクトリに保存します。 このファイルでは、各セクションにテキストを表示します(上で説明しました)。 ファイルの内容は以下のとおりです-
<?xml version = "1.0" encoding = "UTF-8"?>
<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" pageWidth = "300" pageHeight = "300"
columnWidth = "300" leftMargin = "0" rightMargin = "0"
topMargin = "0" bottomMargin = "0" >
<title>
<band height = "50">
<textField>
<reportElement x = "100" y = "16" width = "100" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Title"]]>
</textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height = "40">
<textField>
<reportElement mode = "Opaque" x = "100" y = "10"
width = "90" height = "20"/>
<textElement>
<font isBold = "true"/>
</textElement>
<textFieldExpression>
<![CDATA["Page Header"]]>
</textFieldExpression>
</textField>
</band>
</pageHeader>
<columnHeader>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement>
<font isItalic = "true"/>
</textElement>
<textFieldExpression>
<![CDATA["Column Header"]]>
</textFieldExpression>
</textField>
</band>
</columnHeader>
<detail>
<band height ="40">
<textField>
<reportElement mode = "Opaque" x = "100" y = "10"
width = "90" height = "20" backcolor = "#99CCFF"/>
<textElement/>
<textFieldExpression>
<![CDATA["Report Details"]]>
</textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Column Footer"]]>
</textFieldExpression>
</textField>
</band>
</columnFooter>
<pageFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Page Footer"]]>
</textFieldExpression>
</textField>
</band>
</pageFooter>
<lastPageFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Last Page Footer"]]>
</textFieldExpression>
</textField>
</band>
</lastPageFooter>
<summary>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Summary"]]>
</textFieldExpression>
</textField>
</band>
</summary>
</jasperReport>
レポートに入力して生成するJavaコードを以下に示します。 このファイル JasperReportFill.java をC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguidesディレクトリに保存しましょう。
package com.finddevguides;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
public class JasperReportFill {
public static void main(String[] args) {
String sourceFileName = "C://tools/jasperreports-5.0.1/test/" +
"jasper_report_template.jasper";
try {
JasperFillManager.fillReportToFile(sourceFileName, null,
new JREmptyDataSource());
} catch (JRException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ここでは、レポートを埋めるときにJREmptyDataSourceのインスタンスを使用して、1つのレコードを含むデータソースをシミュレートしますが、この単一のレコードのすべてのフィールドはnullです。
レポート生成
通常の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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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, defau
[javac] Compiling 1 source file 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.JRXmlDigesterFac
[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.ExtensionsEnviro
[java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnviro
[java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 18 minutes 22 seconds
上記のコンパイルの結果、以下の画面のようにJasperViewerウィンドウが開きます-
ここでは、各セクションにテキストが印刷されています。 JRXMLには<lastPageFooter>要素が含まれているため、表示されている<pageFooter>要素ではなく、レポートの最後のページに表示されることに注意してください。 <columnHeader>および<columnFooter>要素は、レポートに複数の列がある場合にのみ表示されます。
レポートグループ
JasperReportsのグループは、レポート上のデータを論理的に整理するのに役立ちます。 レポートグループは、データソース内の連続したレコードのシーケンスを表し、特定のレポートフィールドの値などの共通点があります。 レポートグループは、<group>要素によって定義されます。 レポートには、任意の数のグループを含めることができます。 宣言されると、レポート全体でグループを参照できます。
レポートグループには3つの要素があります-
- Group expression-これは、新しいデータグループを開始するために変更する必要があるデータを示します。
- グループヘッダーセクション-グループ化されたデータの先頭にラベルを配置するのに役立ちます。 *グループフッターセクション-グループ化されたデータの最後にラベルを配置するのに役立ちます。
グループ式の値が変更された場合、レポート入力時のデータソースの反復中に、グループの破損が発生し、対応する<groupFooter>および<groupHeader>セクションが結果のドキュメントに挿入されます。
レポートグループメカニズムは、データソースから提供されたデータに対して並べ替えを実行しません。 データグループ化は、データソース内のレコードがレポートで使用されるグループ式に従って既に順序付けられている場合にのみ、期待どおりに機能します。
グループ属性
<group>要素には、グループ化されたデータのレイアウト方法を制御できる属性が含まれています。 属性は以下の表にまとめられています-
S.NO | Attribute and Description |
---|---|
1 |
これは必須です。 レポート式のグループを名前で参照します。 レポートのパラメーター、フィールド、およびレポート変数について述べたのと同じ命名規則に従います。 特定のレポートグループを参照するときに、他のJRXML属性で使用できます。 |
2 |
isStartNewColumn _true_に設定すると、各データグループは新しい列から始まります。 デフォルト値は_false_です。 |
3 |
isStartNewPage _true_に設定すると、各データグループは新しいページから始まります。 デフォルト値は_false_です。 |
4 |
isResetPageNumber _true_に設定すると、新しいページが開始されるたびにレポートページ番号がリセットされます。 デフォルト値は_false._です |
5 |
isReprintHeaderOnEachPage _true_に設定すると、グループヘッダーはすべてのページに再印刷されます。 デフォルト値は_false_です。 |
6 |
minHeightToStartNewPage 現在の列にグループヘッダーを配置するために、列の下部に必要な垂直スペースの最小量を定義します。 金額はレポート単位で指定されます。 |
7 |
footerPosition ページ上のグループフッターの位置と、それに続くレポートセクションに関連する動作をレンダリングします。その値は、Normal _、 StackAtBottom 、 ForceAtBottom_、および_CollateAtBottom_です。 デフォルト値は_Normal_です。 |
8 |
keepTogether _true_に設定すると、最初のブレーク試行でグループが分割されなくなります。 |
例
既存のレポートテンプレートにグループ( CountryGroup )を追加しましょう(チャプターリンク:/jasper_reports/jasper_report_designs [Report Designs])。 各国の発生がカウントされ、カウントがグループフッターとして表示されます。 グループヘッダーでは、各レコードのカウントにプレフィックスが付けられます。 改訂されたレポートテンプレート(jasper_report_template.jrxml)は次のとおりです。 C:\ tools \ jasperreports-5.0.1 \ testディレクトリに保存します-
<?xml version = "1.0"?>
<!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" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<sortField name = "country" order = "Descending"/>
<sortField name = "name"/>
<variable name = "CountryNumber" class = "java.lang.Integer"
incrementType = "Group" incrementGroup = "CountryGroup"
calculation = "Count">
<variableExpression><![CDATA[Boolean.TRUE]]></variableExpression>
</variable>
<group name = "CountryGroup" minHeightToStartNewPage = "60">
<groupExpression><![CDATA[$F{country}]]></groupExpression>
<groupHeader>
<band height = "20">
<textField evaluationTime = "Group" evaluationGroup = "CountryGroup"
bookmarkLevel = "1">
<reportElement mode = "Opaque" x = "0" y = "5" width = "515"
height = "15" backcolor = "#C0C0C0"/>
<box leftPadding = "10">
<bottomPen lineWidth = "1.0"/>
</box>
<textElement/>
<textFieldExpression class = "java.lang.String">
<![CDATA[" " + String.valueOf($V{CountryNumber}) + ". "
+ String.valueOf($F{country})]]>
</textFieldExpression>
<anchorNameExpression>
<![CDATA[String.valueOf($F{country})]]>
</anchorNameExpression>
</textField>
</band>
</groupHeader>
<groupFooter>
<band height = "20">
<staticText>
<reportElement x = "400" y = "1" width = "60" height = "15"/>
<textElement textAlignment = "Right"/>
<text><![CDATA[Count :]]></text>
</staticText>
<textField>
<reportElement x = "460" y = "1" width = "30" height = "15"/>
<textElement textAlignment = "Right"/>
<textFieldExpression class = "java.lang.Integer">
<![CDATA[$V{CountryGroup_COUNT}]]>
</textFieldExpression>
</textField>
</band>
</groupFooter>
</group>
<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>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
レポート入力の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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 7 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: 18 seconds
上記のコンパイルの結果、以下の画面のようにJasperViewerウィンドウが開きます-
ここでは、各国がグループ化されており、各国の発生回数が各グループのフッターに表示されています。
レポートフォント
レポートにはテキスト要素が含まれ、それぞれに独自のフォント設定を含めることができます。 これらの設定は、<textElement>タグで使用可能な<* font *>タグを使用して指定できます。 レポートでは、多数のフォントを定義できます。 定義したら、レポート全体で他のフォント定義のデフォルトまたは基本フォント設定として使用できます。
レポートフォント
レポートフォントは、レポートレベルで宣言されたフォント設定のコレクションです。 テキスト要素のフォントプロパティを設定する場合、レポートテンプレート全体でレポートフォントを再利用できます。
レポートフォントは廃止されました。 ドキュメント自体で宣言された<reportFont/>要素を使用しないでください。 代わりに<style/>要素を使用してください。
フォント属性
以下の表は、<* font *>要素の主な属性をまとめたものです-
S.NO | Attribute and Description |
---|---|
1 |
fontName フォント名。物理フォントの名前、論理フォントの名前、または登録済みのJasperReportsフォント拡張機能のフォントファミリの名前を指定できます。 |
2 |
size ポイント単位で測定されたフォントのサイズ。 デフォルトは10です。 |
3 |
isBold 太字フォントが必要かどうかを指定するフラグ。 デフォルトはfalseです。 |
4 |
isItalic 斜体フォントが必要かどうかを指定するフラグ。 デフォルトはfalseです。 |
5 |
isUnderline 下線のテキスト装飾が必要かどうかを指定するフラグ。 デフォルトはfalseです。 |
6 |
isStrikeThrough 取り消し線のテキスト装飾が必要かどうかを指定するフラグ。 デフォルトはfalseです。 |
7 |
pdfFontName ドキュメントをPDF形式にエクスポートするときにiTextライブラリが必要とする同等のPDFフォントの名前。 |
8 |
pdfEncoding 同等のPDF文字エンコード。iTextライブラリでも必要です。 |
9 |
isPdfEmbedded フォントをドキュメント自体に埋め込むかどうかを指定するフラグ。 デフォルトはfalseです。 trueに設定すると、PDFドキュメントを問題なく表示できます。 |
フォントの種類
JasperReportsでは、フォントは次のように分類できます-
- 論理フォント-バージョン1.0以降、Javaプラットフォームで認識されている5つのフォントタイプは、論理フォントと呼ばれます。 これらは- Serif、SansSerif、Monospaced、Dialog、およびDialogInput です。 これらの論理フォントは、システムのどこにでもインストールされる実際のフォントライブラリではありません。 これらは、Javaランタイムによって認識される単なるフォントタイプ名です。 これらは、システムにインストールされている物理フォントにマッピングする必要があります。
- 物理フォント-これらのフォントは、たとえばTrueTypeまたはPostScript Type 1フォントで構成される実際のフォントライブラリです。 物理フォントは、Arial、Time、Helvetica、Courier、または国際フォントを含む他の任意のフォントです。
- フォント拡張機能-JasperReportsライブラリは、フォント拡張機能の組み込みサポートにより、実行時にオンザフライで登録されたフォントを使用できます。 フォントファミリのリストは、フォント拡張を使用してJasperReportsで利用可能にできます。 これらは、似たような外観のフォントフェースで構成され、特定のロケールをサポートします。
上記の表で説明したように、属性_fontName_で、物理フォントの名前、論理フォントの名前、または登録済みのJasperReportsフォント拡張機能からのフォントファミリの名前を指定する必要があります。
PDFフォント名
JasperReportsライブラリは、レポートをPDF(Portable Document Format)にエクスポートするときにiTextライブラリを使用します。 PDFファイルはさまざまなプラットフォームで表示でき、常に同じように見えます。 これは、この形式にはフォントを処理する特別な方法があるためです。 _fontName_属性は、PDFにエクスポートするときには役に立ちません。 フォント設定を指定する必要のある属性_pdfFontName_が存在します。
iTextライブラリは、組み込みフォントとTTFファイルを処理する方法を知っており、次の組み込みフォント名を認識します-
- 宅配便
- Courier-Bold
- Courier-BoldOblique
- Courier-Oblique
- Helvetica
- Helvetica-Bold
- Helvetica-BoldOblique
- Helvetica-Oblique
- シンボル
- タイムズ・ローマ
- タイムズボールド
- Times-BoldItalic
- タイムズイタリック
- ザップ
iTextライブラリの前提条件に従って、フォントを使用するには、フォント名として次のいずれかを指定する必要があります-
- 上記のリストからの組み込みフォント名。
- ディスク上にあるTTF(True Type Font)ファイルの名前。
- フォントを含むTTFファイルが以前にiTextに登録されているか、フォントが登録されたときにエイリアスが定義されていれば、フォントの実際の名前。
上記の前提条件に基づいて、_pdfFontName_属性には次の値のいずれかを含めることができます-
- 上記のリストからの組み込みPDFフォントの名前。
- PDFへのエクスポート時に実行時にディスク上に配置できるTTFファイルの名前。
- 登録済みフォントの本名。
- フォントファイルとしてiTextに登録されているフォントのキーのサフィックス(_net.sf.jasperreports.export.pdf.font_の後の部分)。
デフォルトのフォントと継承
各テキスト要素は親要素からフォントおよびスタイル属性を継承し、親要素はこれらの属性を親から継承します。 要素にスタイルおよび/またはフォントが定義されていない場合、<jasperReport/>ルート要素で宣言されたデフォルトのスタイル(および/またはフォント-これは廃止されました)が適用されます。
JasperReportsでデフォルトのスタイルまたはフォントを定義することは必須ではありません。 特定の要素にフォントが定義されていない場合、エンジンは継承されたフォント属性を検索するか、この方法で属性が見つからない場合、_で_net.sf.jasperreports.default.font.name_プロパティを検索します/src/default.jasperreports.properties_ファイル。 その値は、フォントプロパティがテキスト要素に対して明示的に定義されていない場合、またはその親から継承されていない場合に使用されるフォントファミリの名前を定義します。
_/src/default.jasperreports.properties_ファイルで定義されている主なデフォルトのフォントプロパティとその値は、以下の表にあります-
Property | Description |
---|---|
net.sf.jasperreports.default.font.name=SansSerif | The default font name. |
net.sf.jasperreports.default.font.size=10 | The default font size. |
net.sf.jasperreports.default.pdf.font.name=Helvetica | The default PDF font. |
net.sf.jasperreports.default.pdf.encoding=Cp1252 | The default PDF character encoding. |
net.sf.jasperreports.default.pdf.embedded=false | By default PDF fonts are not embedded. |
例
特定のテキストの外観を得るためにフォントとフォント属性を使用する方法を示すために、新しいレポートテンプレート(jasper_report_template.jrxml)を作成しましょう。 JRXMLの内容は次のとおりです。 C:\ tools \ jasperreports-5.0.1 \ testディレクトリに保存します。 ここでは、レポートのタイトルにさまざまなフォント形式でテキストを表示します。
<?xml version = "1.0" encoding = "UTF-8"?>
<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" pageWidth = "595" pageHeight = "842"
columnWidth = "555" leftMargin = "20" rightMargin = "20" topMargin = "30"
bottomMargin = "30">
<title>
<band height = "682">
<staticText>
<reportElement x = "0" y = "50" width = "150" height = "40"/>
<textElement/>
<text>
<![CDATA[Welcome to finddevguides!]]>
</text>
</staticText>
<staticText>
<reportElement x = "160" y = "50" width = "390" height = "40"/>
<textElement/>
<text>
<![CDATA[<staticText>
<reportElement x = "0" y = "50" width = "150" height = "40"/>
<text>Welcome to finddevguides!</text></staticText>]]>
</text>
</staticText>
<staticText>
<reportElement x = "0" y = "100" width = "150" height = "40"/>
<textElement>
<font size = "12"/>
</textElement>
<text><![CDATA[Welcome to finddevguides!]]></text>
</staticText>
<staticText>
<reportElement x = "160" y = "100" width = "390" height = "40"/>
<textElement/>
<text>
<![CDATA[<staticText>
<reportElement x = "0" y = "100" width = "150" height = "40"/>
<textElement>
<font size = "14"/>
</textElement>
<text> Welcome to finddevguides!</text></staticText>]]>
</text>
</staticText>
<staticText>
<reportElement x = "0" y = "150" width = "150" height = "40"/>
<textElement>
<font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
</textElement>
<text><![CDATA[Welcome to finddevguides!]]></text>
</staticText>
<staticText>
<reportElement x = "160" y = "150" width = "390" height = "40"/>
<textElement/>
<text>
<![CDATA[<staticText>
<reportElement x = "0" y = "250" width = "150" height = "40"/>
<textElement>
<font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
</textElement>
<text>Welcome to finddevguides!</text></staticText>]]>
</text>
</staticText>
<staticText>
<reportElement x = "0" y = "200" width = "150" height = "40"/>
<textElement>
<font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
</textElement>
<text><![CDATA[Welcome to finddevguides!]]></text>
</staticText>
<staticText>
<reportElement x = "160" y = "200" width = "390" height = "40"/>
<textElement/>
<text>
<![CDATA[<staticText>
<reportElement x = "0" y = "300" width = "150" height = "40"/>
<textElement>
<font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
</textElement>
<text>Welcome to finddevguides!</text></staticText>]]>
</text>
</staticText>
<staticText>
<reportElement x = "0" y = "250" width = "150" height = "40"/>
<textElement>
<font fontName = "Monospaced" size = "12" isItalic = "true"
isUnderline = "true" pdfFontName = "Courier-Oblique"/>
</textElement>
<text><![CDATA[Welcome to finddevguides!]]></text>
</staticText>
<staticText>
<reportElement x = "160" y = "250" width = "390" height = "40"/>
<textElement/>
<text>
<![CDATA[<staticText>
<reportElement x = "0" y = "350" width = "150" height = "40"/>
<textElement>
<font fontName = "Monospaced" size = "12" isItalic = "true"
isUnderline = "true" pdfFontName = "Courier-Oblique"/>
</textElement>
<text>Welcome to finddevguides!</text></staticText>]]>
</text>
</staticText>
<staticText>
<reportElement x = "0" y = "300" width = "150" height = "40"/>
<textElement>
<font fontName = "Monospaced" size = "12" isBold = "true"
isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
</textElement>
<text><![CDATA[Welcome to finddevguides!]]></text>
</staticText>
<staticText>
<reportElement x = "160" y = "300" width = "390" height = "40"/>
<textElement/>
<text>
<![CDATA[<staticText>
<reportElement x = "0" y = "400" width = "150" height = "40"/>
<textElement>
<font fontName = "Monospaced" size = "12" isBold = "true"
isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
</textElement>
<text>Welcome to finddevguides!</text></staticText>]]>
</text>
</staticText>
<staticText>
<reportElement x = "0" y = "350" width = "150" height = "40"
forecolor = "#FF0000"/>
<textElement>
<font size = "14"/>
</textElement>
<text><![CDATA[Welcome to finddevguides!]]></text>
</staticText>
<staticText>
<reportElement x = "160" y = "350" width = "390" height = "40"/>
<textElement/>
<text>
<![CDATA[<staticText>
<reportElement x = "0" y = "450" width = "150" height = "40"
forecolor = "red"/>
<textElement><font size = "14"/></textElement>
<text>Welcome to finddevguides!</text></staticText>]]>
</text>
</staticText>
<staticText>
<reportElement x = "0" y = "400" width = "150" height = "40" mode = "Opaque"
forecolor = "#00FF00" backcolor = "#FFFF00"/>
<textElement>
<font fontName = "Serif" size = "12" isBold = "true"
pdfFontName = "Times-Bold"/>
</textElement>
<text><![CDATA[Welcome to finddevguides!]]></text>
</staticText>
<staticText>
<reportElement x = "160" y = "400" width = "390" height = "40"/>
<textElement/>
<text>
<![CDATA[<staticText>
<reportElement x = "0" y = "500" width = "150" height = "40"
forecolor = "green" backcolor = "#FFFF00" mode = "Opaque"/>
<textElement>
<font fontName = "Serif" size = "12" isBold = "true"
pdfFontName = "Times-Bold"/>
</textElement>
<text>Welcome to finddevguides!</text></staticText>]]>
</text>
</staticText>
<staticText>
<reportElement x = "0" y = "450" width = "150" height = "40" mode = "Opaque"
forecolor = "#0000FF" backcolor = "#FFDD99"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font fontName = "SansSerif" size = "12" isBold = "false"
isItalic = "true" pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
</textElement>
<text><![CDATA[Welcome to finddevguides!]]></text>
</staticText>
<staticText>
<reportElement x = "160" y = "450" width = "390" height = "40"/>
<textElement/>
<text>
<![CDATA[<staticText>
<reportElement x = "0" y = "550" width = "150" height = "90"
forecolor = "blue" backcolor = "#FFDD99" mode = "Opaque"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font fontName = "SansSerif" size = "12" isBold = "false"
pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
</textElement>
<text>Welcome to finddevguides!</text></staticText>]]>
</text>
</staticText>
<staticText>
<reportElement mode = "Opaque" x = "0" y = "500" width = "150" height = "40"
forecolor = "#FF0000" backcolor = "#99DDFF"/>
<textElement textAlignment = "Right" verticalAlignment = "Bottom">
<font fontName = "SansSerif" size = "12" isBold = "true"
pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
</textElement>
<text><![CDATA[Welcome to finddevguides!]]></text>
</staticText>
<staticText>
<reportElement x = "160" y = "500" width = "390" height = "40"/>
<textElement/>
<text>
<![CDATA[<staticText>
<reportElement x = "0" y = "650" width = "150" height = "90" forecolor = "red"
backcolor = "#99DDFF" mode = "Opaque"/>
<textElement textAlignment = "Right" verticalAlignment = "Bottom">
<font fontName = "SansSerif" size = "12" isBold = "true"
pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
</textElement>
<text>Welcome to finddevguides!</text></staticText>]]>
</text>
</staticText>
</band>
</title>
</jasperReport>
レポートに入力して生成するJavaコードは以下のとおりです。 このファイル JasperFontsReportFill.java をC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguidesディレクトリに保存しましょう。
package com.finddevguides;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
public class JasperFontsReportFill {
public static void main(String[] args) {
String sourceFileName = "C://tools/jasperreports-5.0.1/test/" +
"jasper_report_template.jasper";
try {
JasperFillManager.fillReportToFile(sourceFileName, null,
new JREmptyDataSource());
} catch (JRException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ここでは、レポートを埋めるときに_JREmptyDataSource_のインスタンスを使用して、1つのレコードを含むデータソースをシミュレートしますが、すべてのフィールドは_null_です。
レポート生成
通常の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.JasperFontsReportFill (viewFullReportがデフォルトのターゲットです)を-として実行します
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.finddevguides.JasperFontsReportFill
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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 build.
[javac] Compiling 5 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.JasperFontsReportFill
[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: 45 minutes 3 seconds
上記のコンパイルの結果、JasperViewerウィンドウが開き、以下の画面に表示されます-
ここでは、「Welcome to finddevguides」というテキストがさまざまなフォント形式で表示されていることがわかります。
Unicodeのサポート
JasperReportsでは、テキストの操作には、文字表現とテキストフォーマットプロパティの両方を処理するための専用ツールが必要です。 任意のテキストは、特定の表現構造を持つ文字シーケンスと見なすことができます。 テキストの外観は、レイアウト(および段落)とフォント設定の両方で構成されます。 ただし、ほとんどの場合、テキストレイアウトは不変のままですが、異なるロケールでレポートを実行するとフォント設定が変更される場合があります。
特定の文字表現に関しては、言語ごとに異なる文字セットが必要であることがわかっています。 したがって、テキストの操作はフォントの操作を意味します。 ただし、JasperReportsでフォントを使用する方法の詳細については、章のリンク:/jasper_reports/jasper_report_fonts [Report Fonts]を参照してください。
特定のレポートのテキストコンテンツに関する主な機能の1つは、レポートを国際化できることです。 つまり、異なる言語や他のローカライズ設定を使用して、ハードコーディングされた変更なしに、異なるローカライズ環境でレポートを実行できます。 レポートを国際化する場合、文字エンコードは重要な機能です。
文字コード
キャラクターは、意味のある情報を伝える文章の最小単位です。 それは抽象的な概念であり、キャラクターには視覚的な外観はありません。 「大文字ラテンA」は、「小文字ラテンa」および「大文字キリル文字A」および「大文字ギリシャ文字」とは異なる文字です。
文字の視覚的表現は glyph として知られています。 特定のグリフのセットは font と呼ばれます。 「ラテン文字Aの大文字」、「キリル文字Aの大文字」、および「ギリシャ文字の大文字」には、同一のグリフが含まれている場合がありますが、それらは異なる文字です。 同時に、「大文字のラテンA」のグリフは、Times New Roman、Gill Sans、およびPoeticaのイタリック体で大きく異なるように見えますが、それでも同じ文字を表しています。
使用可能な文字のセットは、_文字レパートリー_と呼ばれます。 レパートリー内の特定の文字の位置(インデックス)は、コード位置またはコードポイントとして知られています。 特定のレパートリー内のコードポイントを数値で表す方法は、「文字エンコーディング」と呼ばれます。
エンコーディングは通常、オクテットで表現されます。 オクテットは、8つの2進数、つまり8つの1と0のグループです。 オクテットは、16進表記を使用するために、0〜255、または0x00〜0xFFの数値範囲を表すことができます。
Unicode
Unicodeは、世界の言語で使用されるほとんどの文字を含む文字レパートリーです。 数百万の文字を収容でき、すでに数十万を含んでいます。 Unicodeは64K文字の「プレーン」に分割されます。 ほとんどの状況で使用される唯一のものは、基本的な多言語飛行機、またはBMPとして知られる最初の飛行機です。
UTF-8が推奨されるエンコードです。 可変文字数のオクテットを使用して、異なる文字を表します。
JRXMLファイルでは、エンコード属性はヘッダーで指定されます。 レポートのコンパイル時に、XMLコンテンツをデコードするために使用されます。 たとえば、レポートにフランス語の単語と、ç、é、âなどの文字のみが含まれている場合、ISO-8859-1(a.k.a Latin-1)エンコーディングで十分です-
<?xml version = "1.0" encoding = "ISO-8859-1"?>
上記のように、理想的には、ドキュメント内のすべての文字を正しく表すことができる最小の文字セットに適合するエンコードを選択できます。 ただし、多言語ドキュメントの場合(つまり、 複数の言語で綴られた単語を含むドキュメント)、最小の文字セットに適合したエンコードを選択する必要があります。異なる言語に属している場合でも、ドキュメント内のすべての文字を正しく表すことができます。 多言語ドキュメントを処理できる文字エンコーディングの1つは、 UTF-8 で、JasperReportsがデフォルトのエンコーディング値として使用します。
テキストは通常、国際化中にドキュメント内ではなく、リソースバンドルファイルに保存されます。 そのため、JRXML自体は完全にASCII互換に見える場合もありますが、実行時に生成されるレポートにはASCIIで読み取れないテキストが含まれます。 その結果、特定の種類のドキュメントエクスポート形式(CSV、HTML、XHTML、XML、テキストなど)については、生成されたドキュメントのエンコードも知っている必要があります。 異なる文字エンコードによって異なる言語がサポートされています。 そのため、毎回、ローカライズされた環境でレポートを実行する必要があります。 さらに、生成されたドキュメント言語に最も適切な文字エンコーディングである、を知る必要があります。 この場合、JRXMLファイル自体で定義されたエンコーディングプロパティはもはや有用ではない可能性があります。
この種の問題を解決するために、_net.sf.jasperreports.export.character.encoding_として知られるエクスポート顧客プロパティを使用できます。 このエクスポートカスタムプロパティはデフォルトでUTF-8であり、JasperReportsに存在します。
このデフォルト値は、_default.jasperreports.properties_ファイルで設定されます。 エクスポート時のより具体的なオプションについては、CHARACTER_ENCODINGエクスポートパラメーターも使用できます。
例
JasperreportsでのUnicodeサポートの使用を示すために、新しいレポートテンプレート(jasper_report_template.jrxml)を作成しましょう。 C:\ tools \ jasperreports-5.0.1 \ test ディレクトリに保存します。 ここでは、Unicode文字(\ uXXXX)を使用してさまざまな言語でテキストを表示します。 UTF-8でエンコードされた文字は、4桁の16進コードのみを使用して表現できます。 たとえば、ギリシャ文字Γは\ u0393と書くことができます。 このような表記に遭遇すると、エンジンは文字セット内の適切な文字表現を要求し、その特定の文字のみが出力されます。 JRXMLの内容は以下の通りです-
<?xml version = "1.0" encoding = "UTF-8"?>
<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 = "GreekText" class = "java.lang.String" isForPrompting = "false">
<defaultValueExpression><![CDATA["\u0394\u03B5\u03BD "+
"\u03BA\u03B1\u03C4\u03B1\u03BB\u03B1\u03B2\u03B1\u03AF"+
"\u03BD\u03C9 \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC"]]>
</defaultValueExpression>
</parameter>
<parameter name = "CyrillicText" class = "java.lang.String" isForPrompting = "false">
<defaultValueExpression><![CDATA["\u042F \u043D\u0435 "+
"\u043C\u043E\u0433\u0443 \u043F\u043E\u043D\u044F\u0442\u044C "+
"\u0433\u0440\u0435\u0447\u0435\u0441\u043A\u0438\u0439"]]>
</defaultValueExpression>
</parameter>
<parameter name = "ArabicText" class = "java.lang.String" isForPrompting = "false">
<defaultValueExpression><![CDATA["\u0627\u0646\u0646\u0649 \u0644\u0627 "+
"\u0627\u0641\u0647\u0645 \u0627\u0644\u0644\u063A\u0629 "+
"\u0627\u0644\u0639\u0631\u0628\u064A\u0629"]]>
</defaultValueExpression>
</parameter>
<parameter name = "HebrewText" class = "java.lang.String" isForPrompting = "false">
<defaultValueExpression><![CDATA["\u05D0\u05E0\u05D9 \u05DC\u05D0 "+
"\u05DE\u05D1\u05D9\u05DF \u05E2\u05D1\u05E8\u05D9\u05EA"]]>
</defaultValueExpression>
</parameter>
<title>
<band height = "782">
<textField>
<reportElement x = "0" y = "50" width = "200" height = "60"/>
<textElement>
<font fontName = "DejaVu Sans" size = "14"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
</textFieldExpression>
</textField>
<staticText>
<reportElement x = "210" y = "50" width = "340" height = "60"/>
<textElement/>
<text>
<![CDATA["GreekText and CyrillicText"]]>
</text>
</staticText>
<textField>
<reportElement x = "0" y = "120" width = "200" height = "60"/>
<textElement>
<font fontName = "DejaVu Sans" size = "14" isBold = "true"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
</textFieldExpression>
</textField>
<staticText>
<reportElement x = "210" y = "120" width = "340" height = "60"/>
<textElement/>
<text><![CDATA["GreekText and CyrillicText"]]></text>
</staticText>
<textField>
<reportElement x = "0" y = "190" width = "200" height = "60"/>
<textElement>
<font fontName = "DejaVu Sans" size = "14" isItalic = "true"
isUnderline = "true"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
</textFieldExpression>
</textField>
<staticText>
<reportElement x = "210" y = "190" width = "340" height = "60"/>
<textElement/>
<text><![CDATA["GreekText and CyrillicText"]]></text>
</staticText>
<textField>
<reportElement x = "0" y = "260" width = "200" height = "60"/>
<textElement>
<font fontName = "DejaVu Sans" size = "14" isBold = "true"
isItalic = "true" isUnderline = "true"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
</textFieldExpression>
</textField>
<staticText>
<reportElement x = "210" y = "260" width = "340" height = "60"/>
<textElement/>
<text><![CDATA["GreekText and CyrillicText"]]></text>
</staticText>
<textField>
<reportElement x = "0" y = "330" width = "200" height = "60"/>
<textElement textAlignment = "Right">
<font fontName="DejaVu Sans" size = "22"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{ArabicText}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "210" y = "330" width = "340" height = "60"/>
<textElement textAlignment = "Right">
<font fontName = "DejaVu Sans" size = "22"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{HebrewText}]]>
</textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
上記のファイルでは、UTF-8エンコーディングの存在を確認できます。 また、ローカライズされたUnicodeテキストはドキュメントパラメーターに保存されます。
レポートを入力して生成するJavaコードは次のとおりです。 このファイル JasperUnicodeReportFill.java をC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguidesディレクトリに保存しましょう。
package com.finddevguides;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
public class JasperUnicodeReportFill {
public static void main(String[] args) {
String sourceFileName ="C://tools/jasperreports-5.0.1/test/" +
"jasper_report_template.jasper";
try {
JasperFillManager.fillReportToFile(sourceFileName, null,
new JREmptyDataSource());
} catch (JRException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ここでは、レポートを埋めるときに_JREmptyDataSource_のインスタンスを使用して、1つのレコードを含むデータソースをシミュレートしますが、この単一のレコードのすべてのフィールドは_null_です。
レポート生成
通常の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.JasperUnicodeReportFill (viewFullReportがデフォルトのターゲットです)を実行します-
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.finddevguides.JasperUnicodeReportFill
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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 t
[javac] Compiling 1 source file 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.JasperUnicodeReportFill
[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: 4 minutes 1 second
上記のコンパイルの結果、JasperViewerウィンドウが開き、以下の画面に表示されます-
ここでは、表示されているテキストが異なる言語であることがわかります。 また、同じページで言語がグループ化され、同じテキスト要素に混在していることもわかります。
レポートスタイル
JasperReportsには、レポートテンプレートのテキストプロパティの制御に役立つ機能<style>があります。 この要素は、レポートレベルで宣言されたスタイル設定のコレクションです。 前景色、背景色、フォントが太字、斜体、通常のいずれであるか、フォントサイズ、フォントの境界線、その他の多くの属性などのプロパティは、<style>要素によって制御されます。 スタイルは、他のスタイルを拡張したり、親スタイルのプロパティに追加したり、プロパティをオーバーライドしたりできます。
スタイルのプロパティ
<style>要素には多くの属性があります。 最も一般的に使用されるいくつかは、以下の表に記載されています-
S.NO | Attribute and Description |
---|---|
1 |
name 必須です。 レポート全体で対応するレポートスタイルを参照するため、一意である必要があります。 |
2 |
isDefault このスタイルがドキュメントのデフォルトスタイルかどうかを示します。 |
3 |
style 親スタイルへの参照です。 |
4 |
mode 要素の透明度を指定します。 可能な値は、_Opaque_および_Transparent_です。 |
5 |
forecolor オブジェクトの前景色です。 |
6 |
backcolor オブジェクトの背景色です。 |
7 |
fill オブジェクトの塗りつぶしに使用される塗りつぶしパターンを決定します。 現時点では、許可される単一の値は_Solid_です。 |
6 |
radius 長方形の角の弧の半径を指定します。 |
7 |
scaleImage 画像のみのスケールを指定します。 可能な値:Clip、FillFrame、RetainShape、RealHeight、、および_RealSize_。 |
8 |
hAlign 水平方向の配置を指定します。 可能な値:Left、Center、Right、、および_Justified_。 |
9 |
vAlign 垂直方向の配置を指定します。 可能な値:Top、Middle、、および_Bottom_。 |
10 |
rotation 要素の回転を指定します。 可能な値:None、Left、Right、、および_UpsideDown_。 |
11 |
lineSpacing テキストの行間の行間隔を指定します。 可能な値:Single、1_1_2、Double。 |
12 |
markup スタイル付きテキストのマークアップスタイルを指定します。 |
13 |
fontName フォント名を指定します。 |
14 |
fontSize フォントサイズを指定します。 |
15 |
isBold フォントスタイルが太字かどうかを示します。 |
16 |
isItalic フォントスタイルが斜体かどうかを示します。 |
17 |
isUnderline フォントスタイルが下線であるかどうかを示します。 |
18 |
isStrikeThrough フォントスタイルが取り消し線かどうかを示します。 |
19 |
pdfFontName 関連するPDFフォント名を指定します。 |
20 |
pdfEncoding PDF出力形式の文字エンコードを指定します。 |
22 |
isPdfEmbedded PDFフォントが埋め込まれているかどうかを示します。 |
23 |
pattern 書式設定されたテキストの書式パターンを指定します。 |
24 |
isBlankWhenNull 式の評価がnullの場合、空の文字列(空白)を表示するかどうかを示します。 |
条件付きスタイル
状況によっては、特定の条件が満たされた場合にのみスタイルを適用する必要があります(たとえば、レポートの詳細セクションで隣接する行の色を変更する場合)。 これは、条件付きスタイルを使用して実現できます。
条件付きスタイルには2つの要素があります-
- ブール条件式 *スタイル
スタイルは、条件が_true_と評価される場合にのみ使用されます。
レポート要素へのスタイルの適用
どのタイプのレポート要素でも、style属性を使用してレポートスタイル定義を参照できます。 したがって、現在の要素に適用可能なスタイル定義によって宣言されたすべてのスタイルプロパティが継承されます。 継承された値をオーバーライドするには、レポート要素レベルで指定されたスタイルプロパティを使用できます。
スタイルテンプレート
共通の場所でスタイルを定義することにより、共通の外観を持つ一連のレポートを作成できます。 この共通スタイルテンプレートは、レポートテンプレートから参照できます。 スタイルテンプレートは、1つ以上のスタイル定義を含むXMLファイルです。* *。jrtx *拡張子の規則で使用されるスタイルテンプレートファイルですが、これは必須ではありません。
スタイルテンプレートには、次の要素が含まれています-
- _ <jasperTemplate> _-これはスタイルテンプレートファイルのルート要素です。
- _ <template> _-この要素は、他のテンプレートファイルへの参照を含めるために使用されます。 この要素の内容は、参照されるテンプレートファイルの場所として解釈されます。
- _ <style> _-この要素は、レポートテンプレート(JRXMLファイル)の同じ名前の要素と同じですが、スタイルテンプレートのスタイルに条件付きスタイルを含めることはできません。 この制限は、条件付きスタイルにはレポート式が関係し、式は単一のレポート定義のコンテキストでのみ解釈できるという事実が原因です。
スタイルテンプレートへの参照は、<template>要素としてJRXMLレポートに含まれています。 スタイルテンプレートはレポートの入力時に読み込まれ、すべてのテンプレートが読み込まれるとスタイル名の参照が解決されます。 スタイルテンプレートを読み込んでスタイル名をスタイルに解決すると、スタイルテンプレートのツリー/グラフが作成され、ツリーの最上部がレポートで定義されたスタイルのセットになります。 このツリーでは、スタイル名の参照は、深さ優先走査で名前に一致する最後のスタイルに解決されます。
例
条件付きスタイルとスタイルテンプレートを試してみましょう。 <* style >要素 *alternateStyle を既存のレポートテンプレートに追加しましょう(チャプターリンク:/jasper_reports/jasper_report_designs [Report Designs])。 条件に基づいて、偶数カウントではフォントの色が青に変わります。 スタイルテンプレート "styles.jrtx" も含まれています。 改訂されたレポートテンプレート(jasper_report_template.jrxml)は次のとおりです。 C:\ tools \ jasperreports-5.0.1 \ testディレクトリに保存します-
<?xml version = "1.0"?>
<!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" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
<template>"styles.jrtx"</template>
<style name = "alternateStyle" fontName = "Arial" forecolor = "red">
<conditionalStyle>
<conditionExpression>
<![CDATA[new Boolean($V{countNumber}.intValue() % 2 == 0)]]>
</conditionExpression>
<style forecolor = "blue" isBold = "true"/>
</conditionalStyle>
</style>
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
<variableExpression><![CDATA[Boolean.TRUE]]></variableExpression>
</variable>
<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>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3"
width = "535" height = "15" backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0"
width = "535" height = "14" backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<textField>
<reportElement style = "alternateStyle" x = "414" y = "0"
width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"
style = "Strong"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
スタイルテンプレート styles.jrtx の内容は次のとおりです。 C:\ tools \ jasperreports-5.0.1 \ testディレクトリに保存します。
<?xml version = "1.0"?>
<!DOCTYPE jasperTemplate PUBLIC "-//JasperReports//DTD Template//EN"
"http://jasperreports.sourceforge.net/dtds/jaspertemplate.dtd">
<jasperTemplate>
<style name = "Strong" isBold = "true" pdfFontName = "Helvetica-Bold"
backcolor = "lightGray forecolor = "green"/>
</jasperTemplate>
レポート入力の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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 build.sysclasspath=last;
set to false for repeatable builds
[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.
上記のコンパイルの結果、JasperViewerウィンドウが開き、以下の画面に表示されます-
ここでは、偶数列(列の国)でフォントの色が青に変更されていることがわかります。 列名では、フォントの色が緑に変更されます(このスタイルはスタイルテンプレートから参照されます)。
レポートスクリプトレット
前の章で説明したように、レポートに表示されるデータは通常、レポートパラメーターとレポートフィールドから取得されます。 このデータは、レポート変数とその式を使用して処理できます。 レポートの式または変数を使用して複雑な機能を簡単に実現できない場合があります。 この例としては、複雑な文字列操作、マップの構築、メモリ内のオブジェクトのリスト、またはサードパーティのJava APIを使用した日付の操作があります。 そのような状況に対して、JasperReportsは Scriptlets でこれを行う簡単で強力な手段を提供します。
スクリプトレットは、レポートイベントが発生するたびに実行されるJavaコードのシーケンスです。 レポート変数の値は、スクリプトレットを通じて影響を受ける可能性があります。
スクリプトレット宣言
スクリプトレットは2つの方法で宣言できます-
- <* scriptlet *>要素を使用します。 この要素には、_name_属性と_class_属性があります。 _class_属性は、_JRAbstractScriptlet_クラスを拡張するクラスの名前を指定する必要があります。 このクラスは、レポートの入力時にクラスパスで使用可能でなければならず、空のコンストラクターが必要です。これにより、エンジンがその場でインスタンス化できます。
- レポートテンプレート(JRXML)で、要素<* jasperReport >の属性 *scriptletClass を使用します。 スクリプトレットの完全修飾名(パッケージ名全体を含む)でこの属性を設定することにより、スクリプトレットを使用することを示します。 この属性で作成されたスクリプトレットインスタンスは、スクリプトレットのリストの最初のスクリプトレットのように機能し、 定義済みの名前REPORT。
スクリプトレットクラス
スクリプトレットは、次のクラスのいずれかを拡張する必要があるJavaクラスです-
- net.sf.jasperreports.engine.JRAbstractScriptlet -このクラスには、すべての実装でオーバーライドする必要があるいくつかの抽象メソッドが含まれています。 これらのメソッドは、適切なタイミングでJasperReportsによって自動的に呼び出されます。 開発者は、すべての抽象メソッドを実装する必要があります。
- net.sf.jasperreports.engine.JRDefaultScriptlet -このクラスには、JRAbstractScriptletのすべてのメソッドのデフォルトの空の実装が含まれています。 開発者は、自分のプロジェクトに必要なメソッドを実装することのみが必要です。
次の表に、上記のクラスのメソッドを示します。 これらのメソッドは、レポート入力フェーズの適切なタイミングでレポートエンジンによって呼び出されます。
S.NO | Method and Description |
---|---|
1 |
public void beforeReportInit() レポートの初期化の前に呼び出されます。 |
2 |
public void afterReportInit() レポートの初期化後に呼び出されます。 |
3 |
public void beforePageInit() 各ページが初期化される前に呼び出されます。 |
4 |
public void afterPageInit() 各ページが初期化された後に呼び出されます。 |
5 |
public void beforeColumnInit() 各列が初期化される前に呼び出されます。 |
6 |
public void afterColumnInit() 各列が初期化された後に呼び出されます。 |
7 |
public void beforeGroupInit(String groupName) パラメーターで指定されたグループが初期化される前に呼び出されます。 |
8 |
public void afterGroupInit(String groupName) パラメーターで指定されたグループが初期化された後に呼び出されます。 |
9 |
public void beforeDetailEval() レポートの詳細セクションの各レコードが評価される前に呼び出されます。 |
10 |
public void afterDetailEval() レポートの詳細セクションの各レコードが評価された後に呼び出されます。 |
レポートごとに任意の数のスクリプトレットを指定できます。 レポートにスクリプトレットが指定されていない場合、エンジンは単一のJRDefaultScriptletインスタンスを作成し、組み込みのREPORT_SCRIPTLETパラメーターで登録します。
スクリプトレットに必要な追加のメソッドを追加できます。 レポートは、組み込みパラメーターREPORT_SCRIPTLETを使用してこれらのメソッドを呼び出すことができます。
グローバルスクリプトレット
スクリプトレットを別の方法でレポートに関連付けることができます。これは、スクリプトレットをグローバルに宣言することです。 これにより、スクリプトレットは、特定のJasperReportsデプロイメントで入力されるすべてのレポートに適用されます。 これは、スクリプトレットを拡張機能としてJasperReportsに追加できるため、簡単です。 スクリプトレット拡張ポイントは、_net.sf.jasperreports.engine.scriptlets.ScriptletFactory_インターフェースで表されます。 JasperReportsは、実行時に拡張機能を介して利用可能なすべてのスクリプトレットファクトリをロードします。 次に、実行中の現在のレポートに適用するスクリプトレットインスタンスのリストを各自に要求します。 スクリプトレットインスタンスのリストを要求すると、エンジンは、どのスクリプトレットが現在のレポートに実際に適用されるかを決定するためにファクトリが使用できるコンテキスト情報を提供します。
総裁報告
ガバナーは、レポートの生成中にレポートエンジンが実行時に無限ループに入る問題に取り組むことができるグローバルスクリプトレットの単なる拡張機能です。 ほとんどの場合、無限ループに入る条件は実行時にエンジンに供給される実際のデータに依存するため、無効なレポートテンプレートは設計時に検出できません。 レポートガバナーは、特定のレポートが無限ループに入っており、それを停止できるかどうかを判断するのに役立ちます。 これにより、レポートを実行するマシンのリソースが枯渇するのを防ぎます。
JasperReportsには、指定された最大ページ数または指定されたタイムアウト間隔に基づいてレポートの実行を停止する2つの単純なレポートガバナーがあります。 彼らは-
- net.sf.jasperreports.governors.MaxPagesGovernor -これは、現在実行中のレポートに適用するかどうかを決定する2つの構成プロパティを探しているグローバルスクリプトレットです。 構成プロパティは次のとおりです-
- net.sf.jasperreports.governor.max.pages.enabled = [true | false]
- net.sf.jasperreports.governor.max.pages = [整数]
- * net.sf.jasperreports.governors.TimeoutGovernor *-これは、次の2つの構成プロパティを探して適用するかどうかを決定するグローバルスクリプトレットでもあります。 +構成プロパティは-
- net.sf.jasperreports.governor.timeout.enabled = [true | false]
- net.sf.jasperreports.governor.timeout = [ミリ秒]
両方のガバナーのプロパティは、jasperreports.propertiesファイルでグローバルに、またはレポートレベルで、カスタムレポートプロパティとして設定できます。 これは、レポートごとに推定サイズまたはタイムアウト制限が異なる場合があり、また、すべてのレポートでガバナーをオンにし、一部のレポートではオフにするか、またはその逆を行う場合があるため便利です。
例
スクリプトレットクラス( MyScriptlet )を作成しましょう。 ファイルC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides \ MyScriptlet.javaの内容は次のとおりです-
package com.finddevguides;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;
public class MyScriptlet extends JRDefaultScriptlet {
public void afterReportInit() throws JRScriptletException{
System.out.println("call afterReportInit()");
//this.setVariableValue("AllCountries", sbuffer.toString());
this.setVariableValue("someVar", new String("This variable value
was modified by the scriptlet."));
}
public String hello() throws JRScriptletException {
return "Hello! I'm the report's scriptlet object.";
}
}
上記のスクリプトレットクラスの詳細は次のとおりです-
- _afterReportInit_メソッドで、変数 "someVar" this.setVariableValue( "someVar"、new String( "この変数値はスクリプトレットによって変更されました。"))に値を設定します。
- クラスの最後に、 'hello' という追加のメソッドが定義されています。 これは、変数を設定するのではなく、実際に値を返すスクリプトレットに追加できるメソッドの例です。
次に、既存のレポートテンプレートにスクリプトレットクラスの参照を追加します(チャプターリンク:/jasper_reports/jasper_report_designs [Report Designs])。 改訂されたレポートテンプレート(jasper_report_template.jrxml)は次のとおりです。 C:\ tools \ jasperreports-5.0.1 \ testディレクトリに保存します-
<?xml version = "1.0"?>
<!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" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50"
scriptletClass = "com.finddevguides.MyScriptlet">
<style name = "alternateStyle" fontName = "Arial" forecolor = "red">
<conditionalStyle>
<conditionExpression>
<![CDATA[new Boolean($V{countNumber}.intValue() % 2 == 0)]]>
</conditionExpression>
<style forecolor = "blue" isBold = "true"/>
</conditionalStyle>
</style>
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription>
<![CDATA[country]]>
</fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription>
<![CDATA[name]]>
</fieldDescription>
</field>
<variable name = "countNumber" class = "java.lang.Integer"
calculation = "Count">
<variableExpression><
![CDATA[Boolean.TRUE]]>
</variableExpression>
</variable>
<variable name = "someVar" class = "java.lang.String">
<initialValueExpression>
<![CDATA["This is the initial variable value."]]>
</initialValueExpression>
</variable>
<title>
<band height = "100">
<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>
<textField isBlankWhenNull = "true">
<reportElement x = "0" y = "50" width = "515"
height = "30" forecolor = "#993300"/>
<textElement textAlignment = "Center">
<font size = "10"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$V{someVar}]]>
</textFieldExpression>
</textField>
</band>
</title>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3"
width = "535" height = "15"
backcolor = "#70A9A9"/>
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0"
width = "535" height = "14"
backcolor = "#E5ECF9"/>
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC"/>
</box>
<textElement/>
<text>
<![CDATA[]]>
</text>
</staticText>
<textField>
<reportElement style = "alternateStyle" x="414" y = "0"
width = "121" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle"/>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
<summary>
<band height = "45">
<textField isStretchWithOverflow = "true">
<reportElement x = "0" y = "10" width = "515" height = "15"/>
<textElement textAlignment = "Center"/>
<textFieldExpression class = "java.lang.String">
<![CDATA["There are " + String.valueOf($V{REPORT_COUNT}) +
" records on this report."]]>
</textFieldExpression>
</textField>
<textField isStretchWithOverflow = "true">
<reportElement positionType = "Float" x = "0" y = "30" width = "515"
height = "15" forecolor = "# 993300"/>
<textElement textAlignment = "Center">
<font size = "10"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{REPORT_SCRIPTLET}.hello()]]>
</textFieldExpression>
</textField>
</band>
</summary>
</jasperReport>
改訂されたレポートテンプレートの詳細は以下のとおりです-
- <jasperReport>要素の_scriptletClass_属性でMyScriptletクラスを参照しました。
- スクリプトレットはレポートフィールドとパラメータにのみアクセスできますが、変更はできません。 ただし、スクリプトレットはレポート変数値を変更できます。 これは、setVariableValue()メソッドを呼び出すことで実現できます。 このメソッドは、常にスクリプトレットの親クラスであるJRAbstractScriptletクラスで定義されます。 ここでは、変数_someVar_を定義しました。この変数は、MyScriptletによって_This value was by scriptlet_の値に変更されます。
- 上記のレポートテンプレートには、(スクリプトレットで)新しいメソッドを記述し、それらをレポートテンプレートで使用する方法を示すメソッドコールが[概要]バンドにあります。 (* $ P \ {REPORT_SCRIPTLET} .hello()*)
レポート入力の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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 bu
[javac] Compiling 4 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.
[java] call afterReportInit()
[java] call afterReportInit()
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: 18 minutes 49 seconds
上記のコンパイルの結果、JasperViewerウィンドウが開き、以下の画面に表示されます-
ここでは、MyScriptletクラスから2つのメッセージが表示されます-
- タイトルセクション-この変数値はスクリプトレットによって変更されました
- 下部-_Hello! 私はレポートのスクリプトレットオブジェクトです。
サブレポートを作成する
サブレポートは、JasperReportsの優れた機能の1つです。 この機能により、レポートを別のレポートに組み込むことができます。つまり、あるレポートを別のレポートのサブレポートにすることができます。 サブレポートは、多くの単純なレポートを作成し、それらをマスターレポートにカプセル化できるため、レポートデザインをシンプルに保つのに役立ちます。 サブレポートは、通常のレポートと同様にコンパイルされ、入力されます。 (レポートテンプレートの)内部で何も変更せずに、任意のレポートテンプレートを別のレポートテンプレートに組み込むと、サブレポートとして使用できます。
サブレポートは、通常のレポートテンプレートに似ています。 これらは実際には_net.sf.jasperreports.engine.JasperReport_オブジェクトであり、_net.sf.jasperreports.engine.design.JasperDesign object_をコンパイルした後に取得されます。
<subreport>要素
<subreport>要素は、サブレポートをマスターレポートに導入するときに使用されます。 以下は、<subreport> JRXML要素のサブ要素のリストです。
- <reportElement>
- <parametersMapExpression>-これは、レポートパラメーターを含むマップをサブレポートに渡すために使用されます。 マップは通常、マスターレポートのパラメーターから取得するか、組み込みのREPORTS_PARAMETERS_MAPパラメーターを使用して親レポートのパラメーターをサブレポートに渡します。 この式は、キーがパラメーターである_java.util.Map_オブジェクトを常に返す必要があります 名前
- <subreportParameter>-この要素は、パラメータをサブレポートに渡すために使用されます。 _name_属性がありますが、これは必須です。
- <connectionExpression>-これは、_java.sql.Connection_をサブレポートに渡すために使用されます。 これは、レポート入力段階でサブレポートテンプレートにデータベース接続が必要な場合にのみ使用されます。
- <dataSourceExpression>-これは、データソースをサブレポートに渡すために使用されます。 通常、このデータソースは、マスターレポートのパラメーターから取得するか、組み込みのREPORT_DATA_SOURCEパラメーターを使用して親レポートのデータソースをサブレポートに渡します。
- 要素(connectionExpressionおよびdataSourceExpression)は、<subreport>要素宣言に同時に存在することはできません。 これは、データソースとサブレポートへの接続の両方を提供できないためです。 それらの1つを決定し、それに固執しなければなりません。
- <returnValue>-これは、サブレポートの変数の1つの値をマスターレポートの変数の1つに割り当てるために使用されます。 このサブ要素には、次のような属性があります-
- subreportVariable-この属性は、値が返されるサブレポート変数の名前を指定します。
- toVariable-この属性は、サブレポートの値で値がコピー/インクリメントされる親レポート変数の名前を指定します。
- calculation-この属性は値をとることができます:Nothing、Count、DistinctCount、Sum、Average、Lowest、Highest、StandardDeviation、Variance。 属性_calculation_のデフォルト値は「Nothing」です。
- incrementerFactoryClass-この属性は、増分インスタンスを作成するためのファクトリクラスを指定します。
- <subreportExpression>-これは、サブレポートのコンパイル済みレポートテンプレートの場所を示します。 この要素には class 属性があります。 _class_属性は、java.lang.String、java.io.File、java.net.URL、java.io.InputStream、net.sf.jasperreports.engine.JasperReportのいずれかの値を取ることができます。 デフォルト値は_java.lang.String_です。
- isUsingCache-これは<subreport>要素の属性です。 これはブール値です。_true_に設定すると、レポートエンジンは、指定されたソースを使用して、以前にロードされたサブレポートテンプレートオブジェクトを認識しようとします。 このキャッシュ機能は、ファイル名、URL、またはクラスパスリソースを表すjava.lang.Stringオブジェクトをサブレポートテンプレートソースとして返す式を持つサブレポート要素でのみ使用できます。
例
簡単な例を取り上げて、JRDataSourceを使用したサブレポートの作成を示します。 最初にサブレポートとマスターレポートの2つの新しいレポートテンプレートを作成しましょう。 サブレポート(address_report_template.jrxml)テンプレートの内容は次のとおりです。 C:\ tools \ jasperreports-5.0.1 \ testディレクトリに保存します。
<?xml version = "1.0" encoding = "UTF-8"?>
<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 = "address_report_template" pageWidth = "175" pageHeight = "842"
columnWidth = "175" leftMargin = "0" rightMargin = "0"
topMargin = "0" bottomMargin = "0">
<field name = "city" class = "java.lang.String"/>
<field name = "street" class = "java.lang.String"/>
<background>
<band splitType = "Stretch"/>
</background>
<title>
<band height = "20" splitType = "Stretch">
<staticText>
<reportElement x = "0" y = "0" width = "100" height = "20"/>
<textElement>
<font size = "14" isBold = "true"/>
</textElement>
<text><![CDATA[Addresses]]></text>
</staticText>
</band>
</title>
<pageHeader>
<band height = "12" splitType = "Stretch"/>
</pageHeader>
<columnHeader>
<band height = "12" splitType = "Stretch"/>
</columnHeader>
<detail>
<band height = "27" splitType = "Stretch">
<textField>
<reportElement x = "0" y = "0" width = "120" height = "20"/>
<textElement>
<font size = "12" isBold = "true"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{city}+" Address:"]]>
</textFieldExpression>
</textField>
<textField isStretchWithOverflow = "true">
<reportElement x = "120" y = "0" width = "435" height = "20"/>
<textElement>
<font size = "12"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{street}]]>
</textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height = "8" splitType = "Stretch"/>
</columnFooter>
<pageFooter>
<band height = "11" splitType = "Stretch"/>
</pageFooter>
<summary>
<band height = "9" splitType = "Stretch"/>
</summary>
</jasperReport>
データソースを使用するため、以下に示すように、対応するPOJOファイル SubReportBean.java を記述する必要があります。 それをディレクトリC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguidesに保存します-
package com.finddevguides;
public class SubReportBean {
private String city;
private String street;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
ここでは、2つのフィールド_'cityおよびstreet'_を宣言し、それぞれのgetterおよびsetterメソッドが定義されています。
それでは、既存の DataBean ファイルを更新しましょう。 新しいフィールド_subReportBeanList_を追加します。これはjava.util.Listです。 このフィールドには、SubReportBeanオブジェクトのリストが保持されます。 ファイルDataBeanの内容は次のとおりです。 ディレクトリC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguidesに保存します。
package com.finddevguides;
import java.util.List;
public class DataBean {
private String name;
private String country;
private List<SubReportBean> subReportBeanList;
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;
}
public List<SubReportBean> getSubReportBeanList() {
return subReportBeanList;
}
public void setSubReportBeanList(List<SubReportBean> subReportBeanList) {
this.subReportBeanList = subReportBeanList;
}
}
次に、ファイルC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides \ DataBeanList.java を更新します。 このファイルの内容は次のとおりです-
package com.finddevguides;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DataBeanList {
public ArrayList<DataBean> getDataBeanList() {
//Create sub report data
SubReportBean subBean1 = new SubReportBean();
subBean1.setCity("Mumbai");
subBean1.setStreet("M.G.Road");
SubReportBean subBean2 = new SubReportBean();
subBean2.setCity("New York");
subBean2.setStreet("Park Street");
SubReportBean subBean3 = new SubReportBean();
subBean3.setCity("San Fransisco");
subBean3.setStreet("King Street");
ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();
//Create master report data
dataBeanList.add(produce("Manisha", "India",
Arrays.asList(subBean1)));
dataBeanList.add(produce("Dennis Ritchie", "USA",
Arrays.asList(subBean2)));
dataBeanList.add(produce("V.Anand", "India",
Arrays.asList(subBean1)));
dataBeanList.add(produce("Shrinath", "California",
Arrays.asList(subBean3)));
return dataBeanList;
}
/*
*This method returns a DataBean object,
* with name, country and sub report
*bean data set in it.
*/
private DataBean produce(String name, String country,
List<SubReportBean> subBean) {
DataBean dataBean = new DataBean();
dataBean.setName(name);
dataBean.setCountry(country);
dataBean.setSubReportBeanList(subBean);
return dataBean;
}
}
上記のファイルのメソッドproduce()では、SubReportBeanのリストを設定しています。
それでは、新しいマスターレポートテンプレート(jasper_report_template.jrxml)を作成しましょう。 このファイルをディレクトリ C:\ tools \ jasperreports-5.0.1 \ test に保存します。 このファイルの内容は次のとおりです-
<?xml version = "1.0" encoding = "UTF-8"?>
<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 = "SUBREPORT_DIR" class = "java.lang.String" isForPrompting = "false">
<defaultValueExpression>
<![CDATA["C:\\tools\\jasperreports-5.0.1\\test\\"]]>
</defaultValueExpression>
</parameter>
<field name = "country" class = "java.lang.String"/>
<field name = "name" class = "java.lang.String"/>
<field name = "subReportBeanList" class = "java.util.List"/>
<background>
<band splitType = "Stretch"/>
</background>
<title>
<band height = "35" splitType = "Stretch">
<staticText>
<reportElement x = "0" y = "0" width = "204" height = "34"/>
<textElement>
<font size = "26" isBold = "true"/>
</textElement>
<text><![CDATA[Contact Report]]></text>
</staticText>
</band>
</title>
<pageHeader>
<band height = "17" splitType = "Stretch"/>
</pageHeader>
<columnHeader>
<band height = "21" splitType = "Stretch"/>
</columnHeader>
<detail>
<band height = "112" splitType = "Stretch">
<staticText>
<reportElement x = "0" y = "0" width = "100" height = "20"/>
<textElement>
<font size = "12" isBold = "true"/>
</textElement>
<text><![CDATA[Name:]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "20" width = "100" height = "20"/>
<textElement>
<font size = "12" isBold = "true"/>
</textElement>
<text><![CDATA[Country:]]></text>
</staticText>
<textField>
<reportElement x = "104" y = "0" width = "277" height = "20"/>
<textElement>
<font size = "12"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "104" y = "20" width = "277" height = "20"/>
<textElement>
<font size = "12"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<subreport>
<reportElement positionType = "Float" x = "335" y = "25" width = "175"
height = "20" isRemoveLineWhenBlank = "true" backcolor = "#99ccff"/>
<dataSourceExpression>
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
($F{subReportBeanList})
</dataSourceExpression>
<subreportExpression class = "java.lang.String">
<![CDATA[$P{SUBREPORT_DIR} + "address_report_template.jasper"]]>
</subreportExpression>
</subreport>
<line>
<reportElement x = "0" y = "50" width = "550" height = "1"/>
</line>
</band>
</detail>
<columnFooter>
<band height = "19" splitType = "Stretch"/>
</columnFooter>
<pageFooter>
<band height = "18" splitType = "Stretch"/>
</pageFooter>
<summary>
<band height = "14" splitType = "Stretch"/>
</summary>
</jasperReport>
上記のテンプレートでは、サブレポートのパスを定義する新しいパラメーター「SUBREPORT_DIR」を定義しています。 ファイルDataBeanのプロパティに対応するタイプ_java.util.List、_のフィールド_subReportBeanList_を定義しました。 要素<subreport>にはサブ要素<dataSourceExpression>があります。 リスト_subReportBeanList_をJRBeanCollectionDataSourceのインスタンスに配置しました。 サブ要素<subreportExpression/>で、サブレポート名(AddressReport.jasper)を指定しました。
次に、レポートテンプレートをコンパイルして実行する新しいクラス CreateReport を作成しましょう。 ファイル C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguides \ CreateReport.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.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class CreateReport {
public static void main(String[] args) {
String masterReportFileName = "C://tools/jasperreports-5.0.1/test"
+ "/jasper_report_template.jrxml";
String subReportFileName = "C://tools/jasperreports-5.0.1/test"
+ "/AddressReport.jrxml";
String destFileName = "C://tools/jasperreports-5.0.1/test"
+ "/jasper_report_template.JRprint";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource = new
JRBeanCollectionDataSource(dataList);
try {
/*Compile the master and sub report*/
JasperReport jasperMasterReport = JasperCompileManager
.compileReport(masterReportFileName);
JasperReport jasperSubReport = JasperCompileManager
.compileReport(subReportFileName);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("subreportParameter", jasperSubReport);
JasperFillManager.fillReportToFile(jasperMasterReport,
destFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
System.out.println("Done filling!!! ...");
}
}
ここで、マスターレポートテンプレートとサブレポートテンプレートの両方をコンパイルし、レポート入力用のマスターレポート(.jasper)ファイルを渡していることがわかります。
レポート生成
これで、すべてのファイルの準備が整いました。通常の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.CreateReport (viewFullReportがデフォルトのターゲットです)を実行します-
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
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 7 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.CreateReport
[java] Compiling Report Design ...
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[java] log4j:WARN Please initialize the log4j system properly.
[java] Done filling!!! ...
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: 72 minutes 13 seconds
上記のコンパイルの結果、JasperViewerウィンドウが開き、以下の画面に表示されます-
ここでは、属性Name、Country、およびAddressが表示されていることがわかります。
チャートを作成する
以前の人々は、スクリプトレットに依存してチャートデータを収集し、レポートテンプレートの画像要素を使用してチャートをレンダリングする必要がありました。 JasperReportsでは、新しいチャートコンポーネントを使用したチャートのサポートが組み込まれているため、簡単になりました。
ユーザーは新しいチャートコンポーネントを使用して、視覚的な設定のみを適用し、チャートデータセットの構築に役立つ式を定義する必要があります。 JasperReportsは、基になるチャートライブラリとしてJFreeChartを使用します。 新しいチャートコンポーネントを設定する場合、次の3つのコンポーネントが関係します-
- 全体的なチャートコンポーネント。
- チャートデータセット(チャートデータ関連の設定をグループ化)。
- チャートプロット(チャートアイテムのレンダリング方法に関連する視覚的な設定をグループ化します)。
JasperReportsは現在、円グラフ、円グラフ3D、棒グラフ、棒グラフ3D、XY棒グラフ、積み上げ棒グラフ、積み重ね棒グラフ3D、線、XY線、面、XY面、積み上げ面、散布図、バブル、時系列、高-低-開-閉、ローソク足、多軸、メーター、温度計、ガント。
チャートのプロパティ
チャートは通常のレポート要素なので、他のすべてのレポート要素とプロパティの一部を共有します。 すべてのタイプのチャートを作成するために使用される、<* chart *>と呼ばれるJRXML要素があります。 この要素は、すべてのタイプのチャートに適用される特別なチャート固有の設定をグループ化します。
グラフのサブ要素
<chart>要素のサブ要素は-
- <reportElement> -これらは、レポートテンプレートセクションに配置する静的テキスト、テキストフィールド、画像、線、長方形などの表示可能なオブジェクトです。
- <Box> -この要素は、各辺でカスタマイズ可能な境界線でチャートを囲むために使用されます。
- <chartTitle> -この要素は、チャートのタイトルを配置するために使用されます。 position_属性は、レポート内のチャートのタイトル位置を決定します。 この要素には属性があります-位置(値は_Top _、 Bottom 、 Left 、 Right_です。 デフォルト値は_Top _)、 color です。 <chartTitle>には、サブ要素として_font_と_titleExpression_があります。
- <chartSubtitle> -この要素は、チャートのサブタイトルを配置するために使用されます。 この要素には属性- color があります。 <chartSubtitle>には、_font_と_subtitleExpression_がサブ要素としてあります。
- <chartLegend> -要素は、この要素を使用して、グラフの凡例のテキスト色と背景色だけでなく、フォント関連のプロパティも制御できます。 この要素には、 textColor および backgroundColor という属性があります。
- <anchorNameExpression> -この要素は、アンカーのターゲットを作成します。
- <hyperlinkReferenceExpression> -この要素には、外部リソース(通常はURL)の名前を示すレポート式が含まれます。
- <hyperlinkAnchorExpression> -ハイパーリンクは外部リソースのアンカーを指します。
- <hyperlinkPageExpression> -ハイパーリンクは現在のレポートのページを指します。
- <hyperlinkTooltipExpression> -この要素は、ハイパーリンクのツールチップを制御します。 式のタイプは_java.lang.String_である必要があります。
- <hyperlinkParameter> -この要素が存在する場合、パラメータ値に応じて最終的なハイパーリンクが生成されます。
チャート属性
すべてのチャートタイプで使用可能な<chart>要素の属性は次のとおりです-
- isShowLegend -この属性は、グラフの凡例をレポートに表示するかどうかを決定するために使用されます。 値は_true_または_false_です。 デフォルト値は_true_です。
- evaluationTime -チャートの式がいつ評価されるかを決定します。 値は、Now _、 Report 、 Page 、 Column 、 Group 、 Band_です。 デフォルト値は_Now_です。
- evaluationGroup -この属性は、チャートの式を評価するために使用されるグループの名前を決定します。 この属性の値は、グループの名前と一致する必要があります。チャートの評価グループとして使用します。
- hyperlinkType -この属性は任意のテキスト値を保持できます。 デフォルト値は_None_です。 つまり、特殊なハイパーリンク式が存在する場合でも、テキストフィールドも画像もハイパーリンクを表しません。
- hyperlinkTarget -この属性は、ビューアでクリックされたときに指定されたリンクの動作をカスタマイズするのに役立ちます。 値は_Self_または_Blank_の場合があります。 デフォルト値は_Self_です。
- bookmarkLevel -この属性を正の整数に設定すると、PDFにエクスポートされたレポートにブックマークが生成されます。 デフォルト値は_0_です。
- customizerClass -これは、チャートのカスタマイズに使用できるクラスの名前(オプション)です。 この要素の値は、カスタマイザークラスの名前を含む文字列でなければなりません。
チャートのカスタマイズ
前述のように、JasperReportsは_JFreeChart_を基になるグラフ作成ライブラリとして使用します。 _JFreeChart_には、JasperReportsで直接サポートされていない機能が含まれています。 <chart>要素の_customizerClass_属性を介してカスタマイザークラスを提供することにより、これらの機能を利用できます。 カスタマイザークラスは何でもありませんが、_net.sf.jasperreports.engine.JRChartCustomizer_インターフェースの実装です。 このインターフェースを実装する最も簡単な方法は、_net.sf.jasperreports.engine.JRAbstractChartCustomizer_クラスを拡張し、パラメーター、フィールド、および変数にアクセスして、レポートデータに基づいてより柔軟なチャートカスタマイズを行うことです。
チャートデータセット
すべてのチャートタイプに共通するプロパティの1つは、<* dataset *>要素です。 チャートデータセットは、レポートデータのマッピングと実行時のチャートデータの取得に役立ちます。 各チャートタイプには、チャートの式を定義するためのさまざまなサブ要素が含まれています。 これらの式は、チャートの生成に使用されるデータを定義します。 これらのサブ要素にはすべて、チャートの式が評価およびリセットされるタイミングを定義する<dataset>要素が含まれます。
JasperReportsでは、各タイプのチャートが特定のデータセット(円、カテゴリ、XY、時系列、期間、XYZ、高低)で動作するため、いくつかのタイプのチャートデータセットを使用できます。 これらの各データセットタイプは、チャートデータセットを定義する_net.sf.jasperreports.engine.JRChartDataset_インターフェイスを実装します。 すべてのチャートデータセットは、同じ方法で初期化および増分されます。ただし、マップするデータまたはデータ系列のタイプのみが異なります。
データセットのプロパティ
以下の表は、要素<dataset>の属性をまとめたものです-
Attribute | Description | Values |
---|---|---|
resetType | This attribute determines when the value of the chart expression is to be reset. | None, Report, Page, Column, Group. Default value is Report. |
resetGroup | This attribute determines the name of the group at which the chart expression value is reset. | The value for this attribute must match the name of any group declared in the JRXML report template. |
incrementType | This attribute determines when to recalculate the value of the chart expression. | None, Report, Page, Column, Group. Default value is "None". |
incrementGroup | This attribute determines the name of the group at which the chart expression is recalculated. | The value for this attribute must match the name of a group declared in the JRXML report template. |
次の表は、要素<dataset>のサブ要素をまとめたものです-
Sub element | Description |
---|---|
<incrementWhenExpression> | The way a chart dataset is incremented can be customized by filtering out unwanted data through the use of this sub element. |
<datasetRun> | This contains information required to instantiate a report subdataset. |
データセットの種類
特定のデータセットの種類は以下で説明されています-
パイデータセット
パイデータセットは、次の式によって特徴付けられます-
- <keyExpression>-円グラフのスライスを構成するカテゴリを表します。 この式は、任意のjava.lang.Comparableオブジェクトを返すことができます。
- <valueExpression>-データセットの各カテゴリ/キーに対応する値を生成します。 値は常にjava.lang.Numberオブジェクトです。
- <labelExpression>-この式が欠落している場合、グラフには円グラフの各スライスのデフォルトラベルが表示されます。 java.lang.String値を返すこの式を使用して、円グラフのアイテムラベルをカスタマイズします。
- <sectionHyperlink>-パイセクションに関連付けられたハイパーリンクを設定します。
カテゴリデータセット
カテゴリデータセットは、以下を含む<categorySeries>要素によって特徴付けられます-
- <seriesExpression>-シリーズの名前を示します。 この式は、任意のjava.lang.Comparableオブジェクトを返すことができます。
- <categoryExpression>-シリーズ式で指定されたシリーズ内の各値のカテゴリ名を返します。 カテゴリはjava.lang.Comparableオブジェクトです。
- <valueExpression>-データセットの各カテゴリに対応する値を生成します。 値は常にjava.lang.Numberオブジェクトです。
- <labelExpression>-この式が欠落している場合、チャートはチャート内の各アイテムのデフォルトのラベルを表示します。 java.lang.String値を返すこの式を使用して、チャートのアイテムラベルをカスタマイズします。
- <itemHyperlink>-チャートアイテムに関連付けられたハイパーリンクを設定します。
XYデータセット
XYデータセットは、以下を含む<xySeries>要素によって特徴付けられます-
- <seriesExpression>-シリーズの名前を示します。 この式は、任意のjava.lang.Comparableオブジェクトを返すことができます。
- <xValueExpression>-現在のデータ系列に追加される(x、y)ペアのX値を表すjava.lang.Number値を返します。
- <yValueExpression>-現在のデータ系列に追加される(x、y)ペアのY値を表すjava.lang.Number値を返します。
- <labelExpression>-この式が欠落している場合、チャートはチャート内の各アイテムのデフォルトのラベルを表示します。 java.lang.String値を返すこの式を使用して、チャートのアイテムラベルをカスタマイズします。
- <itemHyperlink>-チャートアイテムに関連付けられたハイパーリンクを設定します。
XYZデータセット
XYZデータセットは、以下を含む<xyzSeries>要素によって特徴付けられます-
- <seriesExpression>-シリーズの名前を示します。 この式は、任意のjava.lang.Comparableオブジェクトを返すことができます。
- <xValueExpression>-現在のデータ系列に追加される(x、y、z)アイテムのX値を表すjava.lang.Number値を返します。
- <yValueExpression>-現在のデータ系列に追加される(x、y、z)アイテムのY値を表すjava.lang.Number値を返します。
- <zValueExpression>-現在のデータ系列に追加される(x、y、z)アイテムのZ値を表すjava.lang.Number値を返します。
- <labelExpression>-この式が欠落している場合、チャートはチャート内の各アイテムのデフォルトのラベルを表示します。 java.lang.String値を返すこの式を使用して、チャートのアイテムラベルをカスタマイズします。
- <itemHyperlink>-チャートアイテムに関連付けられたハイパーリンクを設定します。
時系列データセット
時系列データセットは、timePeriod属性と<timeSeries>要素によって特徴付けられます。 timePeriod属性は、データセット内のデータ系列のタイプを指定します。 時系列には、日、月、年、またはその他の事前定義された期間に関連付けられた数値を含めることができます。 可能な値は次のとおりです。_年、四半期、月、週、日-これはデフォルト値です。時間、分、秒、ミリ秒。
<timeSeries>要素には次が含まれます-
- <seriesExpression>-シリーズの名前を示します。 この式は、任意のjava.lang.Comparableオブジェクトを返すことができます。
- <timePeriodExpression>-上記のtimePeriod属性に設定された値に応じて、エンジンが対応する期間を抽出するjava.util.Date値を返します。
- <valueExpression>-データセットの現在のシリーズをインクリメントするときに、対応する期間値に関連付けるjava.lang.Number値を返します。
- <labelExpression>-この式が欠落している場合、チャートはチャート内の各アイテムのデフォルトのラベルを表示します。 java.lang.String値を返すこの式を使用して、チャートのアイテムラベルをカスタマイズします。
- <itemHyperlink>-チャートアイテムに関連付けられたハイパーリンクを設定します。
期間データセット
期間データセットは、<timePeriodSeries>要素によって特徴付けられます。
- <seriesExpression>-シリーズの名前を示します。 この式は、任意のjava.lang.Comparableオブジェクトを返すことができます。
- <startDateExpression>-数値が時系列に追加されるときに関連付けられる日付間隔の開始を指定します。
- <endDateExpression>-数値が時系列に追加されるときに関連付けられる日付間隔の終了を指定します。
- <valueExpression>-開始日および終了日の式で指定された現在の日付間隔に関連付けるjava.lang.Number値を返します。
- <labelExpression>-この式が欠落している場合、チャートはチャート内の各アイテムのデフォルトのラベルを表示します。 java.lang.String値を返すこの式を使用して、チャートのアイテムラベルをカスタマイズします。
- <itemHyperlink>-チャートアイテムに関連付けられたハイパーリンクを設定します。
高低データセット
高低データセットは、次の式によって特徴付けられます-
- <seriesExpression>-現在、高低チャートまたはローソク足チャート内では1つのシリーズのみがサポートされています。 ただし、この単一のシリーズは、この式によって返されるjava.lang.Comparable値によって識別される必要があり、チャートの凡例のシリーズ名としても使用される必要があります。
- <dateExpression>-現在の(高、低、オープン、クローズ、ボリューム)アイテムが参照する日付を返します。
- <highExpression>-java.lang.Number値を返します。この値は、データセットが増分されると系列に追加されるデータ項目の一部になります。
- <lowExpression>-java.lang.Number値を返します。この値は、データセットが増分されると系列に追加されるデータ項目の一部になります。
- <openExpression>-java.lang.Number値を返します。この値は、データセットがインクリメントされるときに系列に追加されるデータ項目の一部になります。
- <closeExpression>-java.lang.Number値を返します。この値は、データセットがインクリメントされるときに系列に追加されるデータ項目の一部になります。
- <volumeExpression>-現在のデータ項目に使用するボリューム値を返す数値式。 ローソク足チャートにのみ使用されます。
- <itemHyperlink>-チャートアイテムに関連付けられたハイパーリンクを設定します。
値データセット
これは、単一の値を含む特別なチャートデータセットの実装であり、メーターおよび温度計チャートのレンダリングに使用されます。 値は、<valueExpression>式を使用して収集されます。
チャートプロット
すべてのチャートタイプで使用されるもう1つの一般的なJRXML要素は、<* plot *>要素です。 これにより、方向や背景色などのチャートのいくつかの特性を定義できます。 プロットは、チャートのタイプに基づいて異なります。
プロット属性
以下の表は、<plot>要素の属性をまとめたものです-
Attribute | Description | Values |
---|---|---|
backcolor | This attribute defines the chart’s background color. | Any six digit hexadecimal value is a valid value for this attribute. The hexadecimal value must be preceded by a #. |
orientation | This attribute defines the chart’s orientation. | Horizontal,Vertical Default value is "Vertical" |
backgroundAlpha | This attribute defines the transparency of the chart’s background color. | The valid values for this attribute include any decimal number between 0 and 1, inclusive. The higher the number, the less transparent the background will be. Default value is "1." |
foregroundAlpha | This attribute defines the transparency of the chart’s foreground colors. | The valid values for this attribute include any decimal number between 0 and 1, inclusive. The higher the number, the less transparent the background will be. Default value is "1." |
labelRotation | This attribute allows rotation of text labels on x-axis to rotate clockwise or anti-clockwise. This attribute applies only to charts for which the x axis is not numeric or does not display dates. | Default value is "0.0." |
<plot>要素には、サブ要素<seriesColor>があり、属性は_seriesOrder_および_color_です。 この要素は、シリーズの色と、色シーケンス内の位置をカスタマイズします。
チャートプロットの特定の設定
- piePlot -特定の設定はありません
- pie3DPlot -_depthFactor_属性、0〜1の範囲の数値を含み、円の深さをプロット領域の高さの割合として表します。
- barPlot -目盛りラベル、目盛りマークまたはアイテムラベルを表示または非表示にでき、両方の軸の設定を提供します。
- bar3DPlot -barPlotと同じ設定を提供し、xOffsetおよびyOffset属性を使用して3D効果を生成します。
- linePlot -アイテムポイントを接続する線を表示または非表示にでき、アイテムポイントに関連付けられた形状を表示または非表示にでき、両方の軸の設定を提供します。
- scatterPlot -linePlotと同様に、アイテムポイントを接続する線を表示または非表示にでき、アイテムポイントに関連付けられた形状を表示または非表示にでき、両方の軸の設定を提供します。
- areaPlot -両方の軸の設定を提供します。
- bubblePlot -scaleType属性を設定することでバブルの寸法を設定でき、両方の軸の設定を提供します。
- timeSeriesPlot -アイテムポイントを接続する線を表示または非表示にでき、アイテムポイントに関連付けられた形状を表示または非表示にでき、両方の軸の設定を提供します。
- highLowPlot -開いている目盛りを表示または非表示にすることができ、閉じた目盛りを表示または非表示にすることができ、両方の軸の設定を提供します。
- candlestickPlot -ボリュームを表示または非表示にすることができ、両方の軸の設定を提供します。
- meterPlot -ダイヤルの形状、スケール角度、測定単位、ティック間隔、ダイヤルの色、針の色、ティックの色、値の表示フォント、色とフォーマットパターン、データ範囲、メーター間隔の特定の設定が含まれています。
- thermometerPlot -値の場所、水銀の色、値の行の表示/非表示、値の表示フォント、色とフォーマットパターン、データ範囲、低範囲、中範囲、および高範囲の特定の設定が含まれます。
- multiAxisChart -プロットに含まれる軸の特定の設定が含まれています。
チャートの種類
JasperReportsは、いくつかのチャートタイプの組み込みサポートを提供します。 それらは以下のようにリストされています-
- pieChart -パイデータセットとパイプロットの組み合わせ。
- pie3DChart -PieデータセットとPie 3Dプロットをグループ化します。
- barChart -カテゴリデータセットと棒グラフの基本的な組み合わせ。
- bar3DChart -カテゴリデータセットと棒3Dプロットをラップします。
- xyBarChart -期間データセット、時系列データセット、XYデータセットをサポートし、棒グラフを使用して軸とアイテムをレンダリングします。
- stackedBarChart -カテゴリデータセットのデータを使用し、棒グラフを使用してそのコンテンツをレンダリングします。
- stackedBar3DChart -カテゴリデータセットのデータを使用し、Bar 3Dプロットを使用してそのコンテンツをレンダリングします。
- lineChart -カテゴリデータセットとラインプロットをグループ化します。
- xyLineChart -XYデータセットとラインプロットをグループ化します。
- areaChart -カテゴリデータセットのアイテムは、エリアプロットを使用してレンダリングされます。
- stackedAreaChart -カテゴリデータセットのアイテムは、エリアプロットを使用してレンダリングされます。
- xyAreaChart -XYデータセットからのデータを使用し、エリアプロットを通してレンダリングします。
- scatterChart -散布図でXYデータセットをラップします。
- bubbleChart -XYZデータセットをバブルプロットと組み合わせます。
- timeSeriesChart -時系列データセットと時系列プロットをグループ化します。
- highLowChart -High-LowデータセットとHigh-Lowプロットの組み合わせ。
- candlestickChart -高低データセットからのデータを使用しますが、特別なローソク足プロットを使用します。
- meterChart -メータープロットのレンダリングオプションを使用して、ダイヤル上の値データセットから単一の値を表示します。
- thermometerChart -Thermometerプロットのレンダリングオプションを使用して、Valueデータセットの単一の値を表示します。
- multiAxisChart -複数の範囲軸が含まれ、すべてが共通のドメイン軸を共有しています。
例
チャートをデモンストレーションするために、新しいレポートテンプレート(jasper_report_template.jrxml)を作成しましょう。 ここでは、<* barChart >要素を<pageHeader>セクションに追加し、< pieChart >を<summary>セクションに追加します。 各被験者について得られたマークをチャートに表示します。 ディレクトリ *C:\ tools \ jasperreports-5.0.1 \ test に保存します。 ファイルの内容は以下のとおりです-
<?xml version = "1.0" encoding = "UTF-8"?>
<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" pageWidth = "595" pageHeight = "860"
columnWidth = "515" leftMargin = "40" rightMargin = "40"
topMargin = "50" bottomMargin = "50">
<field name = "subjectName" class = "java.lang.String"/>
<field name = "marks" class = "java.lang.Integer"/>
<variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
<variableExpression>
<![CDATA[Boolean.TRUE]]>
</variableExpression>
</variable>
<background>
<band splitType = "Stretch"/>
</background>
<title>
<band height = "79" splitType = "Stretch"/>
</title>
<pageHeader>
<band height = "200">
<barChart>
<chart evaluationTime = "Report">
<reportElement x = "0" y = "0" width = "555" height = "200"/>
<chartTitle>
<titleExpression>
<![CDATA["My First JR Bar Chart"]]>
</titleExpression>
</chartTitle>
</chart>
<categoryDataset>
<dataset incrementType = "None"/>
<categorySeries>
<seriesExpression>
<![CDATA[$F{subjectName}]]>
</seriesExpression>
<categoryExpression>
<![CDATA[$F{subjectName}]]>
</categoryExpression>
<valueExpression>
<![CDATA[$F{marks}]]>
</valueExpression>
</categorySeries>
</categoryDataset>
<barPlot isShowTickMarks = "false">
<plot/>
</barPlot>
</barChart>
</band>
</pageHeader>
<columnHeader>
<band height = "20" splitType = "Stretch"/>
</columnHeader>
<detail>
<band height = "20" splitType = "Stretch"/>
</detail>
<columnFooter>
<band height = "20" splitType = "Stretch"/>
</columnFooter>
<pageFooter>
<band height = "20" splitType = "Stretch"/>
</pageFooter>
<summary>
<band height = "400" splitType = "Stretch">
<pieChart>
<chart evaluationTime = "Report">
<reportElement x = "135" y = "0" width = "270" height = "300"/>
<chartTitle>
<titleExpression>
<![CDATA["My First JR Pie Chart"]]>
</titleExpression>
</chartTitle>
</chart>
<pieDataset>
<dataset incrementType = "None"/>
<keyExpression>
<![CDATA[$F{subjectName}]]>
</keyExpression>
<valueExpression>
<![CDATA[$F{marks}]]>
</valueExpression>
</pieDataset>
<piePlot>
<plot/>
<itemLabel/>
</piePlot>
</pieChart>
</band>
</summary>
</jasperReport>
上記のファイルの詳細は以下のとおりです-
- 棒グラフの作成に使用されるJRXML要素は、<pageHeader>の</barChart>です。 これには、チャートの寸法と位置を定義する<reportElement>サブ要素を含む</chart>サブ要素が含まれます。
- 棒グラフの<dataset>要素は、<categoryDataset>と</categoryDataset>のJRXML要素で囲む必要があります。
- <categoryDataset>には<categorySeries>要素が含まれている必要があります。 この要素は、バーが表すデータ要素(この例ではサブジェクト名)を定義します。
- <categoryDataset>には、比較のためにデータをカテゴリに分割する方法を定義する要素も含める必要があります。 ここでは、データはサブジェクト名で区切られています。
- <valueExpression>要素は、チャート内の各バーの値を決定するために使用される式を定義します。 ここでは、「マーク」を使用しています。
- 円グラフでは、<summary>セクションの下の要素<pieChart>を使用しました。 </chart>サブ要素が含まれています。
- サブ要素には、チャートのキーとして使用するものを示すレポート式が含まれます。 ここでは、subjectNameを使用しました。
- サブ要素には、キーの値を計算するために使用される式が含まれます。 ここでは、マークを使用しました。
レポート入力の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();
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 subjectName;
private Integer marks;
public String getSubjectName() {
return subjectName;
}
public void setSubjectName(String subjectName) {
this.subjectName = subjectName;
}
public Integer getMarks() {
return marks;
}
public void setMarks(Integer marks) {
this.marks = marks;
}
}
ファイル 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("English", 58));
dataBeanList.add(produce("SocialStudies", 68));
dataBeanList.add(produce("Maths", 38));
dataBeanList.add(produce("Hindi", 88));
dataBeanList.add(produce("Scince", 78));
return dataBeanList;
}
/*
*This method returns a DataBean object, with subjectName ,
* and marks set in it.
*/
private DataBean produce(String subjectName, Integer marks) {
DataBean dataBean = new DataBean();
dataBean.setSubjectName(subjectName);
dataBean.setMarks(marks);
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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 bu
[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: 19 minutes 45 seconds
上記のコンパイルの結果、以下の画面のようにJasperViewerウィンドウが開きます-
ここでは、ページヘッダーに棒グラフが作成され、サマリーセクションに円グラフが作成されていることがわかります。
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ウィンドウが開き、以下の画面に表示されます-
ここでは、各国と名前が集計されていることがわかります。
JasperReports-国際化
時には、異なる言語のレポートが必要になります。 異なる言語ごとに同じレポートを作成することは、多くの冗長な作業を意味します。 言語ごとに異なるテキストのみを個別に記述し、ロケール設定に応じて実行時にテキスト要素にロードする必要があります。 これがレポートの国際化の目的です。 作成された国際化レポートはどこでも実行できます。
次の手順では、さまざまな言語でレポートを生成する方法と、レポートの国際化の他の機能をリストしました。
- リソースバンドル_java.util.ResourceBundle_をレポートテンプレートに関連付けます。 java.util.ResourceBundleオブジェクトをに関連付けるには2つの方法があります レポートテンプレート。
- 設計時には、レポートテンプレートオブジェクトの_resourceBundle_属性をターゲットリソースバンドルのベース名に設定します。
- レポート入力時にREPORT_RESOURCE_BUNDLEパラメーターの値として_java.util.ResourceBundle_オブジェクトを指定することにより、動的/実行時の関連付けを作成できます。
- 現在のロケールとは異なるロケールでレポートを生成する必要がある場合、組み込みのREPORT_LOCALEパラメーターを使用して、レポートの入力時にランタイムロケールを指定できます。
- レポートの国際化を促進するために、レポートに関連付けられた_java.util.ResourceBundle_オブジェクト内に配置された_java.lang.String_リソースを参照する特別な構文 $ R \ {} がレポート式内で使用可能です。 $ R \ {} 文字構文は、かっこで囲む必要があるキーに基づいて、リソースバンドルからロケール固有のリソースを抽出します。
<textFieldExpression>
$R{report.title}
</textFieldExpression>
+上記のテキストフィールドには、runtimesuppliedロケールと_report.title_キーに基づいて、レポートテンプレートに関連付けられたリソースバンドルから文字列値を抽出することにより、レポートのタイトルが表示されます。 * レポートロケールに基づいてメッセージをさまざまな言語でフォーマットし、レポートの_net.sf.jasperreports.engine.fill.JRCalculator_内に組み込みメソッドがあります。 このメソッドは、_java.text.MessageFormat_クラスに類似した機能を提供します。 このメソッドmsg()には、メッセージ内で最大3つのメッセージパラメーターを使用できる3つの便利なシグネチャがあります。 * 組み込みの_str()_メソッド(レポート式内の$ R \ {}構文に相当)。これにより、レポートロケールに基づいてリソースバンドルのコンテンツにアクセスできます。 * 日付と時刻の書式設定では、組み込みのREPORT_TIME_ZONEパラメーターを使用して、適切な時刻変換を保証できます。 * 生成された出力では、ライブラリはテキストの実行方向に関する情報を保持するため、右から左に書く言語(アラビア語やヘブライ語など)で生成されたドキュメントを適切にレンダリングできます。 * アプリケーションが組み込みのSwingビューアーに依存して生成されたレポートを表示する場合、ボタンのツールヒントまたは表示されるその他のテキストを調整して、国際化する必要があります。 ビューアはロケール固有の情報を抽出するために事前定義されたリソースバンドルに依存しているため、これは非常に簡単です。 このリソースバンドルのベース名は_net.sf.jasperreports.view.viewer_です
例
国際化を実証するために、新しいレポートテンプレート(jasper_report_template.jrxml)を作成しましょう。 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" resourceBundle="localizationdemo">
<title>
<band height="552">
<textField>
<reportElement positionType="Float"
x="150" y="20"
width="400" height="50"/>
<textElement>
<font size="24"/>
</textElement>
<textFieldExpression
class="java.lang.String">
<![CDATA[$P{REPORT_LOCALE}.getDisplayName
($P{REPORT_LOCALE})]]>
</textFieldExpression>
</textField>
<textField isStretchWithOverflow="true"
isBlankWhenNull="true">
<reportElement positionType="Float" x="20" y="125"
width="530" height="20"/>
<textElement textAlignment="Justified">
<font size="14"/>
</textElement>
<textFieldExpression class="java.lang.String">
<![CDATA[$R{localization.text1}]]>
</textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
上記のファイルで、<jasperReport>要素の_resourceBundle_属性は、レポートに使用するローカライズされた文字列を取得する場所をJasperReportsに指示します。 レポートの入力時に、属性の値に一致するルート名がCLASSPATHのどこかに存在する必要があるプロパティファイルを記述する必要があります。 この例では、プロパティファイル localizationdemo.properties がディレクトリ C:\ tools \ jasperreports-5.0.1 \ test に保存されます。 このファイルの内容は以下のとおりです
localization.text1=This is English text.
別のロケールを使用するには、ファイルの名前をlocalizeddemo_ [locale] .propertiesにする必要があります。 ここでは、スペイン語ロケールのファイルを作成します。 このファイルを* C:\ tools \ jasperreports-5.0.1 \ test \ localizationdemo_es.properties。*として保存します。 このファイルの内容は次のとおりです。
localization.text1=Este texto es en Español.
resourceBundleプロパティの値を取得する構文は、$ R \ {key}です。
使用したいロケールをJasperReportsに知らせるには、組み込みパラメーターに値を割り当てる必要があります。 このパラメーターの名前はREPORT_LOCALEという定数として定義され、この定数は_net.sf.jasperreports.engine.JRParameter_クラスで定義されます。 定数の値は、_java.util.Locale_のインスタンスでなければなりません。 このロジックは、レポートを埋めて生成するためにJavaコードに組み込まれています。 このファイル JasperReportFillI18.java をC:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ finddevguidesディレクトリに保存しましょう。 ファイルの内容は次のとおりです。
package com.finddevguides;
import java.util.HashMap;
import java.util.Locale;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;
public class JasperReportFillI18 {
public static void main(String[] args) {
String sourceFileName = "C://tools/jasperreports-5.0.1/test/"
+ "jasper_report_template.jasper";
HashMap parameterMap = new HashMap();
if (args.length > 0) {
parameterMap.put(JRParameter.REPORT_LOCALE, new Locale(args[0]));
}
try {
JasperFillManager.fillReportToFile(sourceFileName, null,
new JREmptyDataSource());
} catch (JRException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
レポート作成
通常の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.JasperReportFillI18 (viewFullReportがデフォルトのターゲットです)を実行します。
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.finddevguides.JasperReportFillI18
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
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 1 source file to C:\tools\jasperreports-5.0.1\test\classes
[javac] Note: C:\tools\jasperreports-5.0.1\test\src\com\finddevguides\JasperReportFillI18.java
uses unchecked or u
[javac] Note: Recompile with -Xlint:unchecked for details.
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.JasperReportFillI18
[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: 3 minutes 28 seconds
上記のコンパイルの結果、次の画面のようにJasperViewerウィンドウが開きます。