JasperReports 文件格式

JasperReports是完全用java开发的,可用于任何java程序。JasperReports方便报表设置,方式灵活。

=============================
术语:
报表设计(report design):XML文件
报表(report):        编译XML文件得到的结果,.jasper文件
=============================

JasperReports组织来源于数据库的数据,数据源在“报表设计”XML文件中定义。“报表设计”先编译生成“报表”之后才能给报表填充数据



报表设计的编译工作是net.sf.jasperreports.engine.JasperManager类的方法compileReport()执行。经过编译后,报表设计可以载入报表设

计对象(net.sf.jasperreports.engine.JasperReport),报表设计对象可序列化存储在硬盘上。当程序要填充数据到报表时,就可以用这些

序列化的对象。实际上,编译报表设计同时也编译报表设计XML文件中定义的java表达式。各种验证工作都是编译时完成(检查报表设计的统一

性)。最后准备填充报表来产生各种报表文件。

填充表报内容,可以用用net.sf.jasperreports.engine.JasperManager类的fillReportXXX()方法,该方法需要一个报表设计对象或者一个表

示报表对象的文件(这些对象是序列化格式),此外还需要JDBC连接,来获得数据填充表报。该方法的结果是一个可打印文档的对象

(net.sf.jasperreports.engine.JasperPrint),可以存储到硬盘上(序列化格式),方便以后使用或者发送给打印机、显示器屏幕或者转化为

PDF,HTML,XLS,CSV,XML格式。

2、报表设计 Report Designs
Report Designs是JasperReports引擎(engine)发送动态内容给打印机、显示器屏幕、web所使用的模板。存储在数据库的数据根据报表设计

来产生要打印的文档。

报表设计用XML文件来定义,他有特殊的格式,这格式在JasperReports引擎提供的DTD文档中声明。这个XML文件被编译后,用来填充数据内容



我们使用下面的XML文件定义一个简单的报表设计:
<?xml version="1.0"?>
<!DOCTYPE jasperReport
   PUBLIC "-//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport name="name_of_the_report" ... >
...
</jasperReport>

3、参数 Parameters

Parameters是参考对象,传给报表填充操作。
Parameters非常有用,传递给报表引擎。例如:可以传递操作人的名字给报表引擎,来动态改变报表的标题。
声明参数:
<parameter name="ReportTitle" class="java.lang.String"/>
<parameter name="MaxOrderID" class="java.lang.Integer"/>
<parameter name="SummaryImage" class="java.awt.Image"/>

有两种可能的方法,在查询中使用参数:
     1. 象java.sql.PreparedStatement parameters 一样使用参数。
     2.有时使用参数来修改SQL查询语句的部分内容或全部内容非常有用,这样语法就有所不同,象下面的例子:
SELECT * FROM Orders ORDER BY $P!{OrderByClause}

有6个系统内建的参数:
   REPORT_PARAMETERS_MAP
   REPORT_CONNECTION
   REPORT_DATA_SOURCE
   REPORT_MAX_COUNT
   REPORT_SCRIPTLET
   REPORT_LOCALE
   REPORT_RESOURCE_BUNDLE

4、数据源 Data Source

JasperReports使用特别的接口JRDataSource来支持多种数据源。这个接口的默认实现类是JRResultSetDataSource,他封装了一个ResultSet对

象,允许通过JDBC来使用任何RDMS。
使用JDBC数据源是,可以传递一个Connection对象给报表填充操作,也可以在报表定义文件中指定一个查询(XML文件中的元素<queryString>

),或者直接提供一个ResultSet创建JRResultSetDataSource实例。

要想使用其他数据源,也不难,只有实现JRDataSource接口就可以。

5、字段 Fields

报表字段描述了在运行时从数据源映射数据到报表的唯一方法。如果表报的数据源是个ResultSet,所有的字段必须映射到ResultSet的相应列

。他们与映射的列有相同的名和兼容的数据类型。

For example:
  
我们要产生一个报表,数据源来源于表Employees,表Employees的结构如下:
  
列名             类型          长度
--------------------------------------
EmployeeID        int              4
LastName          varchar         20
FirstName         varchar         10
HireDate          datetime         8
  
我们可以在报表设计中定义4个字段
<field name="EmployeeID" class="java.lang.Integer"/>
<field name="LastName" class="java.lang.String"/>
<field name="FirstName" class="java.lang.String"/>
<field name="HireDate" class="java.util.Date"/>

如果我们声明了一个和ResultSet列不相应的字段,运行时将会出现异常。不出现在报表设计中的ResultSet中列不会影响填充报表操作,这些

ResultSet列可以被访问。


6、表达式 Expressions
表达式是JasperReports的一个大特征,
使用表达式可以:
用来声明(执行各种运算的)变量,用于报表数据分组,用于指定报表文本域的内容,进一步定制报表对象的外观。

基本上,所有的report expressions都是java表达式,可以参照(reference)报表字段(report fields)和报表变量(report variables)



报表设计的XML有几个元素定义变量:
<variableExpression>, <initialValueExpression>, <groupExpression>, <printWhenExpression>, <imageExpression> and

<textFieldExpression>.

表达式要参照报表字段,字段名必须放在$F{ 和 }之间。

例如:我们在报表上显示一个文本域,他连接两个字段,可以定义一个表达式如下:
<textFieldExpression>
   $F{FirstName} + " " + $F{LastName}
</textFieldExpression>

表达式可以更复杂
<textFieldExpression>
   $F{FirstName} + " " + $F{LastName} + " was hired on " +
   (new SimpleDateFormat("MM/dd/yyyy")).format($F{HireDate}) + "."
</textFieldExpression>

表达式要参照变量,变量名必须放在$V{ 和 }之间。如:
<textFieldExpression>
   "Total quantity : " + $V{QuantitySum} + " kg."
</textFieldExpression>

同样,表达式使用参数,参数名须放在$P{ 和 }之间。如:
<textFieldExpression>
   "Max Order ID is : " + $P{MaxOrderID}
</textFieldExpression>


7、变量 Variables

变量是一个特殊的对象,他建立在表达式上。变量通过声明表达式,可以简化报表设计,这些表达式是经常使用,或运行各种运算。

在变量的表达式里,变量可以参照其他变量,但是这些变量不先定义。
所以变量的定义顺序很重要。

变量可以给表达式执行各种类型的运算,运算可以是:count, sum, average, lowest, highest, variance,等等。

下面的变量执行Quantity字段的sum运算:
<variable name="QuantitySum"
     class="java.lang.Double" calculation="Sum">
   <variableExpression>$F{Quantity}</variableExpression>
</variable>

我们可以指明变量运算重新初始化的等级,默认的等级是Report,这意味着变量在报表开始时被初始化,到报表结束的过程中执行运算操作。

我们可以选择更低的等级来重新初始化变量,page,column,group。

例如,我们要在每页都计算quantity总量,应该声明变量如下:  
<variable name="QuantitySum" class="java.lang.Double"
           resetType="Page" calculation="Sum">
<variableExpression>$F{Quantity}</variableExpression>
<initialValueExpression>new Double(0) </initialValueExpression>
</variable>
在每页的开始,变量将会初始化为0。

下面几个时系统内建的变量,可以直接使用
   PAGE_NUMBER
   COLUMN_NUMBER
   REPORT_COUNT
   PAGE_COUNT
   COLUMN_COUNT
   GroupName_COUNT

8、表报区域 Report Sections

我们构建报表时,需要定义内容和区域布局。
报表设计完整的框架是基于下面的界个区域:
<background>, <title>, <pageHeader>, <columnHeader>, <groupHeader>, <detail>, <groupFooter>, <columnFoter>, <pageFooter>,

<lastPageFooter>, <summary>.

区域是报表的一部分,他有明确的高度和宽度,可以包含直线、矩形、图像和文本域对象。

我们在报表设计XML文件中使用元素标签<band>来定义区域。


下面显示 page header 的声明,他仅仅包含一个线对象和一个静态文本。
   <pageHeader>
   <band height="30">
     <rectangle>
       <reportElement x="0" y="0" width="555" height="25"/>
       <graphicElement/>
     </rectangle>
     <staticText>
       <reportElement x="0" y="0" width="555" height="25"/>
       <textElement textAlignment="Center">
         <font fontName="Helvetica" size="18"/>
       </textElement>
       <text>Northwind Order List</text>
     </staticText>
   </band>
</pageHeader>

9、组 Groups

组提供一种灵活的方法来组织报表数据。在填充报表时,JasperReports engine测试所有已定义的组表达式,来确定是否发生组断裂,并且引

进相应的区域元素<groupFooter>、<groupHeader>标签。

一个报表可以有很多组。组的声明顺序很重要,因为组彼此互相包含。一个组包含随后的组,依此类推。
当最大的组遇到断裂,所有的随后组都被中心初始化。
声明组时,必须声明两个区域:group's header section and the group's footer section。

10、 Fonts and Unicode Support

现在,你可以使用任何语言创建你的报表了。

元素<font>增加一些新属性,允许映射java字体和PDG字体。
PDF使用特殊的字体设置,JasperReports以前的版本没有办法来使用这些PDF字体。

根据这些新属性介绍,用户可以指明PDF可以使用的不同字符集(pdfFontName attribute)、
编码(pdfEncoding attribute)和是否嵌入到PDF文档中(isPdfEmbedded)。

为了化简字体的设置,引入新的元素<reportFont>。
报表字体是报表级的字体定义,作为默认的字体,如果没有其他字体定义时使用默认字体。


11、脚本 Scriptlets
所有在报表显示的数据来源于报表参数、报表字段。
这些数据可以被报表变量和变量的表达式处理。
变量处理时有些特别时刻。
有些变量在报表开始时、页或列出现分栏时、组改变时,根据他的reset类型来初始化。
此外,获得每一新数据(数据源的每一行),变量都会求值。

仅仅简化变量表达式并不能总是实现复杂的功能,于是引入脚本。

脚本是一序列java代码,每次报表事件发生时被执行。同他脚本,用户能够影响报表变量的值。
既然脚本主要用变量来工作,脚本在被执行时的精确瞬间获得完全控制非常重要。
JasperReports根据变量的reset类型:Report, Page, Column or Group。
允许在初始化报表变量前或后,执行自定义java代码。

为了使用这些功能,用户必须创建脚本类,继承net.sf.jasperreports.engine.JRAbstractScriptlet 或

net.sf.jasperreports.engine.JRDefaultScriptlet 。
自定义脚本类名必须在元素<jasperReport>的属性scriptletClass指明。

创建脚本类后,有几个方法需要实现或重载。beforeReportInit(), afterReportInit(), beforePageInit(), afterPageInit(),

beforeGroupInit(), afterGroupInit()等等。
在填充报表时,这些方法在相应的时刻被report engine调用。

有一个默认的报表参数REPORT_SCRIPTLET,他参照脚本对象,这个脚本对象在填充报表时被report engine创建。在报表中可以使用这个参数来

调用脚本对象的自定义方法,来制造所有机制甚至更灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值