报表表达式是JasperReports使我们能够显示在报表上的数据计算的强大功能。计算出数据不是一个静态数据,并且不受特别的报表参数或数据源字段传递的数据。报表表达式是由组合报表参数,字段和静态数据。默认情况下,Java语言是用于编写报表的表达式。其他脚本语言如Groovy脚本语言,JavaScript或BeanShell脚本,报表表达式是由JasperReports编译器支持。
本章将解释如何报表表达式工作假设他们一直只用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文件,这用来表示参数在表达式中引用。
<textField isBlankWhenNull="true" bookmarkLevel="1">
<reportElement x="0" y="10" width="515" height="30"/>
<textElement textAlignment="Center">
<font size="22"/>
</textElement>
<textFieldExpression class="java.lang.String">
<![CDATA[$P{ReportTitle}]]>
</textFieldExpression>
<anchorNameExpression>
<![CDATA["Title"]]>
</anchorNameExpression>
</textField>
<textField isBlankWhenNull="true">
<reportElement x="0" y="40" width="515" height="20"/>
<textElement textAlignment="Center">
<font size="10"/>
</textElement>
<textFieldExpression class="java.lang.String">
<![CDATA[$P{Author}]]>
</textFieldExpression>
</textField>
正如在上面看到,参数,字段和变量引用,其实是真正的Java对象。从参数,字段或在报表模板所作的变量声明知道他们的类,甚至可以在表达式中调用的对象引用的方法。
下面的示例演示如何提取并显示java.lang.String报表字段的第一个字母 "Name":
<textFieldExpression>
$F{Name}.substring(0, 1)
</textFieldExpression>
资源包参考表达
引用在表达式中的资源,关键要$R{和}之间放像下面的例子:
<textfieldexpression>
$R{report.title}
</textfieldexpression>
基于运行时提供的语言环境和report.title键,报表模板相关的资源包加载。因此,报表标题是从资源包中提取字符串值显示。更多关于国际化可以在国际化一章中找到。
计算器
计算器是JasperReports,其计算表达式和增量变量或数据集在报表填充时间的实体。在编译过程中,信息被产生并存储在由编译器在编译报表。在报表,填充时间此信息用于构建net.sf.jasperreports.engine.fill.JRCalculator类的一个实例。
Java源文件生成,并通过对飞基于Java的报表编译器编译。这个生成的类是JRCalculator子类,并通过将其编译产生的字节码存储在JasperReport对象的内部。bytcode被加载在报表填充时间和由此产生的类被实例化,以获得所需的表达式求值计算器对象。
条件表达式
定义变量表达式时,Jasper报表不支持if-else语句。相反,可以使用三元运算符{cond}? {语句1}:{语句2}。可以嵌套这个操作符Java表达式里面获得基于多个条件所需的输出。
在报表条件表达式的示例
让我们修改现有报告的模板(第报表设计),并增加对country条件表达式。修订后的报表模板(jasper_report_template.jrxml)如下。将其保存到 C: oolsjasperreports-5.0.1 est 目录:
<?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"