报表表达式是JasperReports的强大功能,它允许我们在报表上显示计算数据.计算数据是不是静态数据的数据,不作为报告参数或数据源字段专门传递.报表表达式是通过组合报表参数,字段和静态数据构建的.默认情况下,Java语言用于编写报表表达式. JasperReports编译器支持报表表达式的其他脚本语言,如Groovy脚本语言,JavaScript或BeanShell脚本.
本章将解释你和减去;报表表达式如何工作,假设它们仅使用Java语言编写.在JRXML报告模板中,有几个元素将表达式定义为 :
< variableExpression>
< initialValueExpression>
< groupExpression>
< printWhenExpression>
< ; imageExpression>
< textFieldExpression>
表达式声明
基本上,所有报表表达式都是Java表达式,可以引用报表字段,报表变量和报表参数.
表达式中的字段引用
要在表达式中使用报表字段引用时,字段名称必须放在 $ F {和} 字符序列之间,如下所示 :
$F{Name}
以下是我们现有JRXML文件中的一段代码(报告)设计 :
表达式中的变量引用
要引用表达式中的变量,我们必须将变量的名称放在 $ V {和} ,如下面给出的示例所示 :
"Total height : " + $V{SumOfHeight} + " ft."
表达式中的参数引用
要引用表达式中的参数,参数的名称应放在 $ P {和} ,如下面给出的示例所示 :
"ReportTitle : " + $P{Title}
以下是我们现有JRXML文件中的一段代码,它演示了表达式中参数的引用. (章节报告设计中的JRXML) :
如上所述,参数,字段和变量引用实际上是真正的Java对象.从报表模板中的参数,字段或变量声明中了解它们的类,我们甚至可以在表达式中调用这些对象引用的方法.
以下示例显示 : 如何从java.lang.String报告字段中提取和显示第一个字母"Name" :
$F{Name}.substring(0, 1)
表达式中的资源包参考
要引用表达式中的资源,键应该放在 $ R {和} 之间,如下面给出的示例所示 :
$R{report.title}
根据运行时提供的区域设置和 report.title 键,加载与报告模板关联的资源包.因此,通过从资源包中提取String值来显示报告的标题.有关国际化的更多信息,请参阅国际化一章.
计算器
计算器是JasperReports中的一个实体,它在报告填充时评估表达式并递增变量或数据集.在编译过程中,编译器会生成信息并将其存储在编译报告中.在报告填充期间使用此信息来构建net.sf.jasperreports.engine.fill.JRCalculator类的实例.
Java源文件由Java生成和编译基于报告的编译器.这个生成的类是JRCalculator的子类,通过编译生成的字节码存储在JasperReport对象中.这个bytcode在报告填充时加载,生成的类被实例化以获得表达式评估所需的计算器对象.
条件表达式
JasperReports在定义变量表达式时不支持if-else语句.相反,您可以使用三元运算符 {cond}? {声明1}:{声明2} .此运算符可以嵌套在Java表达式中,以根据多个条件获得所需的输出.
报表中的条件表达式示例
让我们修改现有的报告模板(章报告设计)并为字段国家/地区添加条件表达式.修订后的报告模板(jasper_report_template.jrxml)如下所示.将其保存到C:\tools\jasperreports-5.0.1 \ test目录 :
报告填写的java代码如下.文件 C:\tools\jasperreports-5.0.1\test\src\com\it1352\ JapersReportFill.java 的内容为 :
package com.it1352; 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(); ArrayListdataList = 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\it1352\ DataBean.java 是 :
package com.it1352; 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列表中添加一个国家/地区字段为空的新记录.文件 C:\tools\jasperreports-5.0.1\test\src\com\it1352\DataBeanList.java 的内容为 :
package com.it1352; import java.util.ArrayList;public class DataBeanList { public ArrayListgetDataBeanList() { ArrayList dataBeanList = new ArrayList (); dataBeanList.add(produce("Manisha", "India")); dataBeanList.add(produce("Dennis Ritchie", "USA")); dataBeanList.add(produce("V.Anand", "India")); dataBeanList.add(produce("Shrinath", "California")); dataBeanList.add(produce("Tanmay", "")); 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放在同一目录中.
接下来,让我们打开命令行窗口并转到build.xml所在的目录.最后,执行命令 ant -Dmain-class = com.it1352.JasperReportFill (viewFullReport是默认目标)为 :
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.IT屋.JasperReportFillBuildfile: C:\tools\jasperreports-5.0.1\test\build.xmlclean-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.jrprintcompile: [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\classescompilereportdesing: [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.IT屋.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 SUCCESSFULTotal time: 5 minutes 5 secondsC:\tools\jasperreports-5.0.1\test>
作为上述编译的结果,JasperViewer窗口打开,如下面给出的屏幕所示 :
在这里,我们可以看到,对于最后一条记录,我们没有传递该字段国家的任何数据,"否正在印刷"国家".