报表表达式是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:\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=