目录

JasperReports - 快速指南

JasperReports - Getting Started

什么是报告

报告是一种有意义的,定义明确的,概括的信息表示。 通常,例行活动是自动化的,数据汇总成支持决策的“报告”。 报告将常见的杂乱数据表示为图表,图形和其他形式的图形表示。

报告模板

通常,采用以下布局来生成大多数商业报告生成工具的报告。

TITLE
PAGEHEADER
COLUMNHEADER
DETAIL
COLUMNFOOTER
PAGEFOOTER
SUMMARY

以下是图中提到的每个元素的描述 -

S.NO 元素和描述
1

title

标题包含报告的“标题”。 它只出现在报告的最开头,例如“教程点报告”。

2

pageHeader

PageHeader可能包含日期和时间信息和/或组织名称。 它出现在每页的顶部。

3

columnHeader

ColumnHeader列出要在报告中显示的特定字段的名称,例如“作者姓名”,“开始时间”,“完成时间”,“工作小时数”,“日期”等。

4

detail

细节是显示特定字段(列在列标题中)的条目的部分,例如“Manisha”,“9:00”,“18:00”,“9”,“10.02.2013”​​。

5

columnFooter

ColumnFooter可以显示任何字段的总和,例如“工作总时数:”180。

6

pageFooter

PageFooter可能包含页数信息。 它出现在每个页面的底部,例如“1/23”。

7

summary

摘要包含从“详细”部分推断出的信息,例如,列出每个作者工作的小时数后,每个作者的工作小时数可以放在视觉图表中,如饼图,图表等,以便更好地进行比较。

JasperReports

以下是报告制定过程中常见的问题 -

  • Core changes - 通常反映更改报告核心逻辑所需的业务更改或增强功能。

  • Results exporting - 可以将报告导出到各种格式,例如:HTML,文本,PDF,MS Excel,RTF,ODT,逗号分隔值,XML或图像。

  • Complicated reports - 子报告和交叉表报告就是很好的例子。

  • Charts reports - 可视图表,例如图形,饼图,XY线,条形图,仪表和时间序列。

为了消除上述要点的开销并促进报告过程,引入了许多框架,工具,库和第三方应用程序。 JasperReports就是其中之一。

JasperReports是一个开源的Java报告引擎。 它基于Java,没有自己的表达式语法。 JasperReports能够将丰富的内容提供到屏幕,打印机或PDF,HTML,XLS,RTF,ODT,CSV,TXT和XML文件中。 由于它不是一个独立的工具,因此无法单独安装。 相反,它通过将其库包含在应用程序的CLASSPATH中而嵌入到Java应用程序中。

JasperReports是一个Java类库,不适用于最终用户,而是针对需要向其应用程序添加报告功能的Java开发人员。

JasperReports的特点

JasperReports的一些重要功能是 -

  • 它具有灵活的报表布局。

  • 它可以以文本或图形方式显示数据。

  • 开发人员可以通过多种方式提供数据。

  • 它可以接受来自多个数据源的数据。

  • 它可以生成水印(水印就像是放置在主图像上的次级图像)。

  • 它可以生成子报告。

  • 它能够以各种格式导出报告。

JasperReports - Environment Setup

JasperReports是一个纯Java库,而不是一个独立的应用程序。 它不能独立运行,因此需要嵌入到另一个客户端或服务器端Java应用程序中。 由于它是基于Java的,因此可以在任何支持Java的平台(JDK 1.3及更高版本)上运行。 所有JasperReport的功能都集中在一个JAR文件jasperreports-xxxjar中。 可以从站点下载此JAR以及必需和可选库(.ZIP文件): JasperReport Library Link 。 从此链接下载最新版本。

ZIP文件包括JasperReports JAR文件以及JasperReports源代码,依赖JAR以及许多演示JasperReport功能的示例。

JasperReport环境

要开始创建报告,我们需要准备好环境。 将下载的JasperReport.ZIP文件解压缩到任何位置(在我们的示例中,我们将其解压缩到C:\tools\jasperreports-5.0.1)。 提取文件的目录结构如下所示 -

Jasper目录结构

这是所有目录的详细信息 -

  • build - 包含已编译的JasperReport类文件。

  • demo - 包含各种示例,演示了JasperReports功能的几个方面。

  • dist - 包含jasperreports-xxxjar文件。 我们将把这个JAR文件添加到CLASSPATH中以利用JasperReports。

  • docs - 包含JasperReports文档的本地副本。

  • lib - 包含所有需要的JAR,用于构建JasperReports并在我们的应用程序中使用它。

  • src - 包含JasperReports源代码。

  • build.xml - 用于构建JasperReports源代码的ANT构建文件。 如果我们不打算修改JasperReports,我们不需要使用此文件,因为JasperReports是以编译形式分发的。

  • changes.txt - 一个文本文档,解释了当前和以前版本的JasperReports类库之间的差异。

  • license.txt - 包含LGPL(较宽松通用公共许可证)许可证全文的文本文档。

  • readme.txt - 一个文本文档,包含有关如何构建和执行提供的示例的说明。

基本上,我们只使用dist目录下的jasperreports-xxxjar和lib目录下的JAR来生成报告。 由于JasperReports是一个开源工具,如果在jasperreports-xxxjar中执行期间识别出任何缺陷或错误,我们可以使用build.xml文件修复它并再次构建JAR。

设置CLASSPATH

要使用JasperReport,我们需要将以下文件设置为CLASSPATH -

  • jasperreports-xxxjar,其中xxx是JasperReports版本。 这在目录C:\tools\jasperreports-xxx\dist下找到。

  • lib子目录下的所有JAR文件(C:\tools\jasperreports-xxx\lib)。

在安装时,我们使用了JasperReport版本5.0.1。 右键单击“我的电脑”并选择“属性”,然后单击“高级”选项卡下的“环境变量”按钮。 现在用这个C:\tools\jasperreports-5.0.1\dist\jasperreports-5.0.1.jar:C:\tools\jasperreports-5.0.1\lib更新'Path'变量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\iowiki下。

  • 已经使用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.iowiki.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\jasper.dir -5.0.1目录

  • lib.dir - 是C:\tools\lib.dir -5.0.1\lib目录

  • src.dir - 是C:\tools\src.dir -5.0.1\test\src

  • classes.dir - 是C:\tools\jasperreports-5.0.1\test\classes

  • main-class - com.iowiki.HelpMe。 当没有从命令行传递类文件名时,此类是一个简单的类。 将此文件保存到C:\tools\jasperreports-5.0.1\test\src\com\iowiki。

package com.iowiki;
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.iowiki.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 - 环境设置章节,以在您的系统上设置Apache ANT。

JasperReports - Life Cycle

JasperReports的主要目的是以简单灵活的方式创建面向页面,准备打印文档。 以下流程图描述了创建报告时的典型工作流程。

碧玉生命周期

如图所示,生命周期有以下不同阶段 -

  • 设计报告 - 在此步骤中,我们创建JRXML文件,该文件是包含报告布局定义的XML文档。 我们可以使用任何文本编辑器或iReportDesigner来手动创建它。 如果使用iReportDesigner,则以可视方式设计布局,因此可以忽略JRXML的真实结构。

  • 编译报告 - 在此步骤中,JRXML在称为Jasper文件(* .jasper)的二进制对象中编译。 此编译是出于性能原因而完成的。 Jasper文件是您运行报告时需要随应用程序一起提供的文件。

  • 执行报告(将数据填入报告) - 在此步骤中,应用程序中的数据将填入已编译的报告中。 net.sf.jasperreports.engine.JasperFillManager类提供了填充报告中数据所需的功能。 创建Jasper打印文件(* .jrprint),可用于打印或导出报告。

  • 将报告导出为所需格式 - 在此步骤中,我们可以使用JasperExportManager将上一步中创建的Jasper打印文件导出为任何格式。 由于Jasper提供各种形式的导出,因此具有相同的输入,我们可以创建多个数据表示。

上述每个步骤的详细概述将在随后的章节中给出。

JasperReports - Designs

JasperReport中的JRXML模板(或JRXML文件)是标准XML文件,扩展名为.jrxml。 所有JRXML文件都包含标记,作为根元素。 这又包含许多子元素(所有子元素都是可选的)。 JasperReport框架可以处理不同类型的数据源。 在本教程中,我们将展示如何生成基本报告,只需将Java数据对象(使用Java bean)的集合传递给JasperReport Engine即可。 最终报告应显示包含其姓名和国家类别的人员列表。

本章介绍了以下步骤,以描述 - 如何设计JasperReport -

  • 创建JRXML报告模板和。
  • 预览XML报告模板。

创建JRXML报告模板

使用文本编辑器创建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>

以下是上述报告模板中主要字段的详细信息 -

  • - 这是空的(因为我们通过Java Bean传递数据)。 通常包含SQL语句,该语句检索报告结果。

  • - 此元素用于将数据源或查询中的数据映射到报告模板中。 name在报告正文中重复使用,区分大小写。

  • - 此元素使用XML文件中的相应元素映射字段名称。

  • - 这定义了不依赖于任何数据源,变量,参数或报表表达式的静态文本。

  • - 这定义了结果字段的外观。

  • $ F {country} - 这是一个变量,它包含结果的值,标记中的预定义字段。

  • - Bands包含数据,该数据显示在报告中。

报告设计准备就绪后,将其保存在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”的窗口,显示我们的报告模板预览。

Jasper设计查看器

我们看到,只显示用于获取数据的报表表达式,因为JasperDesignViewer无权访问实际的数据源或报表参数。 通过关闭窗口或在命令行窗口中按Ctrl-c终止JasperDesignViewer。

JasperReports - Compiling Report Design

我们在前一章中生成了JasperReport模板(JRXML文件)。 此文件不能直接用于生成报告。 它必须编译为JasperReport的本机二进制格式,称为Jasper文件。 在编译时,我们将JasperDesign对象转换为JasperReport对象 -

Jasper报告编译

接口net.sf.jasperreports.engine.design.JRCompiler在编译期间起着核心作用。 此接口具有多种实现,具体取决于报表表达式使用的语言,只要编译器实现可以在运行时对其进行评估,就可以使用Java,Groovy,JavaScript或任何其他脚本语言编写。

我们可以通过以下两种方式编译JRXML文件 -

  • 程序化编译。
  • 通过ANT任务编译。

JRXML的程序化编译

JasperReports API提供了一个外观类net.sf.jasperreports.engine.JasperCompileManager用于编译JasperReport。 该类包含几个用于编译报告模板的公共静态方法。 模板的来源可以是文件,输入流和/或存储器对象。

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.iowiki;
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\iowiki\JasperReportCompile.java并在build.xml文件中导入baseBuild.xml ,如下所示。 baseBuild.xml已经有了compilerun目标 -

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

接下来,让我们打开命令行窗口并转到build.xml所在的目录。 最后,执行命令ant -Dmain-class = com.iowiki.JasperReportCompile as -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.iowiki.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.iowiki.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模板。

为了进一步移动,我们将新的目标viewDesign添加到上面的build.xml文件中,这将允许我们预览已编译的报告。 下面是修改后的build.xml -

导入文件 - baseBuild.xml是从环境设置一章中挑选出来的,应该与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文件,如下所示 -

Jasper设计查看器

通过ANT任务编译

由于报表模板编译更像是设计时作业而不是运行时作业,因此JasperReport库具有自定义ANT任务。 对于某些情况,在运行时创建JRXML文件时,我们无法使用此ANT任务。 自定义ANT任务称为JRC,由类net.sf.jasperreports.ant.JRAntCompileTask 。 它的语法和行为与内置的《javac》 ANT任务非常相似。

模板编译

让我们在现有的build.xml中添加新的目标compilereportdesing 。 这里,使用带有文件集的嵌套“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/faq.html#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()以编程方式生成的文件相同。 我们可以预览这个jasper文件,执行ant viewDesign

JasperReports - Filling Reports

任何报告工具的主要目的是生成高质量的文档。 报告填写过程有助于报告工具通过操作数据集来实现此目的。

报告填写过程所需的主要投入是 -

  • Report Template - 这是实际的JasperReport文件。

  • Report Parameters - 这些基本上是在报告填充时间传递给引擎的命名值。 我们将在报告参数章节中讨论它们。

  • Data Source - 我们可以从一系列Data Source填充Jasper文件,如SQL查询,XML文件,csv文件,HQL(Hibernate查询语言)查询,Java Bean集合等。这将详细讨论在“报告数据源”一章中。

此过程生成的输出是.jrprint文档,可以查看,打印或导出为其他格式。 Facade类net.sf.jasperreports.engine.JasperFillManager通常用于使用数据填充报告模板。 此类具有各种fillReportXXX()方法,用于填充报告模板(模板可以位于磁盘上,从输入流中挑选,或直接作为内存提供)。

此Facade类中有两类fillReportXXX()方法 -

  • 第一种类型,接收java.sql.Connection对象作为第三个参数。 大多数情况下,报告都填充了关系数据库中的数据。 这是通过 -

    • 通过JDBC连接到数据库。

    • 在报告模板中包含SQL查询。

    • JasperReports引擎使用传入的连接并执行SQL查询。

    • 因此产生报告数据源以填充报告。

  • 第二种类型,当需要填充的数据以其他形式提供时,接收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,以填充此编译的报告。

编写POJO DataBean.java,它表示数据对象(Java bean)。 该类定义了两个String对象,即“name”和“country”。 将其保存到目录C:\tools\jasperreports-5.0.1\test\src\com\iowiki

package com.iowiki;
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;
   }
}

编写一个DataBeanList.java类,它具有生成java bean对象集合的业务逻辑。 这将进一步传递给JasperReports引擎,以生成报告。 这里我们在List中添加4个DataBean对象。 将其保存到目录C:\tools\jasperreports-5.0.1\test\src\com\iowiki

package com.iowiki;
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\iowiki

package com.iowiki;
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是从环境设置一章中挑选出来的,应该与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.iowiki.JasperReportFillant -Dmain-class = com.iowiki.JasperReportFill是默认目标),如下所示 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.iowiki.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.iowiki.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文件相同的目录中生成文件jasper_report_template.jrprint (在这种情况下,它在C:\tools\jasperreports-5.0.1\test中生成)。

Jasper Report - View & Print Reports

报表填充过程JasperPrint objects的输出可以使用内置的查看器组件查看,或打印,或导出为更流行的文档格式,如PDF,HTML,RTF,XLS,ODT,CSV或XML。 本章将讨论查看和打印Jasper文档,下一章将讨论导出,“导出报告”。

查看报告

JasperReport提供了一个内置的查看器,用于以原始格式查看生成的报告。 它是一个基于swing的组件,其他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,以填充此编译报告。

编写POJO DataBean.java,它表示数据对象(Java bean)。 该类定义了两个String对象,即“name”和“country”。 将其保存到目录C:\tools\jasperreports-5.0.1\test\src\com\iowiki

package com.iowiki;
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;
   }
}

编写一个DataBeanList.java类,它具有生成java bean对象集合的业务逻辑。 这将进一步传递给JasperReports引擎,以生成报告。 在这里,我们在List中添加4个DataBean对象。 将其保存到目录C:\tools\jasperreports-5.0.1\test\src\com\iowiki

package com.iowiki;
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\iowiki

package com.iowiki;
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是从环境设置一章中挑选出来的,应该与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.iowiki.JasperReportFill (viewFillReport是默认目标)。 结果,我们看到一个JasperViewer窗口,如下面的屏幕所示 -

Jasper报告查看器

打印报告

我们可以使用net.sf.jasperreports.engine.JasperPrintManager类打印JasperReports库生成的文档(以其专有格式,即JasperPrint对象)。 这是一个依赖于Java 2 Printing API的外观类。 一旦将JasperReport文档导出为其他格式(如HTML或PDF),我们也可以打印文档。

打印生成的报告

以下代码演示了报表的打印。 让我们更新现有的JasperReportFill类。 我们将使用JasperPrintManager.printReport()方法。 这个方法获取源文件名(这里我们传递.jrprint文件,我们在上一步中使用JasperFillManager.fillReportToFile()方法生成)作为第一个参数。 第二个参数是用于显示标准打印对话框的布尔值(我们在此处将其设置为true )。

package com.iowiki;
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\iowiki 。 我们将使用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.iowiki.JasperReportPrint 。 结果,出现打印对话框。 单击“确定”以打印文档。

JasperReports - Exporting Reports

我们在前一章中已经看到了如何打印和查看JasperReport生成的文档。 在这里,我们将看到如何将这些报告转换或导出为其他格式,如PDF,HTML和XLS。 提供了Facade类net.sf.jasperreports.engine.JasperExportManager来实现此功能。 导出意味着将JasperPrint对象(.jrprint文件)转换为不同的格式。

以下代码(JasperReportExport.java)演示了JasperReport文档的导出过程。 JasperExportManager提供了仅将报告导出为PDF,HTML和XML的方法。 要导出为XLS格式,我们使用了net.sf.jasperreports.engine.export.JRXlsExporter类。 此代码生成以下三个文件 -

  • sample_report.pdf
  • sample_report.html
  • 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\iowiki\DataBean.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBeanList.java的内容如下所示 -

package com.iowiki;
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\iowiki

package com.iowiki;
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_report.html");
            /**
             * 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();
      }
   }
}

在这里,我们已经包含了将jasper打印文件导出为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>

转到命令提示符,然后转到目录C:\tools\jasperreports-5.0.1\test,其中放置了build.xml。 最后,执行命令ant -Dmain-class=com.iowiki.JasperReportFill 。 输出如下 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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

作为上述执行的结果,您将在C:\目录中找到三个文件sample_report.pdf,sample_report.html,sample_report.xls。

Reports Parameters

填写报告的主要输入是 - 报告模板,参数和数据源。 本章将介绍参数,在下一章中我们将讨论数据源。

参数是对象引用,它们在报表填充操作期间传递给报表引擎。 可以通过使用参数传递无法通过数据源传递的数据。 作者姓名,报告标题等数据可以通过参数传递。 JasperReports模板或JRXML模板可以包含零个或多个参数元素。

参数声明

参数声明如下 -

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

名称属性

“parameter”元素的name属性是必需的。 它按名称引用报表表达式中的参数。 参数名称应该是单个单词。 它不应包含任何特殊字符,如点或逗号。

类属性

class属性也是必需的,它指定参数值的类名。 它的默认值是java.lang.String 。 这可以更改为运行时可用的任何类。 无论报表参数的类型如何,引擎都会在使用$ P {}标记的报表表达式中进行转换,因此不需要手动转换。

报告参数值始终打包在java.util.Map对象中,该对象的参数名称为其键。 报告参数可以在报告的查询字符串中使用,以便进一步自定义从数据库中检索的数据集。 它们就像查询中的动态过滤器一样,为报告提供数据。

Built-in Parameters

以下是预定义的报告参数,可以在表达式中使用 -

S.NO 参数名称和描述
1

REPORT_PARAMETERS_MAP

包含具有所有用户定义和内置参数的地图。

2

REPORT_CONNECTION

这指向用户提供的类java.sql.Connection,用于JDBC数据源。

3

REPORT_DATA_SOURCE

这是用户提供的JRDataSource实例,表示内置数据源类型之一或用户定义的数据源类型。

4

REPORT_MAX_COUNT

这是一个java.lang.Integer值,允许用户限制来自数据源的记录。

5

REPORT_SCRIPTLET

这指向net.sf.jasperreports.engine.JRAbstractScriptlet并包含用户提供的报告scriptlet的实例。

6

REPORT_LOCALE

这是一个java.util.Locale实例,包含所需的资源包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 ,则将在一个长页面上生成报告,并且不会发生分页符。

例子 (Example)

让我们将ReportTitleAuthor传递给报告(由JasperReportFill.java生成)。 修改后的文件C:\tools\jasperreports-5.0.1\test\src\com\iowiki\JasperReportFill.java如下 -

package com.iowiki;
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\iowiki\DataBean.java的内容如下 -

package com.iowiki;
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\iowiki\DataBeanList.java的内容如下所示 -

package com.iowiki;
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_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>

报表生成 (Report Generation)

我们将使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中挑选出来的,应该与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.iowiki.JasperReportFill (viewFullReport是默认目标),如下所示 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig
   for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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报告参数示例

在这里,我们看到,ReportTitle“联系人列表”和作者“由Manisha准备”显示在报告的开头。

Report Data Sources

数据源是结构化数据容器。 在生成报告时,JasperReports引擎从数据源获取数据。 可以从数据库,XML文件,对象数组和对象集合中获取数据。 我们在填充报告一章中看到,fillReportXXX()方法希望以net.sf.jasperreports.engine.JRDataSource对象或java.sql.Connection的形式接收报告的数据源,该报告必须填写。当在关系数据库中找到报告数据时)。

JRDataSource接口只有两个方法,应该实现 -

  • public boolean next()抛出JRException;

    • 在报告填充时,报告引擎在迭代数据时会在数据源对象上调用此方法。

  • public Object getFieldValue(JRField jrField)抛出JRException;

    • 此方法为当前数据源记录中的每个报告字段提供值。

从数据源检索数据的唯一方法是使用报告字段。 JRDataSource接口有几个默认实现,取决于方式,获取数据源中的记录。

数据源实现

下表总结了数据源及其实现类 -

数据源 实施类
JDBCnet.sf.jasperreports.engine.JRResultSetDataSource
JavaBeannet.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
Map-basednet.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource
TableModelnet.sf.jasperreports.engine.data.JRTableModelDataSource
XMLnet.sf.jasperreports.engine.data.JRXmlDataSource
CSVnet.sf.jasperreports.engine.data.JRCsvDataSource
XLSnet.sf.jasperreports.engine.data.JRXlsDataSource
Emptynet.sf.jasperreports.engine.JREmptyDataSource

JDBC数据源

JRResultSetDataSource java.sql.ResultSet对象。 当从关系数据库中提取报表数据时,这是最常用的数据源实现。 如果将java.sql.Connection传递给引擎,则首先执行相关查询并将返回的java.sql.ResultSet对象存储在JRResultSetDataSource实例中。

JavaBean数据源

JRBeanArrayDataSourceJRBeanCollectionDataSource表示可以包装JavaBean对象的数组和集合的实现。 数组或集合中的每个对象都将被视为此类数据源中的一个记录。 特定JavaBean属性与相应报告字段之间的映射是通过命名约定进行的。 报告字段的名称必须与JavaBeans规范指定的JavaBean属性的名称相同。

在本教程的所有示例中,我们使用了JRBeanCollectionDataSource。

基于地图的数据源

如果父应用程序已将内存java.util.Map objects可用的报告数据存储为java.util.Map objects ,则实现类JRMapArrayDataSourceJRMapCollectionDataSource非常有用。 包装数组或集合中的每个Map对象都被视为数据源中的虚拟记录,并使用名为key的报告字段从地图中提取每个报告字段的值。

TableModel数据源

在许多客户端应用程序中,数据以表格格式显示。 许多应用程序中的一个常见要求是允许用户将此表格格式打印为报告。 实现类JRTableModelDataSource使得从表格格式生成报告的任务对于Swing应用程序来说是微不足道的。 此类包装javax.swing.table.TableModel对象。 包装的TableModel对象中的列可以通过其名称或基于0的索引进行访问。

XML数据源

JRXmlDataSource是基于DOM的数据源实现,它使用XPath表达式从XML文档中选择数据。 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()的方法。 此方法旨在将光标移动到数据源中的第一个元素。

当处理由于isSplitAllowed =“false”设置而不允许拆分的子带内的子报表时,可回滚数据源非常有用,并且当前页面上没有足够的空间来呈现子报表。

除了JRResultSetDataSource之外,所有上述数据源实现都是可重JRResultSetDataSource ,因为它不支持将记录指针移回。 只有在将java.sql.ResultSet传递给子报告之前手动使用此数据源进行包装时,才会出现问题。 如果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;

Reports Fields

报告字段是元素,表示数据源和报告模板之间的数据映射。 可以在报表表达式中组合字段以获取所需的输出。 报告模板可以包含零个或多个元素。 声明报告字段时,数据源应提供与报告模板中定义的所有字段对应的数据。

实地宣言

现场声明如下所示 -

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

名称属性

“field”元素的name属性是必需的。 它按名称引用报表表达式中的字段。

类属性

class属性指定字段值的类名。 它的默认值是java.lang.String 。 这可以更改为运行时可用的任何类。 无论报告字段的类型如何,引擎都会在使用$ F {}标记的报表表达式中进行转换,因此无需手动转换。

字段描述

元素是可选元素。 这在实现自定义数据源时非常有用。 例如,我们可以存储密钥或一些信息,通过这些信息,我们可以在运行时从自定义数据源中检索字段的值。 通过使用元素而不是字段名称,可以在从数据源检索字段值时轻松克服字段命名约定的限制。

以下是我们现有JRXML文件(章节报告设计 )中的一段代码。 在这里,我们可以看到nameclassfieldDescription元素的用法。

<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支持基于内存的基于字段的数据源排序。 可以使用报告模板中的一个或多个元素完成排序。

如果指定了至少一个排序字段,则在报告填充过程中,数据源将传递给JRSortableDataSource实例。 这反过来,从数据源获取所有记录,根据指定的字段执行内存排序,并替换原始数据源。

排序字段名称应与报告字段名称相同。 用于排序的字段应具有实现java.util.Comparable的类型。 对除java.lang.String类型之外的所有字段执行自然顺序排序(对于String类型,使用与报表填充区域设置对应的collat​​or)。 如果指定了多个排序字段,则将使用字段作为排序键,按照它们在报告模板中的显示顺序执行排序。 以下示例演示了排序功能。

排序报告示例

让我们将< sortField “元素添加到现有的报告模板(章节报告设计 )。 让我们按降序对字段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\iowiki\JasperReportFill.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBean.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBeanList.java的内容如下所示 -

package com.iowiki;
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是从环境设置一章中挑选出来的,应该与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.iowiki.JasperReportFill (viewFullReport是默认目标),如下所示 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig
   for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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报告字段排序示例

在这里,我们可以看到国家/地区名称按字母顺序按降序排列。

Report Expression

报表表达式是JasperReports的强大功能,它允许我们在报表上显示计算数据。 计算数据是不是静态数据的数据,不会作为报表参数或数据源字段专门传递。 报表表达式是通过组合报表参数,字段和静态数据构建的。 Java语言默认用于编写报表表达式。 JasperReports编译器支持其他报表表达式的脚本语言,如Groovy脚本语言,JavaScript或BeanShell脚本。

本章将向您解释 - 假设它们仅使用Java语言编写,报表表达式如何工作。 在JRXML报告模板中,有几个元素将表达式定义为 -

  • <variableExpression>
  • <initialValueExpression>
  • <groupExpression>
  • <printWhenExpression>
  • <imageExpression>
  • <textFieldExpression>

表达宣言

基本上,所有报表表达式都是Java表达式,可以引用报表字段,报表变量和报表参数。

表达式中的字段引用

要在表达式中使用报表字段引用,必须在$F{}字符序列之间放置字段的名称,如下所示 -

<textfieldexpression>
   $F{Name}
</textfieldexpression>

以下是我们现有JRXML文件的一段代码( 报告设计章节 -

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

表达式中的变量引用

要引用表达式中的变量,我们必须将变量的名称放在$V{}之间,如下面给出的示例所示 -

<textfieldexpression>
   "Total height : " + $V{SumOfHeight} + " ft."
</textfieldexpression>

表达式中的参数引用

要引用表达式中的参数,参数的名称应放在$P{}之间,如下面给出的示例所示 -

<textfieldexpression>
   "ReportTitle : " + $P{Title}
</textfieldexpression>

以下是我们现有JRXML文件中的一段代码,它演示了表达式中参数的引用。 ( 报告设计章节中的JRXML) -

<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报告字段“名称”中提取和显示第一个字母 -

<textFieldExpression>
   $F{Name}.substring(0, 1)
</textFieldExpression>

表达式中的资源包参考

要引用表达式中的资源, key应放在$R{}之间,如下面给出的示例所示 -

<textfieldexpression>
   $R{report.title}
</textfieldexpression>

基于运行时提供的语言环境和report.title键,将加载与报告模板关联的资源包。 因此,通过从资源包中提取String值来显示报告的标题。 有关国际化的更多信息可以在国际化一章中找到。

Calculator

计算器是JasperReports中的一个实体,它在报告填充时评估表达式并递增变量或数据集。 在编译过程中,编译器会生成信息并将其存储在编译报告中。 在报告填充期间使用此信息来构建net.sf.jasperreports.engine.fill.JRCalculator类的实例。

Java源文件由基于Java的报告编译器即时生成和编译。 这个生成的类是JRCalculator的子类,通过编译生成的字节码存储在JasperReport对象中。 此报告代码在报告填充时加载,生成的类被实例化以获得表达式评估所需的计算器对象。

条件表达式

在定义变量表达式时,JasperReports不支持if-else语句。 相反,你可以使用三元运算符{cond} ? {statement 1} : {statement 2} {cond} ? {statement 1} : {statement 2} 。 此运算符可以嵌套在Java表达式中,以基于多个条件获得所需的输出。

报告中条件表达式的示例

让我们修改现有的报告模板(章节报告设计 )并为字段国家/地区添加条件表达式。 修订后的报告模板(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\iowiki\JasperReportFill.java的内容如下 -

package com.iowiki;
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\iowiki\DataBean.java的内容如下 -

package com.iowiki;
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 List中添加一个country记录为空的新记录。 文件C:\tools\jasperreports-5.0.1\test\src\com\iowiki\DataBeanList.java的内容如下 -

package com.iowiki;
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"));<b class="notranslate">
      dataBeanList.add(produce("Tanmay", ""));</b>
      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;
   }
}

报表生成 (Report Generation)

我们将使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下面)如下所示。

导入文件 - baseBuild.xml是从环境设置章节中选取的,应该与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.iowiki.JasperReportFill (viewFullReport是默认目标)为 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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窗口打开,如下面的屏幕所示 -

Jasper报告表达示例

在这里,我们可以看到,对于最后一条记录,我们没有传递该字段国家的任何数据,正在打印“NO COUNTRY”。

Report Variables

报表变量是在报表表达式之上构建的特殊对象。

报告变量简化了以下任务 -

  • 报表表达式,在整个报表模板中大量使用。 这些表达式只能使用报表变量声明一次。

  • 报表变量可以根据相应的表达式值执行各种计算,例如计数,总和,平均值,最低值,最高值,方差等。

如果在报表设计中定义了变量,则表达式中的新变量可以引用这些变量。 因此,在报表设计中声明变量的顺序很重要。

变量声明 (Variable Declaration)

变量声明如下 -

<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
   incrementGroup = "CityGroup" calculation = "Count">
   <variableExpression>
      <![CDATA[Boolean.TRUE]]>
   </variableExpression>
</variable>

如上所示,元素包含多个属性。 这些属性总结如下 -

名称属性

parametersfields类似,“/ variable”元素的name属性是必需的。 它允许在报表表达式中通过其声明的名称引用变量。

类属性

class属性也是必需的,它指定变量值的类名。 它的默认值是java.lang.String 。 这可以在报告编译时和报告填充时更改为类路径中可用的任何类。 引擎在使用$ V {}标记的报表表达式中处理类型转换,因此不需要手动类型转换。

计算(Calculation)

此属性确定 - 填充报表时要对变量执行的计算。 以下小节描述了元素的计算属性的所有可能值。

  • Average - 变量值是变量表达式的每个非空值的平均值。 仅对数字变量有效。

  • Count - 变量值是变量表达式的非null实例的计数。

  • First - 变量值是变量表达式的第一个实例的值。 后续值将被忽略。

  • Highest - 变量值是变量表达式的最高值。

  • Lowest - 变量值是报表中变量表达式的最小值。

  • NothingNothing - 没有对变量进行计算。

  • StandardDeviation - 变量值是与报表表达式匹配的所有非空值的标准差。 仅对数字变量有效。

  • Sum - 变量值是报表表达式返回的所有非空值的总和。

  • System - 变量值是自定义计算(使用JasperReports的scriptlet功能自行计算该变量的值)。

  • Variance - 变量值是通过评估报表变量的表达式返回的所有非空值的方差。

增量器FactoryClass

此属性确定在填充报表上的当前记录时用于计算变量值的类。 默认值是实现net.sf.jasperreports.engine.fill.JRIncrementerFactory任何类。 引擎将使用工厂类在运行时实例化增量对象,具体取决于为变量设置的calculation属性。

IncrementType

这决定了何时重新计算变量的值。 此属性使用值,如下所示 -

  • Column - 在每列的末尾重新计算变量值。

  • Group - 当incrementGroup指定的组更改时,将重新计算变量值。

  • None - 使用每条记录重新计算变量值。

  • Page - 在每个页面的末尾重新计算变量值。

  • Report - 在报告结束时重新计算变量值一次。

IncrementGroup (IncrementGroup)

incrementTypeGroup时,这将确定重新计算变量值的组的名称。 这将获取JRXML报告模板中声明的任何组的名称。

ResetType

这确定何时重置变量的值。 此属性使用值,如下所示 -

  • Column - 变量值在每列的开头重置。

  • Group - 当incrementGroup指定的组更改时,将重置变量值。

  • None - 永远不会重置变量值。

  • Page - 变量值在每个页面的开头重置。

  • Report - 变量值仅在报告开头重置一次。

ResetGroup (ResetGroup)

resetTypeGroup时,这将确定重置变量值的组的名称。 此属性的值将是JRXML报告模板中声明的任何组的名称。

内置报告变量

有一些内置的系统变量,可以在表达式中使用,如下所示 -

S.NO 变量名称和描述
1

PAGE_NUMBER

此变量的值是其当前页码。 它可以用于显示当前页码和总页数,使用JasperReports文本字段元素的特殊功能,即evaluateTime属性。

2

COLUMN_NUMBER

此变量包含当前列号。

3

REPORT_COUNT

此报告变量包含已处理的记录总数。

4

PAGE_COUNT

此变量包含生成当前页面时处理的记录数。

5

COLUMN_COUNT

此变量包含生成当前列时处理的记录数。

6

GroupName_COUNT

此变量的名称源自它对应的组的名称,后缀为_COUNT序列。 此变量包含当前组中的记录数。

例子 (Example)

让我们在现有的报告模板(章节报告设计 )中添加一个变量( countNumber )。 我们将计数前缀添加到每条记录中。 修订后的报告模板(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\iowiki\JasperReportFill.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBean.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBeanList.java的内容如下所示 -

package com.iowiki;
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;
   }
}

报表生成 (Report Generation)

我们将使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下面)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中挑选出来的,应该与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.iowiki.JasperReportFill (viewFullReport是默认目标)为 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig
   for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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报告变量示例

在这里,我们看到计数是每个记录的前缀。

Report Sections

我们在“ 入门 ”一章中讨论了简单报告模板的结构。 在类似的行上,JasperReports将报告模板组织成多个部分。 截面是报表中具有指定高度的部分,可以包含线条,矩形,图像或文本字段等报表对象。

报告引擎在报告填充时间内迭代所提供的报告数据源的虚拟记录。 根据每个部分定义的行为,引擎然后在适当时呈现每个报告部分。 例如,为数据源中的每个记录呈现详细信息部分。 发生分页时,页眉和页脚部分将根据需要呈现。

在JasperReports中,术语和报告部分也称为report bands 。 截面由一个或多个带组成。 这些部分在报告生成时重复填写并准备最终文档。

主要部分

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 部分和描述
1

Title

此部分仅在报告开头出现一次。

2

Page Header

此部分显示在生成的文档中每页的开头。

3

Column Header

此部分显示在生成的文档中每列的开头。 如果报告只定义了一列,则忽略列标题和页脚部分。

4

Group Header

本节由报告组(章节Groups )介绍。 每次分组表达式更改其值时,组标题部分将打印在详细信息部分上方。 如果定义了多个组,则按组定义的顺序打印组标题。

5

Detail

对报告的数据源提供的每行数据重复此部分。 细节部分可以由多个带组成。

6

Group Footer

本节由报告组(章节Groups )介绍。 在分组表达式的值更改之前,组页脚部分将打印在详细信息部分下方。 始终为数据源中的最后一行数据打印组页脚。 如果定义了多个组,则按组定义的相反顺序打印组页脚。

7

Column Footer

此部分显示在每列的底部。 如果报告的列数为1,则忽略列标题和页脚部分。

8

Page Footer

此部分显示在每页的底部。

9

Last Page Footer

此部分替换报告最后一页上的常规页脚。 如果还有摘要部分,那么这可能不是文档的最后一页。 当必须在最后一页的底部显示摘要信息时,此部分有时很有用。

10

Summary

此部分仅在报告末尾出现一次。

11

No Data

When No Data Print report属性设置为“ No Data部分”时,将打印此部分。 如果在报告模板中定义了“noData”部分,并且数据源为空,则“noData”部分将是在填充时考虑的唯一部分,其内容将生成报告输出。

12

Background

背景部分显示在每个页面上,不能溢出到下一页。 放置在此部分上的元素将在页面初始化时进行评估,并显示在后台。 所有其他页面对象都显示在背景对象的顶部。 此部分对于创建页面水印非常有用。

部分,元素和属性关系

下图显示了报表部分中的元素和属性关系。

报告部分

部分元素

所有上述报告部分都是可选的。 但任何报告模板都至少有一个这样的部分。 这些部分中的每一部分都包含一个< band “元素作为其唯一的子元素。 “ band ”可包含零个或多个以下子元素 -

《line》, 《rectangle》, 《ellipse》, 《image》, 《staticText》, 《textField》, 《subReport》, or 《elementGroup》

这些元素中的每一个都必须包含一个< reportElement “作为其第一个元素(elementGroup除外)。 “ reportElement ”确定如何为该特定元素布置数据。 与变量和参数不同,报表元素不需要具有名称,因为通常您不需要在报表模板中获取任何单个元素。

下表总结了< reportElement “的属性 -

属性 描述 有效值
x 指定band元素的x坐标。 一个整数值,表示元素的x坐标,以像素为单位。 此属性是必需的。
y 指定band元素的y坐标。 一个整数值,表示元素的y坐标,以像素为单位。 此属性是必需的。
width 指定band元素的宽度。 一个整数值,表示以像素为单位的元素宽度。 此属性是必需的。
height 指定band元素的高度。 一个整数值,表示元素高度,以像素为单位。 此属性是必需的。
key band元素的唯一标识符。 A unique string value.
stretchType 指定当包含的条带伸展时元素如何伸展

NoStretch (default) - 元素不会拉伸。

RelativeToTallestObject - 元素将拉伸以容纳其组中的最高对象。

RelativeToBand - 元素将拉伸以适应乐队的高度。

positionType 指定乐队拉伸时元素的位置。

Float - 元素将根据周围元素的大小移动。

FixRelativeToTop (default) - 元素将保持相对于乐队顶部的固定位置。

FixRelativeToBottom - 元素将保持相对于乐队底部的固定位置。

isPrintRepeatedValues 指定是否打印重复值。

true (default) - 将打印重复值。

false - 不会打印重复值。

mode 指定元素的背景模式 Opaque, Transparent
isRemoveLineWhenBlank 指定当元素为空并且同一水平空间中没有其他元素时是否应删除该元素。 true, false
isPrintInFirstWholeBand 指定元素是否必须在整个波段中打印,即,不在报表页面或列之间划分的波段。 true, false
isPrintWhenDetailOverFlows 指定当波段溢出到新页面或列时是否打印元素。 true, false
printWhenGroupChanges 指定在指定的组更改时将打印元素。 字符串值。
forecolor 指定元素的前景色。 可以是#字符前面的十六进制RGB值,也可以是以下预定义值之一: black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, yellow, white.
backcolor 指定元素的背景颜色。 forecolor有效值相同

部分属性

以下是报告部分的属性 -

Height

该部分的高度指定该特定部分的高度(以像素为单位),在整个报表设计中非常重要。

表达时打印

一个布尔表达式,用于确定是否应打印该部分。

拆分允许

一个标志,指示当该部分不适合当前页面时是否允许该部分分割。 如果为true,则该部分将转移到下一页。 请注意,如果该部分不适合下一页,则无论标志的值如何,该部分都将被拆分。 splitType可以采用以下值 -

  • splitType="Stretch:"拆分拉伸内容。 如果该部分在当前页面上拉伸(如果可用空间小于声明的高度),则允许将添加到原始高度的区域拆分到下一页面。

  • splitType="Prevent:"首次尝试时防止拆分。 如果该部分不适合下一页,则拆分正常进行,因为波段拆分防止仅在第一次拆分尝试时有效。

  • splitType="Immediate:"立即拆分。 除了最上面的元素之外,乐队可以拆分。

例子 (Example)

为了演示每个部分,让我们编写报告模板(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\iowiki目录。

package com.iowiki;
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的实例来模拟其中包含一条记录的数据源,但此单条记录中的所有字段都为空。

报表生成 (Report Generation)

我们将使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中选取的,应该与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.iowiki.JasperReportFill (viewFullReport是默认目标),如下所示 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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包含元素,它将显示在报告的最后一页而不是显示的元素中。 只有具有多个列的元素才会显示在报表上。

Report Groups

JasperReports中的组有助于以合理的方式组织报告数据。 报告组表示数据源中的一系列连续记录,这些记录具有一些共同点,例如某些报告字段的值。 报告组由元素定义。 报告可以包含任意数量的组。 声明后,可以在整个报告中引用组。

报告组有三个要素 -

  • Group expression - 表示必须更改以启动新数据组的数据。

  • Group header section - 帮助将标签放在分组数据的开头。

  • Group footer section - 帮助将标签放在分组数据的末尾。

在报表填充时迭代数据源期间,如果组表达式的值发生更改,则会发生组破裂,并在结果文档中插入相应的部分。

报告组机制不对数据源提供的数据执行任何排序。 仅当数据源中的记录已根据报告中使用的组表达式进行排序时,数据分组才能按预期工作。

组属性

元素包含允许我们控制分组数据布局方式的属性。 属性总结在下表中 -

S.NO 属性和描述
1

name

这是强制性的。 它按名称引用报表表达式中的组。 它遵循我们为报表参数,字段和报表变量提到的相同命名约定。 当您要引用特定报告组时,可以在其他JRXML属性中使用它。

2

isStartNewColumn

设置为true ,每个数据组将从新列开始。 默认值为false

3

isStartNewPage

设置为true ,每个数据组将在新页面上开始。 默认值为false

4

isResetPageNumber

设置为true ,每次启动新组时都会重置报告页码。 默认值为false.

5

isReprintHeaderOnEachPage

设置为true ,将在每个页面上重新打印组标题。 默认值为false
6

minHeightToStartNewPage

定义列底部所需的最小垂直空间量,以便将组标题放在当前列上。 金额以报告单位指定。

7

footerPosition

在页面上呈现组页脚的位置,以及与其后面的报表部分相关的行为。它的值可以是: NormalStackAtBottomForceAtBottomCollateAtBottom 。 默认值为“ Normal

8

keepTogether

设置为true ,防止组在第一次中断尝试时拆分。

例子 (Example)

让我们将一个组( CountryGroup )添加到现有报告模板(章节报告设计 )。 计算每个国家/地区的出现次数,并将计数显示为组页脚。 在组头中,每个记录的计数都是前缀。 修订后的报告模板(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\iowiki\JasperReportFill.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBean.java的内容如下 -

package com.iowiki;
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\iowiki\DataBeanList.java的内容如下所示 -

package com.iowiki;
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;
   }
}

报表生成 (Report Generation)

我们将使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中获取的,应该与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.iowiki.JasperReportFill (viewFullReport是默认目标)为 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig
   for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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报告组示例

在这里,我们看到每个国家/地区都被分组,每个国家/地区的发生次数都显示在每个组的页脚中。

Report Fonts

报告包含文本元素,每个元素都可以有自己的字体设置。 可以使用“textElement”标记中提供的< font “标记指定这些设置。 报告可以定义许多字体。 定义后,它们可以用作整个报表中其他字体定义的默认或基本字体设置。

报告字体

报告字体是在报告级别声明的字体设置的集合。 在设置文本元素的字体属性时,可以在整个报表模板中重用报表字体。

报告字体现已弃用。 不要使用文档本身声明的元素。 请改用元素。

字体属性

下表总结了< font “元素的主要属性 -

S.NO 属性和描述
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

iText库也需要等效的PDF字符编码。

9

isPdfEmbedded

指定字体是否应嵌入文档本身的标志。 它默认为false。 如果设置为true,则有助于查看PDF文档而不会出现任何问题。

字体类型

在JasperReports中,字体可以归类为 -

  • Logical Fonts - 自1.0版以来Java平台已识别的五种字体类型称为逻辑字体。 它们是 - Serif, SansSerif, Monospaced, Dialog, and DialogInput 。 这些逻辑字体不是安装在系统上任何位置的实际字体库。 它们只是Java运行时识别的字体类型名称。 这些必须映射到系统上安装的某些物理字体。

  • Physical Fonts - 这些字体是实际的字体库,例如,由TrueType或PostScript Type 1字体组成。 物理字体可以是Arial,Time,Helvetica,Courier或任何其他字体,包括国际字体。

  • Font Extensions - JasperReports库可以通过其对字体扩展的内置支持,在运行时使用在运行中注册的字体。 可以使用字体扩展名为JasperReports提供字体系列列表。 这些是由类似的字体面和支持特定的区域设置。

如上表所述,我们需要在属性fontName指定物理字体的名称,逻辑字体的名称或注册的JasperReports字体扩展名中的字体系列的名称。

PDF字体名称

在将报告导出为PDF(可移植文档格式)时,JasperReports库使用iText库。 PDF文件可以在各种平台上查看,并且看起来总是一样。 这部分是因为在这种格式中,有一种处理字体的特殊方法。 导出为PDF时, fontName属性fontName 。 属性pdfFontName存在于我们需要指定字体设置的位置。

iText库知道如何处理内置字体和TTF文件,并识别以下内置字体名称 -

  • Courier
  • Courier-Bold
  • Courier-BoldOblique
  • Courier-Oblique
  • Helvetica
  • Helvetica-Bold
  • Helvetica-BoldOblique
  • Helvetica-Oblique
  • Symbol
  • Times-Roman
  • Times-Bold
  • Times-BoldItalic
  • Times-Italic
  • ZapfDingbats

根据iText库的先决条件,要使用字体,我们需要指定以下其中一个作为字体名称 -

  • 上面列表中的内置字体名称。

  • TTF(True Type Font)文件的名称,它可以在磁盘上找到。

  • 字体的真实名称,前提是包含字体的TTF文件先前已使用iText注册,或者在注册字体时定义了别名。

根据上述先决条件, pdfFontName属性可以包含以下值之一 -

  • 上面列表中内置PDF字体的名称。

  • 导出为PDF时可在运行时位于磁盘上的TTF文件的名称。

  • 注册字体的真实姓名。

  • 对于使用iText注册为字体文件的字体,键的后缀( net.sf.jasperreports.export.pdf.font之后的部分)。

默认字体和继承

每个文本元素都从其父元素继承字体和样式属性,而父元素又从其父元素继承这些属性。 如果没有为元素定义样式和/或字体,则将应用在根元素中声明的默认样式(和/或字体 - 但现在已弃用)。

在JasperReports中定义默认样式或字体不是必需的。 如果没有为给定元素定义字体,引擎会查找继承的字体属性,或者,如果没有找到这种方式的属性,它会在/src/default.jasperreports.properties查找net.sf.jasperreports.default.font.name属性。 /src/default.jasperreports.properties文件。 其值定义在未为文本元素显式定义字体属性或从其父元素继承字体属性时要使用的字体系列的名称。

/src/default.jasperreports.properties文件中定义的主要默认字体属性及其值位于下表中 -

属性 描述
net.sf.jasperreports.default.font.name=SansSerif 默认字体名称。
net.sf.jasperreports.default.font.size=10 默认字体大小。
net.sf.jasperreports.default.pdf.font.name=Helvetica 默认的PDF字体。
net.sf.jasperreports.default.pdf.encoding=Cp1252 默认的PDF字符编码。
net.sf.jasperreports.default.pdf.embedded=false 默认情况下,不嵌入PDF字体。

例子 (Example)

为了演示使用字体和字体属性以获得特定的文本外观,让我们编写新的报告模板(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 IoWiki!]]>
         </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 IoWiki!</text></staticText>]]>
         </text>
      </staticText>
      <staticText>
         <reportElement x = "0" y = "100" width = "150" height = "40"/>
         <textElement>
            <font size = "12"/>
         </textElement>
         <text><![CDATA[Welcome to IoWiki!]]></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 IoWiki!</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 IoWiki!]]></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 IoWiki!</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 IoWiki!]]></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 IoWiki!</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 IoWiki!]]></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 IoWiki!</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 IoWiki!]]></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 IoWiki!</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 IoWiki!]]></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 IoWiki!</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 IoWiki!]]></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 IoWiki!</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 IoWiki!]]></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 IoWiki!</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 IoWiki!]]></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 IoWiki!</text></staticText>]]>
         </text>
      </staticText>
   </band>
</title>
</jasperReport>

填写和生成报告的java代码如下所示。 让我们将此文件JasperFontsReportFill.java保存到C:\tools\jasperreports-5.0.1\test\src\com\iowiki目录。

package com.iowiki;
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的实例来模拟其中包含一条记录的数据源,但所有字段都为null

报表生成 (Report Generation)

我们将使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下面)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中挑选出来的,应该与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.iowiki.JasperFontsReportFill (viewFullReport是默认目标)为 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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窗口打开,如下面的屏幕所示 -

Jasper报告字体示例

在这里,我们可以看到文本“Welcome to IoWiki”以不同的字体格式显示。

Unicode Support

在JasperReports中,处理文本需要一些专用工具来处理字符表示和文本格式化属性。 可以将任何文本视为具有特定表示结构的字符序列。 文本外观包括布局(和段落)和字体设置。 但在大多数情况下,文本布局保持不变,在不同的语言环境中运行报表时,字体设置可能会更改。

我们知道不同的语言在特定的字符表示方面需要不同的字符集。 因此,使用文本意味着使用字体。 但是,有关如何在JasperReports中使用字体的详细讨论,请参见报告字体一章。

关于给定报告中文本内容的主要特征之一是将其国际化的可能性。 这意味着,我们可以在不同的本地化环境中运行报告,使用不同的语言和其他本地化设置,而无需任何硬编码修改。 当报告要国际化时,字符编码是一个重要特征。

字符编码

字符是传达有意义信息的最小写作单位。 它是一个抽象的概念,一个角色没有视觉外观。 “大写拉丁语A”是与“小写拉丁语a”和“大写西里尔语A”和“大写希腊语阿尔法语”不同的字符。

角色的直观表示称为glyph 。 某组字形称为font 。 “大写拉丁语A”,“大写西里尔语A”和“大写希腊字母”可能具有相同的字形,但它们是不同的字符。 与此同时,“大写拉丁字母A”的字形在Times New Roman,Gill Sans和Poetica斜体斜体中看起来非常不同,但它们仍然代表相同的字符。

可用字符集称为character repertoire 。 曲目中给定字符的位置(索引)称为其代码位置或代码点。 在给定指令集内数字表示代码点的方法称为character encoding

编码通常以八位字节表示。 八位字节是一组八个二进制数字,即八个1和0。 八位字节可以表示0到255之间或0x00和0xFF之间的数字范围,以使用十六进制表示法。

Unicode

Unicode是一个字符库,包含世界语言中使用的大多数字符。 它可以容纳数百万个字符,并且已经包含数十万个字符。 Unicode分为64K字符的“平面”。 在大多数情况下使用的唯一一个是第一个平面,称为基本多语言平面,或BMP。

UTF-8是推荐的编码。 它使用可变数量的八位字节来表示不同的字符。

在JRXML文件中,编码属性在标头中指定。 它在报告编译时用于解码XML内容。 例如,如果报告仅包含法语单词和诸如ç,é,â等字符,则ISO-8859-1(也称为Latin-1)编码就足够了 -

<?xml version = "1.0" encoding = "ISO-8859-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导出参数也可用。

例子 (Example)

为了演示在Jasperreports中使用unicode支持,让我们编写新的报告模板(jasper_report_template.jrxml)。 Save it to C:\tools\jasperreports-5.0.1\test目录。 在这里,我们将使用Unicode字符(\ uXXXX)显示不同语言的文本。 使用UTF-8编码的任何字符只能使用其4位十六进制代码表示。 例如,希腊字母Γ可以写成\ 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\JasperUnicodeReportFill.java -5.0.1\test\src\com\iowiki目录。

package com.iowiki;
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的实例来模拟其中包含一条记录的数据源,但此单条记录中的所有字段都为null

报表生成 (Report Generation)

我们将使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中挑选出来的,应该与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.iowiki.JasperUnicodeReportFill (viewFullReport是默认目标),如下所示 -

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.iowiki.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/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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窗口打开,如下面的屏幕所示 -

Jasper报告Unicode示例

在这里,我们可以看到显示的文本是不同的语言。 我们还看到语言在同一页面上组合在一起,并且也混合到同一文本元素中。

Report Styles

JasperReports有一个功能 此元素是在报告级别声明的样式设置的集合。 前景色,背景色,字体是否为粗体,斜体或正常,字体大小,字体边框以及许多其他属性等属性由 样式可以扩展其他样式,也可以添加或覆盖父样式的属性。

风格属性

一些最常用的列表如下表所示 -

S.NO 属性和描述
1

name

是强制性的。 它必须是唯一的,因为它在整个报表中引用了相应的报表样式。

2

isDefault

指示此样式是否为文档的默认样式。

3

style

是对父样式的引用。

4

mode

指定元素的透明度。 可能的值为OpaqueTransparent

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,是否应显示空字符串(空格)。

条件样式

在某些情况下,只有在满足特定条件时才应用样式(例如,在报表详细信息部分中交替相邻的行颜色)。 这可以使用条件样式来实现。

条件样式有两个元素 -

  • a Boolean condition expression
  • a style

仅当条件计算结果为true时才使用该样式。

将样式应用于报表元素

任何类型的报表元素都可以使用style属性引用报表样式定义。 因此,将继承适用于当前元素的样式定义声明的所有样式属性。 要覆盖继承的值,可以使用在报表元素级别指定的样式属性。

样式模板

通过在公共场所定义样式,我们可以制作一组具有共同外观的报告。 然后,报告模板可以引用此常用样式模板。 样式模板是包含一个或多个样式定义的XML文件。 约定使用的样式模板文件*.jrtx扩展名,但这不是必需的。

样式模板包含以下元素 -

  • 《jasperTemplate》 - 这是样式模板文件的根元素。

  • 《template》 - 此元素用于包含对其他模板文件的引用。 此元素的内容被解释为引用的模板文件的位置。

  • 《style》 - 此元素与报表设计模板(JRXML文件)中具有相同名称的元素相同,但样式模板中的样式不能包含条件样式。 这种限制是由条件样式涉及报表表达式而导致的,而表达式只能在单个报表定义的上下文中解释。

JRXML报告中对样式模板的引用作为 样式模板在报告填充时加载,样式名称引用在加载所有模板后解析。 加载样式模板并将样式名称解析为样式时,会创建样式模板的树/图,树的顶部是报告中定义的样式集。 在此树上,样式名称引用将解析为与深度优先遍历中的名称匹配的最后一个样式。

例子 (Example)

让我们试试条件样式和样式模板。 让我们将< style “元素alternateStyle添加到现有的报告模板(章节报告设计 )。 根据条件,字体颜色变为蓝色以进行均匀计数。 我们还包含了一个样式模板"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\iowiki\JasperReportFill.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBean.java的内容如下 -

package com.iowiki;
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\iowiki\DataBeanList.java的内容如下 -

package com.iowiki;
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;
   }
}

报表生成 (Report Generation)

我们将使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下面)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中选取的,应该与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.iowiki.JasperReportFill (viewFullReport是默认目标)为 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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窗口打开,如下面的屏幕所示 -

贾斯珀报告风格示例

在这里,我们可以看到字体的颜色在偶数计数(在列国家/地区)中更改为蓝色。 在列名称中,字体颜色更改为绿色(此样式从样式模板引用)。

Report Scriptlets

我们在前面的章节中已经看到,报告中显示的数据通常是从报告参数和报告字段中提取的。 可以使用报告变量及其表达式处理此数据。 有些情况下,使用报表表达式或变量无法轻松实现复杂功能。 这样的示例可能是复杂的字符串操作,构建映射,或内存中的对象列表或使用第三方Java API操作日期。 对于这种情况,JasperReports为我们提供了一个使用Scriptlets执行此操作的简单而强大的方法。

Scriptlet是每次报告事件发生时执行的Java代码序列。 报告变量的值可以通过scriptlet受到影响。

Scriptlet宣言

我们可以用两种方式声明一个scriptlet -

  • 使用< scriptlet “元素。 该元素具有name属性和class属性。 class属性应该指定class的名称,它扩展了JRAbstractScriptlet类。 该类必须在报告填充时在类路径中可用,并且必须具有空构造函数,以便引擎可以动态实例化它。

  • 在报告模板(JRXML)中使用元素“ jasperReport ”的属性scriptletClass 。 通过使用scriptlet的完全限定名称(包括整个包名称)设置此属性,我们指示我们要使用scriptlet。 使用此属性创建的scriptlet实例的行为类似于scriptlet列表中的第一个scriptlet,并具有预定义的名称REPORT。

Scriptlet类

scriptlet是一个java类,必须扩展以下任一类 -

  • net.sf.jasperreports.engine.JRAbstractScriptlet - 此类包含许多必须在每个实现中重写的抽象方法。 JasperReports会在适当的时候自动调用这些方法。 开发人员必须实现所有抽象方法。

  • net.sf.jasperreports.engine.JRDefaultScriptlet - 此类包含JRAbstractScriptlet中每个方法的默认空实现。 开发人员只需要为他/她的项目实现他/她所需的方法。

下表列出了上述类中的方法。 在报告填充阶段,报告引擎将在适当的时间调用这些方法。

S.NO 方法和描述
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()

在评估报告的详细信息部分中的每个记录之后调用。

每个报告可以指定任意数量的scriptlet。 如果没有为报告指定scriptlet,则引擎仍会创建单个JRDefaultScriptlet实例,并使用内置的REPORT_SCRIPTLET参数进行注册。

我们可以向scriptlet添加我们需要的任何其他方法。 报表可以使用内置参数REPORT_SCRIPTLET调用这些方法。

全局Scriptlets

我们可以通过另一种方式将scriptlet与报表相关联,即通过全局声明scriptlet。 这使得scriptlet适用于在给定的JasperReports部署中填充的所有报告。 这可以通过将scriptlet作为扩展添加到JasperReports这一事实变得容易。 scriptlet扩展点由net.sf.jasperreports.engine.scriptlets.ScriptletFactory接口表示。 JasperReports将在运行时通过扩展加载所有可用的scriptlet工厂。 然后,它会向每个人询问他们想要应用于正在运行的当前报告的scriptlet实例列表。 在询问scriptlet实例列表时,引擎会提供一些工厂可以使用的上下文信息,以便确定哪些scriptlet实际应用于当前报表。

报告总督

调控器只是全局scriptlet的扩展,使我们能够解决报表引擎在运行时进入无限循环的问题,同时生成报表。 在设计时无法检测到无效的报告模板,因为大多数情况下,进入无限循环的条件取决于在运行时送入引擎的实际数据。 报告总督帮助决定某个报告是否已进入无限循环,他们可以阻止它。 这可以防止运行报表的计算机的资源耗尽。

JasperReports有两个简单的报表管理器,可以根据指定的最大页数或指定的超时间隔停止报表执行。 他们是 -

  • net.sf.jasperreports.governors.MaxPagesGovernor - 这是一个全局scriptlet,它正在寻找两个配置属性来决定它是否适用于当前正在运行的报表。 配置属性是 -

    • net.sf.jasperreports.governor.max.pages.enabled=[true|false]

    • net.sf.jasperreports.governor.max.pages=[integer]

  • net.sf.jasperreports.governors.TimeoutGovernor - 这也是一个全局scriptlet,它正在寻找以下两个配置属性来决定它是否适用。

    配置属性是 -

    • net.sf.jasperreports.governor.timeout.enabled=[true|false]

    • net.sf.jasperreports.governor.timeout=[milliseconds]

两个调控器的属性可以在jasperreports.properties文件中全局设置,也可以在报表级别设置为自定义报表属性。 这很有用,因为不同的报告可能有不同的估计大小或超时限制,也可能因为您可能需要打开所有报告的调控器,同时为某些报告关闭,反之亦然。

例子 (Example)

我们来编写一个scriptlet类( MyScriptlet )。 文件C:\tools\jasperreports-5.0.1\test\src\com\iowiki\MyScriptlet.java的内容如下 -

package com.iowiki;
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.";
   }
}

上述scriptlet类的详细信息如下 -

  • afterReportInit方法中,我们将值设置为变量"someVar" this.setVariableValue(“someVar”,new String(“此变量值由scriptlet修改。”))。

  • 在课程结束时,定义了一个名为'hello'的额外方法。 这是一个可以添加到实际返回值的Scriptlet的方法示例,而不是设置变量。

接下来,我们将在现有报告模板(章节报告设计 )中添加scriptlet类引用。 修订后的报告模板(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.iowiki.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类。

  • Scriptlet只能访问,但不能修改报告字段和参数。 但是,scriptlet可以修改报表变量值。 这可以通过调用setVariableValue()方法来完成。 此方法在JRAbstractScriptlet类中定义,该类始终是任何scriptlet的父类。 在这里,我们定义了一个变量someVar ,它将被MyScriptlet修改为具有值, This value was modified by the scriptlet

  • 上面的报告模板在Summary字段中有一个方法调用,它说明了如何编写新方法(在scriptlet中)并在报告模板中使用它们。 ( $P{REPORT_SCRIPTLET}.hello()

报告填充的java代码保持不变。 文件C:\tools\jasperreports-5.0.1\test\src\com\iowiki\JasperReportFill.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBean.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBeanList.java的内容如下所示 -

package com.iowiki;
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;
   }
}

报表生成 (Report Generation)

我们将使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下面)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中选取的,应该与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.iowiki.JasperReportFill (viewFullReport是默认目标)为 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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窗口打开,如下面的屏幕所示 -

Jasper Report Scriplet示例

在这里,我们看到MyScriptlet类显示两条消息 -

  • 在标题部分 - This variable value was modified by the scriptlet
  • 在底部 - Hello! I'm the report's scriptlet object. Hello! I'm the report's scriptlet object.

Create SubReports

子报告是JasperReports的一个很好的功能。 此功能允许在另一个报表中合并报表,也就是说,一个报表可以是另一个报表的子报表。 子报告可以帮助我们简化报表设计,因为我们可以创建许多简单的报表并将它们封装到主报表中。 子报表的编译和填充就像普通报告一样。 任何报告模板在合并到另一个报告模板时都可以用作子报告,而(报告模板的内部)没有任何更改。

子报表与普通报表模板类似。 它们实际上是net.sf.jasperreports.engine.JasperReport对象,它们是在编译net.sf.jasperreports.engine.design.JasperDesign object后获得的。

《subreport》 Element

将子报表引入主报表时使用元素。 以下是 JRXML元素中的子元素列表。

  • <reportElement>

  • - 用于将包含报表参数的映射传递给子报表。 通常从主报表中的参数获取映射,或者使用内置的REPORTS_PARAMETERS_MAP参数将父报表的参数传递给子报表。 此表达式应始终返回一个java.util.Map对象,其中键是参数名称。

  • - 此元素用于将参数传递到子报表。 它有一个属性name ,这是必需的。

  • - 用于将java.sql.Connection传递给子报表。 仅在子报表模板在报表填充阶段需要数据库连接时才使用它。

  • - 用于将数据源传递到子报表。 此数据源通常从主报表中的参数获取,或者使用内置的REPORT_DATA_SOURCE参数将父报表的数据源传递到子报表。

  • 元素( connectionExpression and dataSourceExpression )不能同时出现在“子报表”元素声明中。 这是因为我们无法提供数据源和子报表的连接。 我们必须决定其中一个并坚持下去。

  • - 用于将其中一个子报表变量的值分配给主报表的变量之一。 此子元素具有以下属性 -

    • subreportVariable - 此属性指定要返回其值的子报表变量的名称。

    • toVariable - 此属性指定父报表变量的名称,其值将使用子报表中的值进行复制/递增。

    • calculation - 此属性可以取值:Nothing,Count,DistinctCount,Sum,Average,Lowest,Highest,StandardDeviation,Variance。 属性calculation默认值为“Nothing”。

    • incrementerFactoryClass - 此属性指定用于创建增量器实例的工厂类。

  • - 这表示在何处查找子报表的已编译报表模板。 该元素具有class属性。 class属性可以采用以下任何值:java.lang.String,java.io.File,java.net.URL,java.io.InputStream,net.sf.jasperreports.engine.JasperReport。 默认值为java.lang.String

  • isUsingCache - 这是元素的一个属性。 这是一个布尔值,当设置为true ,报告引擎将尝试使用其指定的源识别先前加载的子报告模板对象。 此缓存功能仅适用于具有表达式的子报表元素,这些表达式将java.lang.String对象作为子报表模板源返回,表示文件名,URL或类路径资源。

例子 (Example)

让我们举一个简单的例子来演示使用JRDataSource创建子报表。 让我们先写两个新的报告模板,一个是子报告,另一个是主报告。 子报表(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\iowiki -

package com.iowiki;
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;
   }
}

在这里,我们声明了两个字段'city''street' ,并定义了相应的getter和setter方法。

现在,让我们更新现有的DataBean文件。 我们将添加一个新的字段subReportBeanList ,它是一个java.util.List。 该字段将保存SubReportBean对象的列表。 DataBean文件的内容如下。 将其保存到目录C:\tools\jasperreports-5.0.1\test\src\com\iowiki。

package com.iowiki;
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\iowiki\DataBeanList.java 。 该文件的内容如下 -

package com.iowiki;
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”,它定义了子报表的路径。 我们定义了一个java.util.List,类型的字段subReportBeanList java.util.List,它对应于DataBean文件中的属性。 元素“subreport”具有子元素“dataSourceExpression”。 我们已将列表subReportBeanList放在JRBeanCollectionDataSource的实例中。 在子元素“subreportExpression /”中,我们给出了子报表名称(AddressReport.jasper)。

现在,让我们编写一个新类CreateReport来编译和执行我们的报告模板。 文件C:\tools\jasperreports-5.0.1\test\src\com\iowiki\CreateReport.java的内容如下所示 -

package com.iowiki;
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)文件以进行报告填充。

报表生成 (Report Generation)

现在,我们所有的文件都准备好了,让我们使用常规的ANT构建过程来编译和执行它们。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下面)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中选取的,应该与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.iowiki.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/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\
      jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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窗口打开,如下面的屏幕所示 -

Jasper SubReport示例

在这里,我们可以看到显示属性Name,Country和Address。

Creating Charts

早期人们不得不依靠scriptlet收集图表数据并使用报告模板中的图像元素渲染图表。 JasperReports现在变得简单,因为它内置了对使用新图表组件的图表的支持。

使用新的图表组件,用户只需应用可视设置并定义有助于构建图表数据集的表达式。 JasperReports使用JFreeChart作为底层图表库。 配置新图表组件时,涉及以下三个组件 -

  • 整体图表组件。

  • 图表数据集(将图表数据相关设置分组)。

  • 图表图表(对图表项目的呈现方式相关的视觉设置进行分组)。

JasperReports目前支持以下类型的图表:Pie,Pie 3D,Bar,Bar 3D,XY Bar,Stacked Bar,Stacked Bar 3D,Line,XY Line,Area,XY Area,Stacked Area,Scatter,Bubble,Time Series,High - 低开,关闭,烛台,多轴,仪表,温度计和甘特图。

图表属性

图表是常规报表元素,因此它们与所有其他报表元素共享其某些属性。 有一个名为< chart “的JRXML元素,用于创建所有类型的图表。 此元素将特定于图表的特定设置分组,这些设置适用于所有类型的图表。

Chart Sub-Elements

元素的子元素是 -

  • 《reportElement》 - 这些是可显示的对象,例如放在报表模板部分中的静态文本,文本字段,图像,线条和矩形。

  • 《Box》 - 此元素用于通过可在每侧自定义的边框环绕图表。

  • 《chartTitle》 - 此元素用于放置图表的标题。 position属性决定报表中图表的标题位置。 此元素具有属性 - Position (值可以是TopBottomLeftRight .Deafult值是Top ), color 。 “chartTitle”将fonttitleExpression作为子元素。

  • 《chartSubtitle》 - 此元素用于放置图表的副标题。 此元素具有属性 - color 。 “chartSubtitle”将fontsubtitleExpression作为子元素。

  • 《chartLegend》 - 元素可以使用此元素控制字体相关属性以及图表图例的文本颜色和背景颜色。 此元素具有属性 - textColorbackgroundColor

  • 《anchorNameExpression》 - 此元素为锚点创建目标。

  • 《hyperlinkReferenceExpression》 - 此元素包含一个报告表达式,指示外部资源的名称(通常是URL)。

  • 《hyperlinkAnchorExpression》 - 《hyperlinkAnchorExpression》链接指向外部资源中的锚点。

  • 《hyperlinkPageExpression》 - 超链接指向当前报告中的页面。

  • 《hyperlinkTooltipExpression》 - 此元素控制超链接的工具提示。 表达式的类型应该是java.lang.String

  • 《hyperlinkParameter》 - 此元素(如果存在)根据参数值生成最终超链接。

图表属性

可用于所有图表类型的元素中的属性是 -

  • isShowLegend - 如果图表图例将显示在报表上,则此属性用于确定。 值可能为truefalse 。 默认值为true

  • evaluationTime - 确定何时evaluationTime图表的表达式。 值可以是NowReportPageColumnGroupBand 。 默认值为Now

  • evaluationGroup - 此属性确定用于评估图表表达式的组的名称。 此属性的值必须与组的名称匹配,我们希望将其用作图表的评估组。

  • hyperlinkType - 此属性可以包含任何文本值。 默认值为None 。 这意味着,即使存在特殊的超链接表达式,文本字段和图像也不代表超链接。

  • hyperlinkTarget - 此属性有助于在查看器中单击指定链接时自定义指定链接的行为。 值可以是SelfBlank 。 默认值为Self

  • bookmarkLevel - 此属性设置为正整数时,会在导出为PDF的报表中生成书签。 默认值为0

  • customizerClass - 这是可用于自定义图表的类(可选)的名称。 此元素的值必须是包含自定义程序类名称的String。

图表定制

如上所述,JasperReports使用JFreeChart作为底层图表库。 JFreeChart包含JasperReports不直接支持的功能。 我们可以通过“chart”元素中的customizerClass属性提供自定义程序类来利用这些功能。 定制器类不是什么,而是net.sf.jasperreports.engine.JRChartCustomizer接口的net.sf.jasperreports.engine.JRChartCustomizer 。 实现此接口的最简单方法是扩展net.sf.jasperreports.engine.JRAbstractChartCustomizer类,从而可以访问参数,字段和变量,以便根据报表数据进行更灵活的图表自定义。

图表数据集

所有图表类型的常见属性之一是< dataset “元素。 图表数据集有助于在运行时映射报表数据和检索图表数据。 每个图表类型包含不同的子元素以定义图表的表达式。 这些表达式定义用于生成图表的数据。 所有这些子元素都包含一个“dataset”元素,用于定义何时评估和重置图表的表达式。

JasperReports中提供了几种类型的图表数据集,因为每种类型的图表都适用于某些数据集:饼图,类别,XY,时间序列,时间段,XYZ和高 - 低。 这些数据集类型中的每一个都实现了定义图表数据集的net.sf.jasperreports.engine.JRChartDataset接口。 所有图表数据集都以相同的方式初始化和递增; 但是,它们的区别仅在于它们映射的数据类型或数据系列。

数据集属性

下面给出的表总结了元素的属性 -

属性 描述
resetType 此属性确定何时重置图表表达式的值。 无,报告,页面,列,组。 默认值为Report
resetGroup 此属性确定重置图表表达式值的组的名称。 此属性的值必须与JRXML报告模板中声明的任何组的名称匹配。
incrementType 此属性确定何时重新计算图表表达式的值。 无,报告,页面,列,组。 默认值为"None"
incrementGroup 此属性确定重新计算图表表达式的组的名称。 此属性的值必须与JRXML报告模板中声明的组的名称匹配。

下表总结了元素的子元素 -

子元素 描述
<incrementWhenExpression> 可以通过使用此子元素过滤掉不需要的数据来自定义图表数据集递增的方式。
<datasetRun> 其中包含实例化报表子数据集所需的信息。

数据集类型

具体的数据集类型解释如下 -

Pie Dataset

饼图数据集的特征在于以下表达式 -

  • - 表示将构成饼图中切片的类别。 该表达式可以返回任何java.lang.Comparable对象。

  • - 生成与数据集中的每个类别/键对应的值。 值始终是java.lang.Number对象。

  • - 如果缺少此表达式,图表将显示饼图中每个切片的默认标签。 使用此表达式返回java.lang.String值,以自定义饼图的项标签。

  • - 设置与饼图部分关联的超链接。

类别数据集

类别数据集由元素表征,其中包含 -

  • - 表示系列的名称。 该表达式可以返回任何java.lang.Comparable对象。

  • - 返回系列表达式指定的系列中每个值的类别名称。 类别是java.lang.Comparable对象。

  • - 生成与数据集中每个类别对应的值。 值始终是java.lang.Number对象。

  • - 如果缺少此表达式,图表将显示图表中每个项目的默认标签。 使用此表达式返回java.lang.String值,以自定义图表的项标签。

  • - 设置与图表项关联的超链接。

XY数据集

XY数据集由元素表征,其中包含 -

  • - 表示系列的名称。 该表达式可以返回任何java.lang.Comparable对象。

  • - 返回表示将添加到当前数据系列的(x,y)对的X值的java.lang.Number值。

  • - 返回表示将添加到当前数据系列的(x,y)对的Y值的java.lang.Number值。

  • - 如果缺少此表达式,图表将显示图表中每个项目的默认标签。 使用此表达式返回java.lang.String值,以自定义图表的项标签。

  • - 设置与图表项关联的超链接。

XYZ数据集

XYZ数据集由元素表征,其中包含 -

  • - 表示系列的名称。 该表达式可以返回任何java.lang.Comparable对象。

  • - 返回表示将添加到当前数据系列的(x,y,z)项的X值的java.lang.Number值。

  • - 返回表示将添加到当前数据系列的(x,y,z)项的Y值的java.lang.Number值。

  • - 返回表示将添加到当前数据系列的(x,y,z)项的Z值的java.lang.Number值。

  • - 如果缺少此表达式,图表将显示图表中每个项目的默认标签。 使用此表达式返回java.lang.String值,以自定义图表的项标签。

  • - 设置与图表项关联的超链接。

时间序列数据集

时间序列数据集由timePeriod属性和元素表征。 timePeriod属性指定数据集内数据系列的类型。 时间序列可以包含与天,月,年或其他预定义时间段相关联的数值。 可能的值包括: Year, Quarter, Month, Week, Day - this is the default value, Hour, Minute, Second, Millisecond.

元素包含 -

  • - 表示系列的名称。 该表达式可以返回任何java.lang.Comparable对象。

  • - 返回一个java.util.Date值,引擎将根据上面提到的timePeriod属性设置的值从中提取相应的时间段。

  • - 返回java.lang.Number值,以便在递增数据集的当前序列时与相应的时间段值相关联。

  • - 如果缺少此表达式,图表将显示图表中每个项目的默认标签。 使用此表达式返回java.lang.String值,以自定义图表的项标签。

  • - 设置与图表项关联的超链接。

时间段数据集

时间段数据集由元素表征,其中包含 -

  • - 表示系列的名称。 该表达式可以返回任何java.lang.Comparable对象。

  • - 指定将数值添加到时间段序列时与之关联的日期间隔的开头。

  • - 指定将数值添加到时间段序列时与之关联的日期间隔的结束。

  • - 返回java.lang.Number值,以与开始日期和结束日期表达式指定的当前日期间隔关联。

  • - 如果缺少此表达式,图表将显示图表中每个项目的默认标签。 使用此表达式返回java.lang.String值,以自定义图表的项标签。

  • - 设置与图表项关联的超链接。

高低数据集

高低数据集的特征在于以下表达式 -

  • - 目前,High-Low或Candlestick图表中仅支持一个系列。 但是,此单个系列必须由此表达式返回的java.lang.Comparable值标识,并且还必须用作图表图例中的系列名称。

  • - 返回当前(高,低,开,结,体积)项所引用的日期。

  • - 返回java.lang.Number值,该值将在数据集递增时添加到系列中的数据项的一部分。

  • - 返回java.lang.Number值,该值将在数据集递增时添加到系列中的数据项的一部分。

  • - 返回java.lang.Number值,该值将是数据集递增时添加到系列的数据项的一部分。

  • - 返回java.lang.Number值,该值将是数据集递增时添加到系列的数据项的一部分。

  • - 一个数值表达式,返回用于当前数据项的音量值。 它仅用于烛台图表。

  • - 设置与图表项关联的超链接。

价值数据集

这是一个特殊的图表数据集实现,包含单个值,用于呈现Meter和Thermometer图表。 使用表达式收集该值。

图表图

所有图表类型的另一个常见JRXML元素是< plot “元素。 这允许我们定义几个图表的特征,如方向和背景颜色。 根据图表的类型,图表不同。

绘图属性

下面给出的表总结了元素的属性 -

属性 描述
backcolor 此属性定义图表的背景颜色。 任何六位十六进制值都是此属性的有效值。 十六进制值必须以#开头。
orientation 此属性定义图表的方向。 水平,垂直默认值为“垂直”
backgroundAlpha 此属性定义图表背景颜色的透明度。 此属性的有效值包括0到1之间的任何十进制数,包括0和1。 数字越大,背景透明度越低。 默认值为“1”。
foregroundAlpha 此属性定义图表前景色的透明度。 此属性的有效值包括0到1之间的任何十进制数,包括0和1。 数字越大,背景透明度越低。 默认值为“1”。
labelRotation 此属性允许在x轴上旋转文本标签以顺时针或逆时针旋转。 此属性仅适用于x轴不是数字或不显示日期的图表。 默认值为“0.0”。

元素有一个子元素,其属性为: seriesOrdercolor 此元素自定义系列的颜色,以及它们在颜色序列中的位置。

图表的特定设置

  • piePlot - 它没有特定的设置

  • pie3DPlot - 包含depthFactor属性,数值范围从0到1,表示饼图的深度占绘图区域高度的百分比。

  • barPlot - 可以显示或隐藏刻度标签,刻度线或项目标签,并提供两个轴的设置。

  • bar3DPlot - 提供与bar3DPlot相同的设置,并使用xOffset和yOffset属性生成3D效果。

  • linePlot - 可以显示或隐藏连接项目点的线条,可以显示或隐藏与项目点关联的形状,并提供两个轴的设置。

  • scatterPlot - 与scatterPlot类似,它可以显示或隐藏连接项目点的线条,可以显示或隐藏与项目点相关联的形状,并提供两个轴的设置。

  • areaPlot - 提供两个轴的设置。

  • bubblePlot - 可以通过设置scaleType属性来设置气泡尺寸,并为两个轴提供设置。

  • timeSeriesPlot - 可以显示或隐藏连接项目点的线条,可以显示或隐藏与项目点相关联的形状,并提供两个轴的设置。

  • highLowPlot - 可以显示或隐藏打开的刻度,可以显示或隐藏关闭刻度,并提供两个轴的设置。

  • candlestickPlot - 可以显示或隐藏音量,并为两个轴提供设置。

  • meterPlot - 包含表盘形状,刻度角,测量单位,刻度间隔,刻度盘颜色,针颜色,刻度颜色,值显示字体,颜色和格式图案,数据范围和仪表间隔的特定设置。

  • thermometerPlot - 包含值位置,水银颜色,显示/隐藏值行,值显示字体,颜色和格式模式,数据范围,低范围,中等范围和高范围的特定设置。

  • multiAxisChart - 包含multiAxisChart包含的轴的特定设置。

图表类型

JasperReports为多种图表类型提供内置支持。 它们列出如下 -

  • pieChart - 饼图数据集和饼图的组合。

  • pie3DChart - 对饼图数据集和饼图3D图进行分组。

  • barChart - 类别数据集和条形图的基本组合。

  • bar3DChart - 包装类别数据集和条形3D图。

  • xyBarChart - 支持时间段数据集,时间序列数据集和XY数据集,并使用条形图来渲染轴和项目。

  • stackedBarChart - 使用Category数据集中的数据并使用Bar图表呈现其内容。

  • stackedBar3DChart - 使用Category数据集中的数据并使用Bar 3D绘图呈现其内容。

  • lineChart - 对类别数据集和线图进行分组。

  • xyLineChart - 对XY数据集和线图进行分组。

  • areaChart - 使用“区域”图绘制“类别”数据集中的项目。

  • stackedAreaChart - 使用“区域”图绘制“类别”数据集中的项目。

  • xyAreaChart - 使用XY数据集中的数据并通过“区域”图绘制它。

  • scatterChart - 使用Scatter图包装XY数据集。

  • bubbleChart - 将XYZ数据集与气泡图合并。

  • timeSeriesChart - 对时间序列数据集和时间序列图进行分组。

  • highLowChart - 高 - 低数据集和高 - 低图的组合。

  • candlestickChart - 使用来自High-Low数据集的数据,但使用特殊的Candlestick图。

  • meterChart - 使用Meter绘图中的渲染选项,从刻度盘上的Value数据集显示单个值。

  • thermometerChart - 使用Thermometer图中的渲染选项显示Value数据集中的单个值。

  • multiAxisChart - 包含多个范围轴,所有轴共享一个公共域轴。

例子 (Example)

为了演示图表,让我们编写一个新的报告模板(jasper_report_template.jrxml)。 在这里,我们将< barChart “元素添加到”pageHeader“部分,将” barChart “元素添加到”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元素是中的 barChart>。 它包含一个 chart>子元素,其中包含一个子元素,用于定义图表的尺寸和位置。

  • 条形图中的元素必须包含在和 categoryDataset> JRXML元素之间。

  • 必须包含元素。 此元素定义条形将表示的数据元素(在此示例中为主题名称)。

  • 还必须包含一个元素,该元素定义如何将数据分成类别以进行比较。 这里,数据按主题名称分隔。

  • 元素定义了用于确定图表中每个条形图值的表达式。 在这里,我们使用“标记”。

  • 对于饼图,我们在

    部分下使用了元素。 它包含一个 chart>子元素。

  • 子元素包含一个报表表达式,指示要在图表中用作键的内容。 在这里,我们使用了subjectName。

  • 子元素包含用于计算键值的表达式。 在这里,我们使用了标记。

报告填充的java代码保持不变。 文件C:\tools\jasperreports-5.0.1\test\src\com\iowiki\JasperReportFill.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBean.java内容如下 -

package com.iowiki;
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\iowiki\DataBeanList.java需要更新,如下所示 -

package com.iowiki;
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;
   }
}

报表生成 (Report Generation)

接下来,让我们使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下面)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中选取的,应该与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.iowiki.JasperReportFill (viewFullReport是默认目标),如下所示 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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 - Crosstabs

交叉表(交叉制表)报表是包含表格的报表,这些表格以表格形式跨行和列排列数据。 交叉表对象用于在主报表中插入交叉表报表。 交叉表可以与任何级别的数据(名义,序数,间隔或比率)一起使用,并且通常以动态表的形式显示报告变量中包含的汇总数据。 变量用于显示汇总数据,例如总和,计数,平均值。

交叉表属性

JRXML元素< crosstab “用于将交叉表插入报表中。

属性 (Attribute)

以下是< crosstab “元素的属性列表 -

  • isRepeatColumnHeaders - 指示是否应在分页后重新打印列标题。 默认值为true

  • isRepeatRowHeaders - 指示是否应在交叉表列中断后重新打印行标题。 默认值为true

  • columnBreakOffset - 发生列中断时,表示在后续交叉表块放置在同一页面上的前一个交叉表块之前的垂直空间量(以像素为单位)。 默认值为10。

  • runDirection - 指示是否应从左到右(LTR)或从右到左(RTL)填充交叉表数据。 默认值为LTR。

  • ignoreWidth - 指示交叉表是否超出初始交叉表宽度限制并且不生成列分隔符。 否则,它将停止在交叉表宽度限制内呈现列,并仅在所有行开始渲染后继续使用其余列。 默认值为false

子元素

元素具有以下子元素 -

  • 《reportElement》 - 此元素定义其封闭内交叉表的位置,宽度和高度。 此元素的属性包括所有标准“reportElement”属性。

  • 《crosstabParameter》 - 此元素用于从交叉表中访问报表变量和参数。 该元素的属性包括 -

    • name - 定义参数名称。

    • class - 这表示参数类。

  • 《parametersMapExpression》 - 此元素用于传递包含java.util.Map实例的报表变量或参数,作为交叉表的一组参数。 此元素不包含任何属性。

  • 《crosstabDataset》 - 此元素定义用于填充交叉表的数据集(有关详细说明,请参阅下一节)。 该元素的属性包括 -

    • isDataPreSorted - 指示数据集中的数据是否已预先排序。 默认值为false

  • 《crosstabHeaderCell》 - 此元素定义在列标题和行标题相交的交叉表左上角找到的区域的内容。 根据定义的行和列宽度和高度自动计算此单元格的大小。

  • 《rowGroup》 - 此元素定义用于将数据拆分为行的组。 该元素的属性包括 -

    • name - 定义行组的名称。

    • width - 这定义了行组的宽度。

    • headerPosition - 定义标题内容的位置(Top,Middle,Bottom,Stretch)。

    • totalPosition - 定义整个列的位置(Start,End,None)。

    该元素包含以下子元素 -

    • 《bucket》

    • 《crosstabRowHeader》

    • 《crosstabTotalRowHeader》

  • 《columnGroup》 - 此元素定义用于将数据拆分为列的组。 该元素的属性包括 -

    • name - 定义列组名称。

    • height - 这定义列组标题的高度。

    • headerPosition - 定义标题内容的位置( Right, Left, Center, Stretch )。

    • totalPosition - 定义整个列的位置( Start, End, None )。

    该元素包含以下子元素 -

    • 《bucket》

    • 《crosstabColumnHeader》

    • 《crosstabTotalColumnHeader》

  • 《measure》 - 此元素定义跨行和列执行的计算。 该元素的属性包括 -

    • name - 定义度量名称。

    • class - 这表示度量类。

    • calculation - 这表示要在交叉表单元格值之间执行的计算。 它的值可以是这些中的任何一个 - Nothing, Count, DistinctCount, Sum, Average, Lowest, Highest, StandardDeviation, Variance,First 。 默认值为Nothing

  • 《crosstabCell》 - 此元素定义如何布置非标题单元格中的数据。 该元素的属性包括 -

    • columnTotalGroup - 这表示用于计算列总计的组。

    • height - 定义单元格的高度。

    • rowTotalGroup - 这表示用于计算行总计的组。

    • width - 定义单元格的宽度。

  • 《whenNoDataCell》 - 此元素定义在空交叉表单元格上显示的内容。 此元素不包含任何属性。

交叉表中的数据分组

交叉表计算引擎通过迭代关联的数据集记录来聚合数据。 为了聚合数据,需要先对它们进行分组。 在交叉表中,行和列基于特定的组项,称为buckets 。 存储桶定义应包含 -

  • bucketExpression - 要计算以获取数据组项的表达式。

  • comparatorExpression - 在值的自然排序不是最佳选择的情况下需要。

  • orderByExpression - 表示用于对数据进行排序的值。

交叉表中的行和列组(如上所述)依赖于buckets

内置交叉表总变量

以下是测量的当前值列表,可以通过根据以下方案命名的变量访问对应于该单元的不同级别的总数 -

  • 度量计算的当前值存储在与度量具有相同名称的变量中。

  • 《Measure》_《Column Group》_ALL - 这将生成同一行中列组中所有条目的总和。

  • 《Measure》_《Row Group》_ALL - 这将生成同一列中行组中所有条目的总和。

  • 《Measure》_《Row Group》_《Column Group》_ALL - 这将产生对应于行组和列组中所有条目的组合总数。

例子 (Example)

为了演示交叉表,让我们编写一个新的报告模板(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>

以上文件的详情如下 -

  • 交叉表由元素定义。

  • 元素定义了一个用于将数据拆分为行的组。 这里,每行将显示不同名称的数据。

  • 元素定义要用作的组分隔符的报表表达式。 在这里,我们使用name字段作为分隔符,以便按名称拆分行。

  • 元素定义要用作行标题的表达式。 它包含一个子元素,即,其作用类似于交叉表内的内部波段。 我们没有为中的文本字段定义变量名,而是将名称分配给(通过其name属性),因此它创建了一个隐式变量。 元素定义整行的标题单元格的内容。 它需要一个元素作为其唯一的子元素。

  • 元素及其子元素类似于元素,除了它影响列而不是行。

  • 元素定义跨行和列执行的计算。 calculation属性设置为Count

  • 元素定义如何布置非标头单元格中的数据。 该元素还包含一个元素作为其唯一的子元素。

报告填充的java代码保持不变。 文件C:\tools\jasperreports-5.0.1\test\src\com\iowiki\JasperReportFill.java的内容如下所示 -

package com.iowiki;
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\iowiki\DataBean.java的内容如下 -

package com.iowiki;
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\iowiki\DataBeanList.java的内容如下 -

package com.iowiki;
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;
   }
}

报表生成 (Report Generation)

接下来,让我们使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下面)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中选取的,应该与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.iowiki.JasperReportFill (viewFullReport是默认目标),如下所示 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.iowiki.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/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
   [java] log4j:WARN No appenders could be found for logger (
   net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 20 minutes 53 seconds

作为上述编译的结果,JasperViewer窗口打开,如下面的屏幕所示 -

Jasper报告交叉表示例

在这里,我们看到每个国家和地区都有表格。

JasperReports - Internationalization

有时,我们需要使用不同语言的报告。 为每种不同的语言编写相同的报告意味着大量的冗余工作。 只有不同语言的文本应该单独编写,并在运行时加载到文本元素中,具体取决于区域设置。 这是报告国际化的目的。 国际化报告一经编写就可以在任何地方运行。

在以下步骤中,我们列出了如何使用不同语言生成报告以及报告国际化的一些其他功能 -

  • 将资源包java.util.ResourceBundle与报告模板相关联。 有两种方法可以将java.util.ResourceBundle对象与报告模板相关联。

    • 在设计时,通过将报告模板对象的resourceBundle属性设置为目标资源包的基本名称。

    • 可以通过在报告填充时提供java.util.ResourceBundle对象作为REPORT_RESOURCE_BUNDLE参数的值来进行动态/运行时关联。

    • 如果需要在与当前语言环境不同的语言环境中生成报告,则可以使用内置REPORT_LOCALE参数在填充报告时指定运行时语言环境。

  • 为了便于报告国际化,报告表达式中提供了一个特殊语法$R{}以引用放置在与报告关联的java.util.ResourceBundle对象内的java.lang.String资源。 $R{}字符语法根据必须放在括号之间的键从资源包中提取特定于语言环境的资源 -

<textFieldExpression>
   $R{report.title}
</textFieldExpression>

上述文本字段通过基于runtimesupplied locale和report.title键从与报告模板关联的资源包中提取String值来显示报告的标题。

  • 根据报告区域设置格式化不同语言的消息,报告net.sf.jasperreports.engine.fill.JRCalculator有一个内置方法。 此方法提供类似于java.text.MessageFormat类的功能。 此方法msg()有三个方便的签名,允许您在消息中使用最多三个消息参数。

  • 内置的str()方法(相当于报表表达式中的$ R {}语法),可以根据报表语言环境访问资源包内容。

  • 对于日期和时间格式,内置的REPORT_TIME_ZONE参数可用于确保正确的时间转换。

  • 在生成的输出中,库保留有关文本运行方向的信息,以便可以正确地呈现以从右到左书写的语言(如阿拉伯语和希伯来语)生成的文档。

  • 如果应用程序依赖于内置的Swing查看器来显示生成的报告,则需要通过调整按钮工具提示或显示的其他文本来使其国际化。 这很容易做到,因为查看器依赖于预定义的资源包来提取特定于语言环境的信息。 此资源包的基本名称是net.sf.jasperreports.view.viewer.

例子 (Example)

为了演示国际化,让我们编写新的报告模板(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.

要使用其他语言环境,文件名必须是localizationdemo [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\iowiki目录。 该文件的内容如下 -

package com.iowiki;
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();
      }
   }
}

报表生成 (Report Generation)

我们将使用常规的ANT构建过程编译并执行上述文件。 文件build.xml的内容(保存在目录C:\tools\jasperreports-5.0.1\test下面)如下所示。

导入文件 - baseBuild.xml是从环境设置一章中选取的,应该与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.iowiki.JasperReportFillI18 (viewFullReport是默认目标),如下所示 -

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.iowiki.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\iowiki\
      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/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
   [echo] Runnin class : com.iowiki.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窗口打开,如下面的屏幕所示 -

贾斯珀报告示例
↑回到顶部↑
WIKI教程 @2018