- JasperReports 教程
- JasperReports - 主页
- JasperReports - 入门
- JasperReports - 环境设置
- JasperReports - 生命周期
- JasperReports - 设计
- JasperReports - 编译设计
- JasperReports - 填充
- JasperReports - 查看和打印
- JasperReports - 导出
- JasperReports - 参数
- JasperReports - 数据源
- JasperReports - 字段
- JasperReports - 表达式
- JasperReports - 变量
- JasperReports - 部分
- JasperReports - 组
- JasperReports - 字体
- JasperReports - Unicode 支持
- JasperReports - 样式
- JasperReports - Scriptlet
- JasperReports - 创建子报表
- JasperReports - 创建图表
- JasperReports - 交叉表
- JasperReports - 国际化
- JasperReports 资源
- JasperReports - 快速指南
- JasperReports - 有用的资源
- JasperReports - 讨论
JasperReports - 快速指南
JasperReports - 入门
什么是报告
报告是有意义的、定义明确的、总结性的信息呈现。通常,日常活动是自动化的,数据汇总成支持决策的“报告”。报告将通常杂乱的数据表示为图表、图形和其他形式的图形表示形式。
报告模板
大多数商业报告生成工具通常采用以下布局来生成报告。
标题 |
页眉 |
列标题 |
细节 |
栏目页脚 |
页脚 |
概括 |
以下是图中提到的每个元素的描述 -
序号 | 元素和描述 |
---|---|
1 | 标题 标题包含报告的“标题”。它仅在报告的开头出现一次,例如“教程点报告”。 |
2 | 页眉 页眉可以包含日期和时间信息和/或组织名称。它出现在每页的顶部。 |
3 | 列标题 ColumnHeader 列出了您想要在报告中显示的特定字段的名称,例如“作者姓名”、“开始时间”、“结束时间”、“工作时间”、“日期”等。 |
4 | 细节 详细信息是显示特定字段条目(在列标题中列出)的部分,例如“Manisha”、“9:00”、“18:00”、“9”、“10.02.2013”。 |
5 | 列页脚 ColumnFooter 可以显示任何字段的总和,例如“总工作时间:“180”。 |
6 | 页脚 PageFooter 可能包含页数信息。它出现在每页的底部,例如“1/23”。 |
7 | 概括 摘要包含从“详细”部分推断出的信息,例如,列出每个作者的工作小时数后,每个作者的总工作时间可以放在饼图、图表等直观图表中,以便更好地比较。 |
贾斯珀报告
以下是报告开发过程中遇到的常见问题 -
核心更改- 通常,反映更改报告核心逻辑所需的业务更改或增强。
结果导出- 您的报告可以导出为多种格式,例如:HTML、文本、PDF、MS Excel、RTF、ODT、逗号分隔值、XML 或图像。
复杂的报告- 子报告和交叉表报告就是很好的例子。
图表报告- 可视化图表,例如图表、饼图、XY 线、条形图、仪表和时间序列。
为了消除上述几点的开销并促进报告过程,引入了许多框架、工具、库和第三方应用程序。JasperReports就是其中之一。
JasperReports是一个开源 Java 报告引擎。它基于 Java,没有自己的表达式语法。JasperReports 能够将丰富的内容传送到屏幕、打印机或 PDF、HTML、XLS、RTF、ODT、CSV、TXT 和 XML 文件中。由于它不是独立的工具,因此无法单独安装。相反,它通过将其库包含在应用程序的 CLASSPATH 中来嵌入到 Java 应用程序中。
JasperReports 是一个 Java 类库,并不适合最终用户,而是针对需要向其应用程序添加报告功能的 Java 开发人员。
Jasper报表的特点
JasperReports 的一些重要功能是 -
它具有灵活的报告布局。
它可以以文本或图形方式呈现数据。
开发人员可以通过多种方式提供数据。
它可以接受来自多个数据源的数据。
它可以生成水印(水印就像覆盖在主图像上的辅助图像)。
它可以生成子报告。
它能够以多种格式导出报告。
JasperReports - 环境设置
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)。提取文件的目录结构如下所示 -
这是所有目录的详细信息 -
build - 包含已编译的 JasperReport 类文件。
demo - 包含各种示例,演示 JasperReports 功能的几个方面。
dist - 包含 jasperreports-xxxjar 文件。我们将这个 JAR 文件添加到我们的 CLASSPATH 中以利用 JasperReports。
docs - 包含 JasperReports 文档的本地副本。
lib - 包含构建 JasperReports 和在我们的应用程序中使用它所需的所有 JAR。
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。
设置类路径
要使用 JasperReport,我们需要将以下文件设置到我们的 CLASSPATH -
jasperreports-xxxjar,其中 xxx 是 JasperReports 版本。这可以在目录 C:\tools\jasperreports-xxx\dist 下找到。
lib子目录 (C:\tools\jasperreports-xxx\lib)下的所有 JAR 文件。
安装时,我们使用JasperReport版本5.0.1。右键单击“我的电脑”并选择“属性”,单击“高级”选项卡下的“环境变量”按钮。现在使用此C:\tools\jasperreports-5.0.1\dist\jasperreports-5.0.1.jar:C:\tools\jasperreports-5.0.1\lib更新“Path”变量。现在您已准备好创建报告。
在本教程的所有示例中,我们都使用 ANT 任务来生成报告。构建文件负责导入生成报告所需的所有 JAR 。因此,如上所述设置 CLASSPATH 只会帮助那些希望在不使用 ANT 的情况下生成报告的人。
构建设置
本教程中的所有示例 -
是使用简单的文本编辑器编写的。
已保存在目录 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint 下。
已使用 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.tutorialspoint.HelpMe" /> <path id = "classpath"> <pathelement location = "./" /> <pathelement location = "${classes.dir}" /> <fileset dir = "${lib.dir}"> <include name = "**/*.jar" /> </fileset> <fileset dir = "${dist.dir}"> <include name = "**/*.jar" /> </fileset> </path> <target name = "compile" depends = "clean-sample"> <mkdir dir = "${classes.dir}"/> <javac srcdir = "${src.dir}" destdir = "${classes.dir}" classpathref = "classpath" /> </target> <target name = "run" depends = "compile"> <echo message = "Running class : ${main-class}"/> <java fork = "true" classname = "${main-class}"> <classpath> <path refid = "classpath" /> </classpath> </java> </target> <target name = "clean-sample"> <delete dir = "${classes.dir}" /> <delete file = "./${file.name}.jasper" /> <delete file = "./${file.name}.jrprint" /> </target> </project>
该文件包含所有必需的目标,例如清理目录、编译 java 文件和执行类文件。
以下是 baseBuild.xml 中各个目录提到的详细信息。假设当前目录是 C:\tools\jasperreports-5.0.1\test) -
jasper.dir - 是 C:\tools\jasperreports-5.0.1 目录
lib.dir - 是 C:\tools\jasperreports-5.0.1\lib 目录
src.dir - 是 C:\tools\jasperreports-5.0.1\test\src
classes.dir - 是 C:\tools\jasperreports-5.0.1\test\classes
主类- com.tutorialspoint.HelpMe。该类是一个简单的类,当没有从命令行传递类文件名时执行。将此文件保存到 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint。
package com.tutorialspoint; 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.tutorialspoint.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 - 生命周期
JasperReports 的主要目的是以简单灵活的方式创建面向页面、准备打印的文档。以下流程图描述了创建报告时的典型工作流程。
如图所示,生命周期有以下不同的阶段 -
设计报告- 在此步骤中,我们创建 JRXML 文件,它是一个包含报告布局定义的 XML 文档。我们可以使用任何文本编辑器或iReportDesigner来手动创建它。如果使用iReportDesigner,则以可视化方式设计布局,因此可以忽略JRXML的真实结构。
编译报告- 在此步骤中,JRXML 被编译为名为 Jasper 文件 (*.jasper) 的二进制对象。此编译是出于性能原因而完成的。Jasper 文件是您需要随应用程序一起提供的文件,以便运行报告。
执行报告(将数据填充到报告中) - 在此步骤中,应用程序中的数据将填充到编译的报告中。net.sf.jasperreports.engine.JasperFillManager 类提供了必要的函数来填充报告中的数据。将创建 Jasper 打印文件 (*.jrprint),可用于打印或导出报告。
将报告导出为所需格式- 在此步骤中,我们可以使用 JasperExportManager 将上一步中创建的 Jasper 打印文件导出为任何格式。由于 Jasper 提供了多种形式的导出,因此使用相同的输入,我们可以创建数据的多种表示形式。
后续章节将详细概述上述每个步骤。
JasperReports - 设计
JasperReport 中的 JRXML 模板(或 JRXML 文件)是标准 XML 文件,扩展名为 .jrxml。所有 JRXML 文件都包含标签 <jasperReport> 作为根元素。这又包含许多子元素(所有这些都是可选的)。JasperReport框架可以处理不同类型的数据源。在本教程中,我们将展示如何仅通过将 Java 数据对象集合(使用 Java bean)传递给 JasperReport 引擎来生成基本报告。最终报告应显示人员名单,其类别包括姓名和国家/地区。
本章涵盖以下步骤来描述如何设计 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>
以下是上述报告模板中主要字段的详细信息 -
<queryString> - 这是空的(因为我们通过 Java Bean 传递数据)。通常包含 SQL 语句,用于检索报告结果。
<field name> - 此元素用于将数据源或查询中的数据映射到报告模板中。名称在报告正文中重复使用并且区分大小写。
<fieldDescription> - 此元素将字段名称与 XML 文件中的相应元素进行映射。
<staticText> - 这定义了不依赖于任何数据源、变量、参数或报告表达式的静态文本。
<textFieldExpression> - 这定义了结果字段的外观。
$F{country} - 这是一个变量,包含结果值,标签 <field name> 中的预定义字段。
<band> - 带包含显示在报告中的数据。
报告设计完成后,将其保存在 C:\ 目录中。
预览 XML 报告模板
JasperReports JAR 文件中有一个实用程序net.sf.jasperreports.view.JasperDesignViewer,它有助于预览报表设计,而无需编译或填充它。该实用程序是一个独立的 Java 应用程序,因此可以使用 ANT 执行。
让我们编写一个 ANT 目标viewDesignXML来查看 JRXML。因此,让我们在 C:\tools\jasperreports-5.0.1\test 目录下创建并保存build.xml(应放置在与 JRXML 相同的目录中)。这是 build.xml 文件 -
<?xml version = "1.0" encoding = "UTF-8"?> <project name = "JasperReportTest" default = "viewDesignXML" basedir = "."> <import file = "baseBuild.xml" /> <target name = "viewDesignXML" description = "Design viewer is launched to preview the JXML report design."> <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true"> <arg value = "-XML" /> <arg value = "-F${file.name}.jrxml" /> <classpath refid = "classpath" /> </java> </target> </project>
接下来,让我们打开命令提示符并转到放置 build.xml 的目录。执行命令ant(因为viewDesignXML是默认目标)。输出如下 -
C:\tools\jasperreports-5.0.1\test>ant Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml viewDesignXML: [java] log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory). [java] log4j:WARN Please initialize the log4j system properly.
Log4j 警告可以忽略,并且作为上述执行的结果,将打开一个标有“JasperDesignViewer”的窗口,显示我们的报告模板预览。
正如我们所看到的,仅显示用于获取数据的报表表达式,因为 JasperDesignViewer 无法访问实际的数据源或报表参数。通过关闭窗口或在命令行窗口中按 Ctrl-c 来终止 JasperDesignViewer。
JasperReports - 编译报表设计
我们在上一章中已经生成了JasperReport模板(JRXML文件)。该文件不能直接用于生成报告。它必须编译为 JasperReport 的本机二进制格式,称为Jasper文件。编译时,我们将 JasperDesign 对象转换为 JasperReport 对象 -
接口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.tutorialspoint; 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\tutorialspoint\JasperReportCompile.java中,并在 build.xml 文件中导入baseBuild.xml,如下所示。baseBuild.xml 已经具有编译和运行目标 -
<?xml version = "1.0" encoding = "UTF-8"?> <project name = "JasperReportTest" default = "run" basedir = "."> <import file = "baseBuild.xml"/> </project>
接下来,我们打开命令行窗口并进入build.xml所在的目录。最后,执行命令ant -Dmain-class = com.tutorialspoint.JasperReportCompile为 -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.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.tutorialspoint.JasperReportCompile [java] Compiling Report Design ... [java] log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory). [java] log4j:WARN Please initialize the log4j system properly. [java] Done compiling!!! ... BUILD SUCCESSFUL Total time: 8 seconds
作为上述编译的结果,您将看到模板文件jasper_report_template.jasper在 C:\tools\jasperreports-5.0.1\test 目录中生成。
预览已编译的报告模板
net.sf.jasperreports.view.JasperDesignViewer可用于预览编译的报告模板和 JRXML 模板。
为了更进一步,让我们向上面的 build.xml 文件添加一个新的目标viewDesign ,这将允许我们预览编译后的报告。以下是修订后的 build.xml -
导入文件 - baseBuild.xml 从“环境设置”一章中选取,应放置在与 build.xml 相同的目录中。
<?xml version = "1.0" encoding = "UTF-8"?> <project name = "JasperReportTest" default = "viewDesign" basedir = "."> <import file = "baseBuild.xml" /> <target name = "viewDesign" description="Design viewer is launched to preview the compiled report design."> <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true"> <arg value = "-F${file.name}.jasper" /> <classpath refid = "classpath" /> </java> </target> </project>
让我们在命令提示符处执行命令 - ant(viewDesign 是默认目标)。JasperDesignViewer 窗口打开,显示 Jasper 文件,如下所示 -
通过ANT任务编译
由于报表模板编译更像是设计时作业而不是运行时作业,因此 JasperReport 库有一个自定义 ANT 任务。对于某些情况,当运行时创建 JRXML 文件时,我们无法使用此 ANT 任务。自定义 ANT 任务称为 JRC,由类net.sf.jasperreports.ant.JRantCompileTask实现。它的语法和Behave与内置的<javac> ANT 任务非常相似。
模板编译
让我们将新的目标编译器报告添加到现有的 build.xml 中。此处,使用带有文件集的嵌套 <src> 标记来指定源文件夹。嵌套源标签允许编译分散在许多不同位置且不分组在单个根报告源文件夹下的报告模板。以下是修订后的 build.xml -
<?xml version = "1.0" encoding = "UTF-8"?> <project name = "JasperReportTest" default = "compilereportdesing" basedir = "."> <import file = "baseBuild.xml" /> <target name = "viewDesign" description = "Design viewer is launched to preview the compiled report design."> <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true"> <arg value = "-F${file.name}.jasper" /> <classpath refid = "classpath" /> </java> </target> <target name = "compilereportdesing" description = "Compiles the JXML file and produces the .jasper file."> <taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask"> <classpath refid = "classpath" /> </taskdef> <jrc destdir = "."> <src> <fileset dir = "."> <include name = "*.jrxml" /> </fileset> </src> <classpath refid = "classpath" /> </jrc> </target> </project>
接下来,让我们打开命令提示符并转到放置 build.xml 的目录。执行命令ant(compilereportdesing是默认目标);输出如下 -
C:\tools\jasperreports-5.0.1\test>ant Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml compilereportdesing: [jrc] Compiling 1 report design files. [jrc] log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory). [jrc] log4j:WARN Please initialize the log4j system properly. [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/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() 以编程方式生成的文件相同。我们可以通过执行ant viewDesign来预览这个 jasper 文件。
JasperReports - 填写报告
任何报告工具的主要目的都是生成高质量的文档。报告填写过程帮助报告工具通过操作数据集来实现这一点。
报告填写过程所需的主要输入是 -
报告模板- 这是实际的 JasperReport 文件。
报告参数- 这些基本上是在报告填充时传递给引擎的命名值。我们将在报告参数章节中讨论它们。
数据源- 我们可以从一系列数据源填充 Jasper 文件,例如 SQL 查询、XML 文件、csv 文件、HQL(Hibernate 查询语言)查询、Java Bean 集合等。这将详细讨论在报告数据源章节中。
此过程生成的输出是一个.jrprint文档,可供查看、打印或导出为其他格式。外观类net.sf.jasperreports.engine.JasperFillManager通常用于用数据填充报告模板。此类具有各种填充报告模板的fillReportXXX()方法(模板可以位于磁盘上、从输入流中选取或直接作为内存中提供)。
该外观类中有两类 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 beans)的集合传递给 JasperReport 引擎,以填充此编译后的报告。
编写一个POJO DataBean.java,它代表数据对象(Java bean)。该类定义了两个 String 对象,即“name”和“country”。将其保存到目录C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint。
package com.tutorialspoint; 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\tutorialspoint。
package com.tutorialspoint; 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\tutorialspoint。
package com.tutorialspoint; 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.tutorialspoint.JasperReportFill(executereport是默认目标)如下 -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.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.tutorialspoint.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 - 查看和打印报告
报告填充过程JasperPrint 对象的输出可以使用内置查看器组件查看、打印或导出为更流行的文档格式,如 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 beans)的集合传递给 JasperReports 引擎,以填充此编译后的报告。
编写一个POJO DataBean.java,它代表数据对象(Java bean)。该类定义了两个 String 对象,即“name”和“country”。将其保存到目录C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint。
package com.tutorialspoint; 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\tutorialspoint。
package com.tutorialspoint; 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\tutorialspoint。
package com.tutorialspoint; 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.tutorialspoint.JasperReportFill(viewFillReport 是默认目标)。结果,我们看到一个 JasperViewer 窗口,如下面给出的屏幕所示 -
打印报告
我们可以使用net.sf.jasperreports.engine.JasperPrintManager类打印 JasperReports 库生成的文档(以其专有格式,即JasperPrint对象) 。这是一个依赖于 Java 2 Printing API 的外观类。一旦 JasperReport 文档导出为其他格式(例如 HTML 或 PDF),我们还可以打印文档。
打印生成的报告
以下代码演示了报告的打印。让我们更新现有的 JasperReportFill 类。我们将使用JasperPrintManager.printReport()方法。此方法采用源文件名(这里我们传递 .jrprint文件,该文件是我们在上一步中使用 JasperFillManager.fillReportToFile() 方法生成的)作为第一个参数。第二个参数是用于显示标准打印对话框的布尔值(我们在这里将其设置为true)。
package com.tutorialspoint; 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\tutorialspoint。我们将使用 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.tutorialspoint.JasperReportPrint。结果,出现打印对话框。单击“确定”打印文档。
JasperReports - 导出报告
我们在上一章中已经看到,如何打印和查看 JasperReport 生成的文档。在这里,我们将了解如何将这些报告转换或导出为其他格式,例如 PDF、HTML 和 XLS。提供外观类net.sf.jasperreports.engine.JasperExportManager来实现此功能。导出意味着将JasperPrint对象(.jrprint 文件)转换为不同的格式。
下面的代码(JasperReportExport.java)演示了JasperReport文档的导出过程。JasperExportManager 提供了将报表导出为 PDF、HTML 和 XML 的方法。为了导出为 XLS 格式,我们使用了net.sf.jasperreports.engine.export.JRXls类