JasperReports+iReport在eclipse中的使用


一、介绍

1)它可以PDF,HTML,XML等多种形式产生报表或动态报表,在新版本还支持CSV,XLS,RTF等格式的报表;
2)它按预定义的XML文档来组织数据,来源多(如:关系数据库,Java容器对象(collection,arrays)等);
报表的填充过程:
先产生报表设计对象->序列化该对象->存储在磁盘或网络->产生XML文件(表格数据)。
表单的设计过程就是用定义于XML文件中的Java表达式来实现报表的设计。
3)它带数据一致性验证;
4)报表引擎必须先接受数据(通过参数等多种形式)来产生报表,更多的是来自数据源,引擎直接接收用于填充表格的数据源对象,或者通过自身提供的JDBC连接对象来处理数据库的数据;
5)报表最终要产生一个新的对象来进行填充操作,从而产生打印文档对象,这也是存储在磁盘或网络传输介质的序列化对象;
6)内置浏览器能直接查看结果,以PDF,HTML,XML导出;
7)重要的类:
net.sf.jasperreports.engine.design.JasperDesign
其实例是用于报表产生的原始类;
net.sf.jasperreports.engine.design.JasperReport
表现了报表设计对象,是作为报表的编译过程的结果而被实例化,是向报表中填充数据的准备。

二、结构

JasperReports用XML文件来定义,约定用jrxml作为文件的后缀名。

1)主要元素:

 根元素
<span style="color: rgba(0, 0, 0, 1)"> 报表的标题
</span><pageHeader><span style="color: rgba(0, 0, 0, 1)"> 页眉
</span><detail><span style="color: rgba(0, 0, 0, 1)"> 正文
</span><pageFooter><span style="color: rgba(0, 0, 0, 1)"> 页脚
</span><band> 定义报表部件,以上所有元素都包含一个band元素作为其唯一子元素。</span></pre>

<p style="margin-left: 30px; text-align: left"><span style="font-family: 仿宋; font-size: 15px">除了根元素,其余元素是可选的。</span></p>
<p style="margin-left: 30px; text-align: left"><span style="font-family: 仿宋; font-size: 15px">2)其编辑工具iReport在Eclipse3.2下的安装过程</span></p>
<p style="margin-left: 30px; text-align: left"><span style="font-family: 仿宋; font-size: 15px">菜单“帮助”->“软件更新”->“查找并安装”->“搜索要安装的新功能部件”--(下一步)-->“新建远程站点”,输入以下内容:<br>名称:JasperForge<br>URL:http://www.jasperforge.org/update<br>--(确定)-->“下一步”-->直至完成。</span></p>
<p style="margin-left: 30px; text-align: left"><span style="font-family: 仿宋; font-size: 15px">3)以JasperReports1.3.0版本为例,一个JasperReports项目需要如下jar包:</span></p>
<table style="height: 200px; width: 664px; margin-left: 30px" border="0">
<tbody>
<tr>
<td style="margin-left: 60px"><span style="font-family: 仿宋; font-size: 14px">包名</span></td>
<td><span style="font-family: 仿宋; font-size: 14px">说明</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋; font-size: 14px">xml-apis.jar</span></td>
<td><span style="font-family: 仿宋; font-size: 14px">XML parser API</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋; font-size: 14px">jasperreports-1.3.0.jar</span></td>
<td><span style="font-family: 仿宋; font-size: 14px">JasperReports API</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋; font-size: 14px">commons-beanutils-1.7.jar </span></td>
<td><span style="font-family: 仿宋; font-size: 14px"> JavaBeans Utility classes</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋; font-size: 14px">commons-collections-2.1.jar</span></td>
<td><span style="font-family: 仿宋; font-size: 14px">Collections framework extension classes</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋; font-size: 14px">commons-digester-1.7.jar </span></td>
<td><span style="font-family: 仿宋; font-size: 14px">classes for processing XML documents</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋; font-size: 14px">commons-logging-1.0.2.jar </span></td>
<td><span style="font-family: 仿宋; font-size: 14px">Logging classes</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋; font-size: 14px">poi-2.0-final-20040126.jar </span></td>
<td><span style="font-family: 仿宋; font-size: 14px"> Jarkarta POI API to generate an Excel Document</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋; font-size: 14px">itext-1.3.1.jar  </span></td>
<td><span style="font-family: 仿宋; font-size: 14px">PDF library</span></td>

</tr>

</tbody>

</table>
<h1><span style="font-family: 仿宋; font-size: 15px">三、iReport介绍</span></h1>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">1)iReport是为JasperReports设计的强大的,直观的,易于使用的可视化报表设计器,为win32平台编写。允许用户可视化地编辑XML JasperDesign文件,可以和其它数据库进行JDBC通信。</span><br><span style="font-family: 仿宋; font-size: 15px">再设计模板时可以以HTML,PDF,XML方式预览,用它生成的文件有.jrxml和.jasper两种文件。</span><br><span style="font-family: 仿宋; font-size: 15px">.jrxml:是可视化编辑的xml文件;</span><br><span style="font-family: 仿宋; font-size: 15px">.jasper:经编译后生成的类文件,即报表模板文件。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">2)iReport的输出格式</span><br><span style="font-family: 仿宋; font-size: 15px">其预览输出格式有:PDF,HTML,CSV。JAVA2D,EXCEL,纯文本,JRView。</span><br><span style="font-family: 仿宋; font-size: 15px">注意:JRViewer是直接以C/S方式作为报表的输出格式,在JFrame框架下输出。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">3)报表的动态对象变量、参数、字段</span><br><span style="font-family: 仿宋; font-size: 15px">字段Fields:是从数据库抽取出来的,在报表中出现的数据库内容。$F</span><br><span style="font-family: 仿宋; font-size: 15px">参数Parameters:你写的应用需要提供给报表的入口。 $P</span><br><span style="font-family: 仿宋; font-size: 15px">变量Variables:报表中一些逻辑运算的表现。 $V</span><br><span style="font-family: 仿宋; font-size: 15px">每个对象的定义格式如下: $V{variablesName}</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">4)运行时需要.jasper文件;编译:把.jrxml->.jasper文件。</span><br><span style="font-family: 仿宋; font-size: 15px">静态运行:静态文本来运行,和数据源无关;</span><br><span style="font-family: 仿宋; font-size: 15px">动态运行:带数据源运行。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">5)报表的结构</span><br><span style="font-family: 仿宋; font-size: 15px">title、pageHeader、columnHeader、detail、columnFooter、pageFooter、summary、groupHeader、groupfooter。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">6)在iReport中创建数据库连接</span><br><span style="font-family: 仿宋; font-size: 15px">(1)菜单DourceSource -> Connections/DataSources -> ...new -></span><br><span style="font-family: 仿宋; font-size: 15px">(2)菜单Build -> Set active connection -> 选择 -> ... -> OK</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">7)在iReport中创建文件</span><br><span style="font-family: 仿宋; font-size: 15px">iReport工具是一个可视编辑器帮助创建JasperReports文件。JasperReports是一个基于Java报表的引擎。</span><br><span style="font-family: 仿宋; font-size: 15px">当你在iReport中创建一个报表,你实际上是对配置文件进行操作,告诉JasperReports应该怎样建立Report。</span><br><span style="font-family: 仿宋; font-size: 15px">三种文件:</span><br><span style="font-family: 仿宋; font-size: 15px">.jasper文件:编译的二进制文件;</span><br><span style="font-family: 仿宋; font-size: 15px">.jrxml文件:报表的配置文件;</span><br><span style="font-family: 仿宋; font-size: 15px">.pdf文件:生成的pdf文件。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">8)报表格式化</span><br><span style="font-family: 仿宋; font-size: 15px">在iReport上选择报表的一个区域,将呈现蓝色高亮显示;</span><br><span style="font-family: 仿宋; font-size: 15px">可用鼠标拖曳来改变区域的尺寸,当误操作时,用undo来恢复;</span><br><span style="font-family: 仿宋; font-size: 15px">如选择框变红,则有错误,report将不能编译;</span><br><span style="font-family: 仿宋; font-size: 15px">改变字体或调整尺寸,菜单“View”->“Element properties”->分三个选择:</span><br><span style="font-family: 仿宋; font-size: 15px">(1)Common选择:尺寸,前景色/背景色,透明度,打印条件,位置属性等;</span><br><span style="font-family: 仿宋; font-size: 15px">(2)Font选择:字体、大小、类型,PDF字体,加粗,斜体,下划线,水平位置,垂直位置,PDF编码。</span><br><span style="font-family: 仿宋; font-size: 15px">注意:两种字体:</span><br><span style="font-family: 仿宋; font-size: 15px">     Font Name:将显示在iReport设计器和JasperReports运行中;</span><br><span style="font-family: 仿宋; font-size: 15px">     PDF font Name:将显示在编译后的PDF文件中。</span><br><span style="font-family: 仿宋; font-size: 15px">(3)Static Text:静态文本。</span><br><span style="font-family: 仿宋; font-size: 15px">想浏览元素时,看“View”->“Elements browser”;</span><br><span style="font-family: 仿宋; font-size: 15px">一次选择多个域,按“shift”键再用鼠标点击;</span><br><span style="font-family: 仿宋; font-size: 15px">菜单“View”->“Report Properties”报表属性:</span><br><span style="font-family: 仿宋; font-size: 15px">报表尺寸,单位,页边距,报表名,纵向Portrait/横向Landscape,列宽,Spacing,标题作为新页,Summary作为新页,XML编码(UTF-8)。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">9)使用Groups</span><br><span style="font-family: 仿宋; font-size: 15px">菜单“View”->“Report query” 可以查询和修改SQL语句。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">10)为report增加参数</span><br><span style="font-family: 仿宋; font-size: 15px">(1)菜单“View”->“Report Query”,修改SQL语句,如:加上 WHERE LAST_NAME=$P{LAST_NAME}</span><br><span style="font-family: 仿宋; font-size: 15px">注意:参数用$P{}来封装。</span><br><span style="font-family: 仿宋; font-size: 15px">(2)定义参数</span><br><span style="font-family: 仿宋; font-size: 15px">菜单“View”->“Reports Parameters”</span><br><span style="font-family: 仿宋; font-size: 15px">新建参数,如参数名为“LAST_NAME”,再指定参数的类型(如:String)</span><br><span style="font-family: 仿宋; font-size: 15px">还可设定“缺省值”和参数的“描述”</span><br><span style="font-family: 仿宋; font-size: 15px">运行报表(缺省),还可以传递参数方式:http://server/showReport?LAST_NAME=smith</span><br><span style="font-family: 仿宋; font-size: 15px">菜单“Build”->“Execute report(using active conn.)”</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">11)创建子报表</span><br><span style="font-family: 仿宋; font-size: 15px">例子:一个报表包含另一个报表</span><br><span style="font-family: 仿宋; font-size: 15px">(1)建立两个报表;</span><br><span style="font-family: 仿宋; font-size: 15px">(2)扩展master报表,增加一个subreport元素;</span><br><span style="font-family: 仿宋; font-size: 15px">(3)双击subreport元素,设置其属性。在Subreport(other)栏中,</span><br><span style="font-family: 仿宋; font-size: 15px">Subreport Expression填入“c:\test2.jasper”(第二个表即子表的文件名),点击“Add”,增加/修改:“Subreport parameter name”和Default value expression值;(COUNTRY     $F{COUNTRY})</span><br><span style="font-family: 仿宋; font-size: 15px">(4)对子表“Report query”->添加''where COUNTRY=${COUNTRY}''</span><br><span style="font-family: 仿宋; font-size: 15px">(5)增加“Report parameters”,(COUNTRY,java.lang.String)</span><br><span style="font-family: 仿宋; font-size: 15px">(6)编译detail report;</span><br><span style="font-family: 仿宋; font-size: 15px">(7)运行master report。</span></p>
<h1 style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">iReport支持Groovy脚本语言,可无需懂Java。</span></h1>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">1、配置XML文件</span><br><span style="font-family: 仿宋; font-size: 15px">jasperreports的XML配置文件局域jasperreport.dtd文件而来。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">1)根元素jasperReport</span><br><span style="font-family: 仿宋; font-size: 15px">其子元素有:报告的字体reportFont,参数parameter,查询字符串queryString,字段field,变量variable,组group,标题title,页眉pageHeader,列眉columnHeader,表明细detail,列脚columnFooter,页脚pageFooter。</span><br><span style="font-family: 仿宋; font-size: 15px">属性有:列宽columnWidth,列间距columnSpacing,左边距leftMargin,顶边距topMargin,底边距bottomMargin。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">2)报表层字体含义reportFonts</span><br><span style="font-family: 仿宋; font-size: 15px">无子元素;</span><br><span style="font-family: 仿宋; font-size: 15px">属性有:名字name,是否缺省isFault,字体名fontName,字体大小size,是否粗体isBold,是否斜体isItalic,是否带下划线isUnderline,isStrikeThrough,PDF字体名pdfFontName,PDF编码pdfEncoding,是否嵌入PDF(isPdfEmbedded)。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">3)用于产生报表的对象参数parameter。引用P${name}</span><br><span style="font-family: 仿宋; font-size: 15px">其子元素有:ParameterDescription,defaultValueExpression</span><br><span style="font-family: 仿宋; font-size: 15px">属性有:name,class</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">4)从数据库检索数据的查询SQL语句 queryString</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">5)包含于report中的数据库表列字段 field。 引用F${name}</span><br><span style="font-family: 仿宋; font-size: 15px">其子元素有:variableExpression,initialValueExpression</span><br><span style="font-family: 仿宋; font-size: 15px">属性有:name,class</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">6)用在XML文件中的变量 Variable   引用V${name}</span><br><span style="font-family: 仿宋; font-size: 15px">其子元素有:variableExpression,initialValueExpression</span><br><span style="font-family: 仿宋; font-size: 15px">属性有:name,class</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">7)报表标题 title</span><br><span style="font-family: 仿宋; font-size: 15px">其子元素有:band</span><br><span style="font-family: 仿宋; font-size: 15px">无属性</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">8)页眉 pageHeader</span><br><span style="font-family: 仿宋; font-size: 15px">其子元素有:band</span><br><span style="font-family: 仿宋; font-size: 15px">无属性</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">9)报表的列名 columnHeader</span><br><span style="font-family: 仿宋; font-size: 15px">其子元素有:band</span><br><span style="font-family: 仿宋; font-size: 15px">无属性</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">10)指定的列值detail</span><br><span style="font-family: 仿宋; font-size: 15px">其子元素有:band</span><br><span style="font-family: 仿宋; font-size: 15px">无属性</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">11)列尾columnFooter</span><br><span style="font-family: 仿宋; font-size: 15px">其子元素有:band</span><br><span style="font-family: 仿宋; font-size: 15px">无属性</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">12)页脚pageFooter</span><br><span style="font-family: 仿宋; font-size: 15px">其子元素有:band</span><br><span style="font-family: 仿宋; font-size: 15px">无属性</span><br><span style="font-family: 仿宋; font-size: 15px">注:在report中,一个band表示一个report节点。一个band元素包括:staticText(静态文本)和textElement(文本元素)两个元素。</span><br><span style="font-family: 仿宋; font-size: 15px">常见报表模型:列表、分组、主从、嵌套、交叉、图形、套打、分栏、填报。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">2、创建报表</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">1)建立输入源</span><br><span style="font-family: 仿宋; font-size: 15px">InputStream input = new FileInputStream(new File("c:\\JasperReports\\catalog.xml"));</span><br><span style="font-family: 仿宋; font-size: 15px">JasperDesign design=JRXmlLoader.load(Input);</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">2)创建对象</span><br><span style="font-family: 仿宋; font-size: 15px">JasperReport report = JasperCompileManager.compileReport(design);</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">3)获得JDBC连接从数据库检索数据</span><br><span style="font-family: 仿宋; font-size: 15px">InitialContext initialContext = new InitialContext();</span><br><span style="font-family: 仿宋; font-size: 15px">DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/OracleDBConnectionDS");</span><br><span style="font-family: 仿宋; font-size: 15px">Connection conn = ds.getConnection();</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">4)产生可预览、打印、输出为其它格式的JasperPrint文件</span><br><span style="font-family: 仿宋; font-size: 15px">JasperPrint print = JasperFillManager.fillReport(report, parameters, conn);</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">5)参数处理</span><br><span style="font-family: 仿宋; font-size: 15px">Map parameters = new HashMap();</span><br><span style="font-family: 仿宋; font-size: 15px">parameters.put("ReportTitle", "PDF JasperReport");</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">6)输出成XML,PDF,HTML,CSV,XLS(Excel)的任一种文件。</span><br><span style="font-family: 仿宋; font-size: 15px">OutputStream output = new FileOutputStream(new File("c:/JasperReports/catalog.pdf"))</span><br><span style="font-family: 仿宋; font-size: 15px">JasperExportManager.exportReportToPdfStream(print,output);</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">3、JasperReports的安装配置</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">1)JDK的安装,注意JAVA_HOME环境变量;</span><br><span style="font-family: 仿宋; font-size: 15px">2)要支持中文,需itext-1.3.1.jar和iTextAsian.jar包,加入CLASSPATH环境变量中;</span><br><span style="font-family: 仿宋; font-size: 15px">3)安装iReport,用iReport-1.3.0-windows-installer.exe安装;</span><br><span style="font-family: 仿宋; font-size: 15px">4)JasperReport不需任何配置,将其jar包(jasperreports-1.3.0.jar)放入CLASSPATH;</span><br><span style="font-family: 仿宋; font-size: 15px">5)数据库的JDBC驱动包,例如Sybase的驱动包为jconn6.jar,加入到CLASSPATH。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">4、iReport的安装配置</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">iReport如果不用其安装文件iReport-1.3.0-windows-installer.exe安装,则需要配置。</span><br><span style="font-family: 仿宋; font-size: 15px">iReport需Sun公司的JDK下的tools.jar,需拷贝到iReport的lib目录下。</span><br><span style="font-family: 仿宋; font-size: 15px">iReport初始化配置的组成:</span><br><span style="font-family: 仿宋; font-size: 15px">(1)建立报表;</span><br><span style="font-family: 仿宋; font-size: 15px">(2)选择语言;</span><br><span style="font-family: 仿宋; font-size: 15px">(3)加入到CLASSPATH。</span></p>
<h1 style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">四、Report Structure 报告的结构</span></h1>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">本章描述报告的结构,可用的report对象和它们的属性。这基本上是JasperReports的快速参考。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">1、Expressions 表达式</span><br><span style="font-family: 仿宋; font-size: 15px">表达式是JasperReports的核心特征。它是一个重要的机制,允许操纵和显示报告数据,执行各种计算,自定义报告的外观和报告对象的可视性。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">1)一个典型的表达式</span><br><span style="font-family: 仿宋; font-size: 15px">$F{LastName} + " " + $F{LastName}</span><br><span style="font-family: 仿宋; font-size: 15px">一个JasperReports的表达式是以Java表达式为基础的,再加上一些附加的语法,它允许引用参数、变量和字段等。</span><br><span style="font-family: 仿宋; font-size: 15px">比如说要引用一个名叫DATA的参数时,语法应为$P{PARAM_NAME}。</span><br><span style="font-family: 仿宋; font-size: 15px">对变量和字段来说,其引用语法分别为$V{VAR_NAME}和$F{FIELD_NAME}。</span><br><span style="font-family: 仿宋; font-size: 15px">注意:在JasperReports的groovy脚本语言中,也同样可以用$F,$P,$V引用参数、变量和字段。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">2)表达式的语法</span><br><span style="font-family: 仿宋; font-size: 15px">(1)$F{FIELD}   引用名为FIELD的字段;</span><br><span style="font-family: 仿宋; font-size: 15px">(2)$V{VAR}     引用名为VAR的变量;</span><br><span style="font-family: 仿宋; font-size: 15px">(3)$P{PARAM}   引用名为PARAM的参数;</span><br><span style="font-family: 仿宋; font-size: 15px">(4)$P!{PARAM} 引用名为PARAM的参数;这个特殊的语法仅能用于report的查询中。它允许插入参数的内容到查询字符串中。例如,它能被用于创建一个带通过参数来指定WHERE条件的动态查询。</span><br><span style="font-family: 仿宋; font-size: 15px">$R{keyName}      在resource bundle中检索带keyName关键字的字符串。</span><br><span style="font-family: 仿宋; font-size: 15px">注意:表达式是用Java或Groovy写成的,这意外着可以用Java强大的功能,如调用方法,允许构建无限复杂的表达式。还要注意,表达式的结果总是一个对象。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">3)更多的表达式</span><br><span style="font-family: 仿宋; font-size: 15px">(1)new Integer(Math.max($V{Price1},$V{Price2}))</span><br><span style="font-family: 仿宋; font-size: 15px">(2)(new SimpleDateFormat("dd/MM/yyyy")).format($F{OrderDate})</span><br><span style="font-family: 仿宋; font-size: 15px">(3)$F{SpecialOffer}.booleanValue()? $F{SpecialPrice} : $F{Price}</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">2、内建的函数</span><br><span style="font-family: 仿宋; font-size: 15px">JasperReports提供了一套内建的函数用于report表达式中。这些函数尽管是内建的工具,还是可以在普通操作中执行它。</span><br><span style="font-family: 仿宋; font-size: 15px">注意:目前这套函数很有限,在未来会得到扩展。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">1)例:使用内建函数</span><br><span style="font-family: 仿宋; font-size: 15px">msg("Total cost is {0}", $F{TOTAL})</span><br><span style="font-family: 仿宋; font-size: 15px">msg("Matched {0} products out of {1}", $F{MATCHED}, $P{TOTAL})</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">2)内建的函数</span><br><span style="font-family: 仿宋; font-size: 15px">(1)String str(String key);</span><br><span style="font-family: 仿宋; font-size: 15px">从和report相联系的resource bundle中得到给出的key的一个字符串。这个函数的功能和使用$R{key}语法等价。</span><br><span style="font-family: 仿宋; font-size: 15px">(2)String msg(String pattern, Object arg0);</span><br><span style="font-family: 仿宋; font-size: 15px">建立一个带给定的pattern和给定参数来指定其格式的java.util.MessageFormat对象。</span><br><span style="font-family: 仿宋; font-size: 15px">(3)String msg(String pattern, Object arg0, Object arg1);</span><br><span style="font-family: 仿宋; font-size: 15px">同上;</span><br><span style="font-family: 仿宋; font-size: 15px">(4)String msg(String pattern, Object arg0, Object arg1, Object arg2);</span><br><span style="font-family: 仿宋; font-size: 15px">同上。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">3、Report 报告</span><br><span style="font-family: 仿宋; font-size: 15px">Report是表现为报告模板的根对象。在报告执行期间,report模板和数据组合成最终的文档。</span><br><span style="font-family: 仿宋; font-size: 15px">报告的属性有:</span><br><span style="font-family: 仿宋; font-size: 15px">(1)Report Name 报告名;</span><br><span style="font-family: 仿宋; font-size: 15px">(2)Units 报告的单位;有:像素Pixels,毫米Millimeters,厘米Centimeters和英寸Inches。</span><br><span style="font-family: 仿宋; font-size: 15px">(3)Language 报告表达式使用的语言;目前有Java和Groovy两种。</span><br><span style="font-family: 仿宋; font-size: 15px">(4)Orientation 页的方向;其可能值为水平Protrait和纵向Landscape。</span><br><span style="font-family: 仿宋; font-size: 15px">(5)Page Width 以报告单位指定的页宽;</span><br><span style="font-family: 仿宋; font-size: 15px">(6)Page Height 以报告单位指定的页高;</span><br><span style="font-family: 仿宋; font-size: 15px">(7)Page Size 报告的尺寸,即为page width和page height。</span><br><span style="font-family: 仿宋; font-size: 15px">(8)Left Margin 以报告单位指定的左边页边距;</span><br><span style="font-family: 仿宋; font-size: 15px">(9)Right Margin 以报告单位指定的右边页边距;</span><br><span style="font-family: 仿宋; font-size: 15px">(10)Top Margin 以报告单位指定的顶部页边距;</span><br><span style="font-family: 仿宋; font-size: 15px">(11)Bottom Margin 以报告单位指定的底部页边距;</span><br><span style="font-family: 仿宋; font-size: 15px">(12)Column Count 报告中的列数;</span><br><span style="font-family: 仿宋; font-size: 15px">(13)Column Spacing 以报告单位指定的列边距;</span><br><span style="font-family: 仿宋; font-size: 15px">(14)Column Width 以报告单位指定的列宽;</span><br><span style="font-family: 仿宋; font-size: 15px">(15)Print Order 填充列的顺序;有垂直Vertical和水平Horizontal两种。</span><br><span style="font-family: 仿宋; font-size: 15px">(16)Float Column Footer 浮动列脚,指出是否在列底部或明细表最后或组脚进行打印;</span><br><span style="font-family: 仿宋; font-size: 15px">(17)Default Font 缺省字体;</span><br><span style="font-family: 仿宋; font-size: 15px">(18)Default Style 缺省风格;</span><br><span style="font-family: 仿宋; font-size: 15px">(19)Scriptlet Class 脚本类,它必须是JRAbstractScriptlet类的子类。如果省略,将创建一个JRDefaultScriptlet的实例。</span><br><span style="font-family: 仿宋; font-size: 15px">(20)Summary New Page 新页的概要;</span><br><span style="font-family: 仿宋; font-size: 15px">(21)Title New Page 新页的标题;</span><br><span style="font-family: 仿宋; font-size: 15px">(22)When No Data Print 无数据时的打印,有三个选择:No Pages 表示0页;Blank Page 空白页;All Sections No Detail 除了detail section,其它的都打印。</span><br><span style="font-family: 仿宋; font-size: 15px">(23)Query 查询,用来检索数据到报告中。</span><br><span style="font-family: 仿宋; font-size: 15px">(24)Query Language 查询语言,有五个值:SQL 用于JDBC数据源的查询语言;HBM Hibernate用于Hibernate数据源的查询语言;XPath 用于XML数据源的查询语言;EJBQL用于支持Java持久层(Persistence)API的数据源的查询语言;MDX 用于Mondrian数据源的查询语言。</span><br><span style="font-family: 仿宋; font-size: 15px">(25)Imports java输入的列表,例如:java.util.*和java.text.SimpleDateFormat格式。用于简化report的表达式。</span><br><span style="font-family: 仿宋; font-size: 15px">(26)Resource Bundle 为report提供了本地的系列字符串。在报告中,本地字符串能用$R{key}引用。</span><br><span style="font-family: 仿宋; font-size: 15px">(27)When Resource Missing Print 允许自定义引擎在resource bundle中处理丢失的resource。有4种选择:Null 丢失的resource不打印;Empty 丢失的resource为空;Key 用$R{key}指定的key来打印; Error 用错误来中断报告的执行。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">4、Styles 风格</span><br><span style="font-family: 仿宋; font-size: 15px">一个report可以定义大量的风格。一旦定义了,它们能和report对象联系起来,为了给各种可视视图提供基本的配置。report允许用模块化的方式来定义模块的风格。</span><br><span style="font-family: 仿宋; font-size: 15px">风格有相关联的条件风格。条件风格允许当其表达式为真时改变风格。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">1)风格的属性有:</span><br><span style="font-family: 仿宋; font-size: 15px">(1)Name 风格名;</span><br><span style="font-family: 仿宋; font-size: 15px">(2)Parent Style 父风格;</span><br><span style="font-family: 仿宋; font-size: 15px">(3)Foreground 前景色;</span><br><span style="font-family: 仿宋; font-size: 15px">(4)Background 背景色;</span><br><span style="font-family: 仿宋; font-size: 15px">(5)Mode 方式,决定是否带透明度;</span><br><span style="font-family: 仿宋; font-size: 15px">(6)Pen 画笔 有6种选择:None 无线;1 Point 正常宽度的线;2 Point 中等宽度的线;4 Point 粗线;Dotted 虚线;Thin 细线。</span><br><span style="font-family: 仿宋; font-size: 15px">(7)Fill 填充;决定对对象进行填充的模式;</span><br><span style="font-family: 仿宋; font-size: 15px">(8)Box 指定盒子的属性,如边框类型,边框颜色,是否填充。</span><br><span style="font-family: 仿宋; font-size: 15px">(9)Horizontal Alignment 水平排列;有3种选择:Left 左;Center 中;Right 右。</span><br><span style="font-family: 仿宋; font-size: 15px">(10)Vertical Alignment 垂直排列;有3种选择:Top 顶;Middle 中;Bottom 底。</span><br><span style="font-family: 仿宋; font-size: 15px">(11)Scale 比例;指定图像的比例,有3种选择:Clip 尺寸不适合时,多余部分省略;Fill Frame 图像按比例填充进Image对象中;Retain Shape 保留原形状进行填充。</span><br><span style="font-family: 仿宋; font-size: 15px">(12)Radius 指定矩形边框倒角的弧度;</span><br><span style="font-family: 仿宋; font-size: 15px">(13)Pattern 用Text Field表达式的值来指定样式;其日期类型的值用java.text.SimpleDataFormat类来定义;其数值型的值用java.text.DecimalFormat来定义。</span><br><span style="font-family: 仿宋; font-size: 15px">(14)Blank When Null 当Text Field表达式的值为null时显示空白;</span><br><span style="font-family: 仿宋; font-size: 15px">(15)Line Spacing 线距;有3种选择:Single:单倍线距;1 and 1/2:1.5倍线距;Double:双倍线距。</span><br><span style="font-family: 仿宋; font-size: 15px">(16)Rotation 旋转;有3种选择:None 不旋转;Left 左旋180度;Right 右旋180度。</span><br><span style="font-family: 仿宋; font-size: 15px">(17)Styled Text 是一个标志位,用来指定是否text对象包含了已定义风格或规则的text。</span><br><span style="font-family: 仿宋; font-size: 15px">(18)Font Name 字体名;</span><br><span style="font-family: 仿宋; font-size: 15px">(19)Font Size 字体的尺寸;</span><br><span style="font-family: 仿宋; font-size: 15px">(20)Bold 粗体;</span><br><span style="font-family: 仿宋; font-size: 15px">(21)Italic 斜体;</span><br><span style="font-family: 仿宋; font-size: 15px">(22)Underline 下划线;</span><br><span style="font-family: 仿宋; font-size: 15px">(23)Strike Through 通过标准位来取消;</span><br><span style="font-family: 仿宋; font-size: 15px">(24)PDF Font Name:PDF字体名;</span><br><span style="font-family: 仿宋; font-size: 15px">(25)PDF Encoding:PDF编码;</span><br><span style="font-family: 仿宋; font-size: 15px">(26)PDF Embedded是一个标志位,指定是否PDF字体应该嵌入到文档中。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">2)条件风格的属性:</span><br><span style="font-family: 仿宋; font-size: 15px">和上面仅有一点点的不同。其不同的属性为:</span><br><span style="font-family: 仿宋; font-size: 15px">Condition Expression 条件表达式;是一个布尔型的表达式,用于判断是否应用条件表达式。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">5、Section Properties 节属性</span><br><span style="font-family: 仿宋; font-size: 15px">Section的种类前面已经讲了,这里只是补充讲述它的属性:</span><br><span style="font-family: 仿宋; font-size: 15px">(1)Height 以报告的单位指定的section的高度;</span><br><span style="font-family: 仿宋; font-size: 15px">(2)Print When Expression 是一个布尔表达式,决定是否打印本Section;</span><br><span style="font-family: 仿宋; font-size: 15px">(3)Split Allowed 一个标志位,指示当Section超过当前页面的尺寸时,是否允许分割它。如果为真,当前Section将迁移到下一页。注意:如果Section在下一页也不适合时,则不管标志位值如何,都会分割它。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">6、Groups 组</span><br><span style="font-family: 仿宋; font-size: 15px">一个report可以定义大量的组。组表示决定带相关数据的可视组的表达式名。一旦声明后,组能在报告任意地方使用。</span><br><span style="font-family: 仿宋; font-size: 15px">一个数据组用一个表达式组来识别。</span><br><span style="font-family: 仿宋; font-size: 15px">注意:组机制不能完成来自于数据源数据的任何排序。如果想要有序的数据,必须把数据源的数据进行先排序处理。</span><br><span style="font-family: 仿宋; font-size: 15px">组属性:</span><br><span style="font-family: 仿宋; font-size: 15px">(1)Name 组名;用于引用组。</span><br><span style="font-family: 仿宋; font-size: 15px">(2)Expression 表达式;决定report数据的组;</span><br><span style="font-family: 仿宋; font-size: 15px">(3)Min Height To Start New Page 开始新页的最小高度;</span><br><span style="font-family: 仿宋; font-size: 15px">(4)Reprint Header On Each Page 一个标志位,指示在每一页的开始处是否重新打印组头;</span><br><span style="font-family: 仿宋; font-size: 15px">(5)Reset Page Number 重设页数,一个标志位;在组头在新页开始处打印时,是否重新设置页数;</span><br><span style="font-family: 仿宋; font-size: 15px">(6)Start New Column 一个标志位,是否在新列中总是打印组头;</span><br><span style="font-family: 仿宋; font-size: 15px">(7)Start New Page 一个标志位,是否在新页中总是打印组头</span></p>
<h1><span style="font-family: 仿宋; font-size: 15px">五、JasperReports作为一种开源的报表库为应用提供了强大的支持。其易用性和灵活性为系统的开发提供了极大的便利。</span></h1>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">在报表生成过程中,使用JDBC等传统数据源操作方法获取数据的过程会消耗大量的系统时间,这样就需要利用其它手段来简化数据源操作。</span><br><span style="font-family: 仿宋; font-size: 15px">在这种情况下,适当的使用ORM(Object/Relational Mapping)技术,能够很好的解决这个问题,对于系统性能的提升有很大的帮助。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">1、JasperReports填充报表</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">要完成报表的填充,必须先完成用于报表的xml模板,其过程是先产生报表布局对象,再序列号该对象,存储在磁盘或者网络,用于产生特定应用的表格数据。</span><br><span style="font-family: 仿宋; font-size: 15px">实际上,表单的设计过程就是用定义于xml文件中的java表达式来表现报表的布局。</span><br><span style="font-family: 仿宋; font-size: 15px">编辑过程中会有各种保证数据一致性的验证,最终会产生相关数据的文档。</span><br><span style="font-family: 仿宋; font-size: 15px">报表引擎必须先接受数据来产生报表,这些数据一般来源于各种数据源,报表引擎能直接接收用于填充表格的数据源对象,或者通过自身提供的JDBC连接对象来处理数据库的数据。</span><br><span style="font-family: 仿宋; font-size: 15px">报表最终要产生一个新的对象来进行填充操作从而产生用于输出的文档对象,这也是一个存储在磁盘或者网络传输介质的序列化对象。</span><br><span style="font-family: 仿宋; font-size: 15px">JasperReports的内置浏览器能直接查看结果或者以PDF,HTML,XML形式将其导出。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">2、持久化技术和ORM</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">持久化(Persistence),即把数据保存到可永久保存的存储设备中(如磁盘)。</span><br><span style="font-family: 仿宋; font-size: 15px">持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等。</span><br><span style="font-family: 仿宋; font-size: 15px">ORM即“对象-关系型数据映射组件。对于O/R,即Object(对象)和Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。</span><br><span style="font-family: 仿宋; font-size: 15px">MVC(Model View Control)中的Model包含了复杂的业务逻辑和数据逻辑,以及数据存取机制(如JDBC的连接、SQL生成和Statement创建、还要ResultSet结果集的读取等)。将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。</span><br><span style="font-family: 仿宋; font-size: 15px">MVC模式实现了架构上将表现层和数据处理层分离的解耦合,而持久化设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。</span><br><span style="font-family: 仿宋; font-size: 15px">关系型数据库中的数据基本都是以一行行的数据进行存取的,而程序运行却是一个个对象进行处理,而目前大部分数据库驱动技术(如ADO.NET、JDBC、ODBC等)均是以行集的结果集一条条进行处理的。所以为解决这一困难,就出现ORM这一个对象和数据之间映射技术。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">3、在JasperReports中使用Hibernate</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。</span><br><span style="font-family: 仿宋; font-size: 15px">Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。</span></p>
<p style="margin-left: 30px"><span style="font-size: 18px"><strong><span style="font-family: 仿宋">关键代码片段</span></strong></span></p>
<p style="margin-left: 30px"> </p>

<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> src;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.HashMap;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> net.sf.jasperreports.engine.JRException;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> net.sf.jasperreports.engine.JasperCompileManager;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> net.sf.jasperreports.engine.JasperFillManager;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> net.sf.jasperreports.engine.JasperPrint;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> net.sf.jasperreports.engine.JasperReport;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> net.sf.jasperreports.engine.design.JasperDesign;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> net.sf.jasperreports.engine.xml.JRXmlLoader;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> net.sf.jasperreports.engine.JasperExportManager;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.hibernate.HibernateException;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.hibernate.MappingException;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.hibernate.Session;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.hibernate.SessionFactory;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.hibernate.cfg.Configuration;

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Simple1 {
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String args[]) {
   String sampleReportFile</span>=<span style="color: rgba(0, 0, 255, 1)">new</span> String("reports/sampleReport.jrxml"<span style="color: rgba(0, 0, 0, 1)">);
   </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Hibernate Result Set Holder.</span>
   List bowlerInfo=<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
   </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Configure the Hibernate session</span>
    Configuration cfg=<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Configuration();
    cfg.addResource(</span>"hibernate-mapping.xml"<span style="color: rgba(0, 0, 0, 1)">);
    SessionFactory sessions</span>=<span style="color: rgba(0, 0, 0, 1)">cfg.buildSessionFactory();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Open the Hibernate Session</span>
    Session session=<span style="color: rgba(0, 0, 0, 1)">sessions.openSession();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Returns all SampleData records.
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Simple POJO object.</span>
    bowlerInfo=session.createQuery("from SampleData"<span style="color: rgba(0, 0, 0, 1)">).list();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Fill the parameters</span>
    HashMap parameters=<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> HashMap();
    parameters.put(</span>"ReportTitle","Bowling Scores"<span style="color: rgba(0, 0, 0, 1)">);
    parameters.put(</span>"NoOfGames", <span style="color: rgba(0, 0, 255, 1)">new</span> Integer(3<span style="color: rgba(0, 0, 0, 1)">));
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Load the sample report file from the XML file
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">into the JasperDesign object.</span>
    JasperDesign design=<span style="color: rgba(0, 0, 0, 1)">JRXmlLoader.load(sampleReportFile);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Compile the Report in Memory storing it in a JasperReport object
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">no .jasper report file is created.</span>
    JasperReport report=<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> JasperCompileManager().compileReport(design);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Fill the report using the JRBeanCollectionDataSource passed
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">a Hibernate query result set.</span>
    JasperPrint print=JasperFillManager.fillReport(report,parameters,<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> JRBeanCollectionDataSource(bowlerInfo));
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Export to PDF file.</span>
    JasperExportManager.exportReportToPdfFile(print,"simpleHibernatExample.pdf"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Close the Hibernate Session.</span>
<span style="color: rgba(0, 0, 0, 1)">    session.close();  
   }</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)">(JRException jre) {
    jre.printStackTrace();
   }</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)">(MappingException me) {
    me.printStackTrace();
   }</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)">(HibernateException he) {
    he.printStackTrace();
   }
}
}</span></pre>

<p style="margin-left: 30px"> </p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">当Hibernate检索返回集合类型的对象时,使用JRBeanCollection接口可将数据通过Hibernate的POJO(Plain Old Java Object)实例映射到报表域中,使用JRXmlLoader.load(templateName)方法加载报表模板,最后通过JasperFillManager方法将数据填入模板中。</span><br><span style="font-family: 仿宋; font-size: 15px">本例使用JasperExportManager.exportReportToPdfFile()方法将报表输出为PDF格式。JasperReports提供的net.sf.jasperreports.engine.JRExporter接口可以方便的将报表输出为PDF、XLS、CSV、RTF、HTML或者XML格式,目前以PDF和EXCEL格式较为通用。</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">4、总结</span></p>
<p style="margin-left: 30px"><span style="font-family: 仿宋; font-size: 15px">在JasperReports中使用了Hibernate以后,如果随业务更换数据源的话,只需要更好Hibernate的映射文件,极大提高了代码的可重用性,同时由于Hibernate本身对于查询的优化,也能很好的提高整个应用的效率,尽可能的节省开发时间。</span></p>
<p style="margin-left: 30px"> </p>
						  
					  </div>
						<!--conend-->
							<div class="p-2"></div>

						<div class="arcinfo my-3 fs-7 text-center">
							
							
			<a href='/t/etagid11957-0.html' class='tagbtn' target='_blank'>水晶报表</a><a href='/t/etagid20-0.html' class='tagbtn' target='_blank'>java</a><a href='/t/etagid32672-0.html' class='tagbtn' target='_blank'>iReport</a><a href='/t/etagid32673-0.html' class='tagbtn' target='_blank'>JasperReports</a>							
						



						</div>
						
						<div class="p-2"></div>

						

						
					</div>
					<div class="p-2"></div>
					<!--xg-->
					<div class="lbox p-4 shadow-sm rounded-3">
						<div class="boxtitle"><h2 class="fs-4">相关</h2></div>
						
<hr>				
						
			<div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-566066.html">JavaWeb的三大作用域</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-565142.html">java中常用数组copy方法</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-565282.html">6.Java方法</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-564641.html">Java web开发:从零到 Run 一个现有的 Spring Boot 前后端分离项目(前端Vue)</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-564695.html">javascript基础知识(29) 实现继承的方式</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-564803.html">java  正则表达式</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-564663.html">JAVA List<Object[]>取值问题</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-564458.html">初次接触Java感受</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-564053.html">99乘法表   java for循环</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-563641.html">基于java.net.socket包的对象传递</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-563934.html">Idea Java项目文件夹后面提示百分数怎么去掉</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div><div class="row g-0 py-2 border-bottom align-items-center">
																
								<div class="col-7 col-lg-11 border-lg-end">
										<h3 class="fs-6 mb-0 mb-lg-2"><a href="/a/1-563758.html">Java8新特性</a></h3>
									
									<div class="ltag fs-8 d-none d-lg-block">
								 

        </div>
								</div>
							
							</div>            
            
            <!---->
                                    
           <!---->
  			
						

					</div>
					<!--xgend-->
				</div>

				<div class="col-lg-3 col-12 p-0 ps-lg-2">
					<!--box-->									
					<!--boxend-->
					<!--<div class="p-2"></div>-->

					<!--box-->
									<div class="lbox p-4 shadow-sm rounded-3">
					
									   <div class="boxtitle pb-2"><h2 class="fs-4"><a href="#">标签</a></h2></div>
										<div class="clearfix"></div>
										<ul class="m-0 p-0 fs-7 r-tag">
										</ul>
									

										
										<div class="clearfix"></div>
									</div>
					<!--box end-->

					
				</div>

			</div>
		
		
		
		</div>	

</main>
						<div class="p-2"></div>
<footer>
<div class="container-fluid p-0 bg-black">
	<div class="container p-0  fs-8">
	<p class="text-center m-0 py-2 text-white-50">一品网 <a class="text-white-50" href="https://beian.miit.gov.cn/" target="_blank">冀ICP备14022925号-6</a></p>
	</div>	
</div>
<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?6e3dd49b5f14d985cc4c6bdb9248f52b";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>
</footer>
		
<script src="/skin/bootstrap.bundle.js"></script>

</body>
</html>