最近一直在学习struts2,刚做了一个关于使用带参数的报表的例子,参考书籍是李刚老师的《struts2权威指南》。现将我的这个例子整理出来,如下所示:
struts2 中制作带参数的报表,需要使用JasperReports。JasperReports允许在设计报表时使用一个或多个参数,这些参数在填充报表时通过一个Map对象传入。
为了在设计报表时定义参数,应该在报表设计文件中使用 <parameter .../>元素,每个<parameter .../>元素定义一个参数,定义参数所用的格式如下:
<!-- 定义一个名为book3的参数,该参数的类型是字符串 -->
<parameter name="book3" isForPrompting="false" class="java.lang.String"/>
定义了该参数后,就可以在指定报表设计文件的任意地方输出该参数,输出参数使用如下语法格式:
<!-- 在报表中输出参数内容 -->
$P{book1}
提示:大部分时候,我们都很少会直接通过编辑XML文件来定义报表设计文件,更多都是通过iReport来开发报表设计文件。
下面是本应用中所使用的报表设计文件代码:
<?xml version="1.0" encoding="GBK" ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport
name="simpleVariable"
columnCount="1"
printOrder="Vertical"
orientation="Portrait"
pageWidth="595"
pageHeight="842"
columnWidth="535"
columnSpacing="0"
leftMargin="30"
rightMargin="30"
topMargin="20"
bottomMargin="20"
whenNoDataType="NoPages"
isTitleNewPage="false"
isSummaryNewPage="false">
<property name="ireport.scriptlethandling" value="0" />
<property name="ireport.encoding" value="GBK" />
<import value="java.util.*" />
<import value="net.sf.jasperreports.engine.*" />
<import value="net.sf.jasperreports.engine.data.*" />
<!-- 定义一个Style对象,可用于重复定义多个文本内容的格式 -->
<style
name="zh"
isDefault="false"
fontName="隶书"
fontSize="18"
pdfFontName="STSong-Light"
pdfEncoding="UniGB-UCS2-H"
/>
<!-- 定义四个参数,每个参数都是字符串类型。 -->
<parameter name="author" isForPrompting="true" class="java.lang.String"/>
<parameter name="book1" isForPrompting="false" class="java.lang.String"/>
<parameter name="book2" isForPrompting="false" class="java.lang.String"/>
<parameter name="book3" isForPrompting="false" class="java.lang.String"/>
<background>
<band height="0" isSplitAllowed="true" >
</band>
</background>
<title>
<band height="50" isSplitAllowed="true" >
</band>
</title>
<pageHeader>
<band height="50" isSplitAllowed="true" >
</band>
</pageHeader>
<columnHeader>
<band height="39" isSplitAllowed="true" >
<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
<!-- 使用对该文本内容使用名为zh的Style -->
<reportElement
style="zh"
x="203"
y="8"
width="131"
height="27"
key="textField"/>
<box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
<textElement>
<font/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{author}]]></textFieldExpression>
</textField>
<!-- 使用对该文本内容使用名为zh的Style -->
<staticText>
<reportElement
style="zh"
x="137"
y="8"
width="56"
height="27"
key="staticText-1"/>
<box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
<textElement>
<font/>
</textElement>
<text><![CDATA[作者:]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="173" isSplitAllowed="true" >
<rectangle radius="5" >
<reportElement
x="128"
y="8"
width="255"
height="103"
forecolor="#FFFFFF"
backcolor="#99FFFF"
key="rectangle-1"/>
<graphicElement stretchType="NoStretch"/>
</rectangle>
<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
<reportElement
style="zh"
mode="Opaque"
x="137"
y="14"
width="241"
height="28"
backcolor="#FFFFFF"
key="textField"/>
<box topBorder="None" topBorderColor="#FF9900" leftBorder="None" leftBorderColor="#990099" leftPadding="20" rightBorder="None" rightBorderColor="#FF0000" bottomBorder="None" bottomBorderColor="#99FFFF"/>
<textElement>
<font/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{book1}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
<reportElement
style="zh"
x="137"
y="42"
width="241"
height="28"
key="textField"/>
<box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
<textElement>
<font/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{book2}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" >
<reportElement
style="zh"
x="137"
y="70"
width="241"
height="28"
key="textField"/>
<box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
<textElement>
<font/>
</textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$P{book3}]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height="30" isSplitAllowed="true" >
</band>
</columnFooter>
<pageFooter>
<band height="50" isSplitAllowed="true" >
</band>
</pageFooter>
<lastPageFooter>
<band height="50" isSplitAllowed="true" >
</band>
</lastPageFooter>
<summary>
<band height="50" isSplitAllowed="true" >
</band>
</summary>
</jasperReport>
在的报表设计文件中,我们依次定义了四个参数,每个参数的数据类型都是字符串。这四个参数的值会在填充报表时获得,下面是填充报表所使用的程序:
public class MyFill
{
public static void main(String[] args) throws Exception
{
//创建一个Map对象负责为参数传值
Map params = new HashMap();
//依次为报表中的四个参数赋值。
params.put("author" , "李刚");
params.put("book1" , "Spring2.0宝典");
params.put("book2" , "轻量级J2EE企业应用实战");
params.put("book3" , "基于J2EE的Ajax宝典");
//填充时,即使无需使用数据源。
//也必须指定一个新建的JREmptyDataSource实例,而不能直接使用null
JasperFillManager.fillReportToFile("simpleVariable.jasper" , params , new JREmptyDataSource());
System.out.println("成功填充了一个报表文件(*.jrprint)");
System.exit(0);
}
}
在上面代码中填充报表时,使用了一个Map对象作为参数,这个Map对象负责为报表参数传值,因此这个Map对象的key就是报表设计文件中的参数名,各key对应的value就是报表设计文件中的对应的参数值。
提示:上面填充报表时直接使用了simpleVariable.jasper文件作为源文件,这当然是因为我们已经完成了编译过程。因为将*.jrxml文件编译成一个*.jasper文件与前面使用静态报表的过程大致相似,故此处不再赘述。
经过填充后生成了一个simpleVariable.jrprint文件,使用JasperExportManager可以将该文件导出成一个PDF文档,当然也可以导出成其他格式的文档,导出的Java文件与前面倒出静态JasperReports报表的Java文件没有任何区别。