Jasperreport报表开发与Web项目整合
基于JasperReports的Web报表打印技术的应用与实现
基于JasperReports的Web报表打印技术的应用与实现作者:王小滨卫晨来源:《电脑知识与技术》2013年第17期摘要:随着Internet电子商务的蓬勃发展,报表作为企业信息系统的重要组成部分,其应用迫切需要向WEB转移,而报表打印功能扮演着重要的角色。
JasperReports 是一个报表生成工具,能够展示丰富的页面内容,能够应用于各种Java应用程序中。
结合web报表功能需求,针对B/S环境下调用本地打印机的问题,该文提出一种基于JasperReports和第三方打印控件相结合的解决方案,解决跨浏览器的报表打印问题。
关键词:JasperReports;web报表;第三方打印控件;MVC中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2013)17-4001-04随着Web技术的广泛应用,传统的报表打印方式也发生了很大变化。
在B/S模式下,由于只能采用浏览器作为用户界面进行交互,不能精确控制客户端的打印机。
仅靠IE自带的页面打印功能,不能满足客户的需求,并且除了IE浏览器还有诸如谷歌、火狐等主流浏览器使用越来越多,如何解决跨浏览器下实现web报表打印的问题显得更为重要。
本文报表打印系统基于J2EE技术构建,开源报表引擎JasperReports与可视化工具iReport 相结合,将报表模板与报表数据相分离,用户根据需要设计报表模板,自主选择数据源。
在此基础上使用轻量级第三方打印控件,借助其丰富的打印功能,可以实现套打、精确打印等复杂功能,具有高效、简单、灵活的特点,满足客户的不同需求。
1 相关技术介绍1.1 JasperReportsJasperReports是一个强大灵活的开源报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式。
该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。
iReport 也是开源软件,其主要作用是用来以可视化的方式设计生成JasperReports 所使用的报表格式文件,因为JasperReports 本身并未提供很好的可视化报表设计方式,iReport可视化的设计界面,支持拖拉试操作,方便、快捷的制作出各种复杂的报表。
整合Struts2+JasperReport Web报表应用示例
整合Struts2+JasperReport Web报表应用示例JasperReports作为一种优秀且开源的报表引擎,不利用太可惜了。
同时,借助开源的JasperReports模板设计利器iReports,可以可视化的设计报表模板。
基于Web的报表在很多项目中都是需要的。
而随着Struts2的流行,就应该研究一下在Struts2下如何利用JasperReports进行报表输出。
本示例比较简单,采用的数据源即为JavaBean,而没有采用复杂的数据库,其实原理是一样的。
只是传递给JasperReports的参数随着连接方式的变化而略加修改而已。
一准备工作所使用的类库及Jar包如下图所示:图1.使用的Jar包开发环境:MyEclipse5.5+Eclipse3.2+JDK5.0+Tomcat5.5+Struts 2.0.6。
当然,本该所提供的源代码下载中没有提供相关的lib,因为文件大太,如果需要,请留下email。
源代码下载:Struts2AndJasperReport.rar二设计报表模板本例中采用JavaBean作为数据源,用于显示People对象的一些基本属性,如所在序号、城市、姓名、地址,并对同一城市的人员进行汇总小结显示。
至于如何在iReports中设计模板文件,请在网上参考其它文档。
这里不再详细解读,或有时间俺再另写文章来具体讲解如何在iReports中设计报表模板。
WebRoot\jasper\jasper_template.jrxml代码如下:<?xml version="1.0" encoding="UTF-8" ?><!-- Created with iReport - A designer for JasperReports --><!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "htt p:///dtds/jasperreport.dtd"><jasperReportname="jasper_template"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="UTF-8"/><import value="java.util.*"/><import value="net.sf.jasperreports.engine.*"/><import value="net.sf.jasperreports.engine.data.*"/><parameter name="rptMan"isForPrompting="false"class="ng.Strin g"><defaultValueExpression ><![CDATA["sterning"]]></defaultValueExp ression></parameter><parameter name="rptDate"isForPrompting="false"class="ng.Stri ng"><defaultValueExpression ><![CDATA["2008-01-12"]]></defaultValueExpression></parameter><field name="city"class="ng.String"><fieldDescription><![CDATA[city]]></fieldDescription></field><field name="street"class="ng.String"><fieldDescription><![CDATA[street]]></fieldDescription> </field><field name="id"class="ng.Integer"><fieldDescription><![CDATA[id]]></fieldDescription></field><field name="name"class="ng.String"><fieldDescription><![CDATA[name]]></fieldDescription></field><variable name="CityNumber"class="ng.Integer"resetType="Group "resetGroup="CityGroup"calculation="Sum"><initialValueExpression><![CDATA[($V{CityNumber} != null)?(new Integer($V{CityNumber}.intValue() + 1)):(new Integer(1))]]></initialValueExpr ession></variable><variable name="AllCity"class="ng.Integer"resetType="Report "calculation="Sum"><initialValueExpression><![CDATA[($V{AllCity} != null)?(new In teger($V{AllCity}.intValue() + 1)):(new Integer(1))]]></initialValueExpression> </variable><group name="CityGroup"><groupExpression><![CDATA[$F{city}]]></groupExpression><groupHeader><band height="0"isSplitAllowed="true"></band></groupHeader><groupFooter><band height="37"isSplitAllowed="true"><staticText><reportElementx="98"y="5"width="51"height="25"key="staticText-8"/><box topBorder="None"topBorderColor="#000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="14"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><text><![CDATA[灏忚 锛歖]></text></staticText><textField isStretchWithOverflow="false" isBlan kWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="S elf" ><reportElementx="149"y="5"width="34"height="25"key="textField-7"/><box topBorder="None" topBorderColor="# 000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBor derColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋" pdfFont Name="STSong-Light" size="14" isPdfEmbedded ="true" pdfEncoding ="UniGB-UCS2-H "/></textElement><textFieldExpression class="ng.Intege r"><![CDATA[$V{CityGroup_COUNT}]]></textFieldExpression></textField><line direction="TopDown"><reportElementx="-30"y="36"width="593"height="0"key="line-5"/><graphicElement stretchType="NoStretch"/></line></band></groupFooter></group><background><band height="0"isSplitAllowed="true"></band><title><band height="62"isSplitAllowed="true"><staticText><reportElementx="20"y="0"width="484"height="57"forecolor="#FF0033"key="staticText-1"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement textAlignment="Center"><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="36"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><text><![CDATA[Struts2+JasperReports绀轰緥]]></te xt></staticText><line direction="TopDown"><reportElementx="-30"y="61"width="594"height="0"key="line-4"/><graphicElement stretchType="NoStretch"/></line></band></title><pageHeader><band height="13"isSplitAllowed="true"><line direction="TopDown"><reportElementx="-29"y="12"width="592"height="0"key="line-3"/><graphicElement stretchType="NoStretch"/></line></pageHeader><columnHeader><band height="45"isSplitAllowed="true"><staticText><reportElementx="13"y="5"width="62"height="33"key="staticText-2"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="24"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><text><![CDATA[搴忓彿]]></text></staticText><staticText><reportElementx="98"y="5"width="62"height="33"key="staticText-3"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="24"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><text><![CDATA[鍩庡競]]></text></staticText><staticText><reportElementx="212"y="5"width="62"height="33"key="staticText-4"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="24"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><text><![CDATA[濮撳悕]]></text></staticText><staticText><reportElementx="331"y="5"width="62"height="33"key="staticText-5"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="24"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><text><![CDATA[浣忓潃]]></text></staticText><line direction="TopDown"><reportElementx="-30"y="43"width="596"height="0"key="line-2"/><graphicElement stretchType="NoStretch"/></line></band></columnHeader><detail><band height="43"isSplitAllowed="true"><textField isStretchWithOverflow="false"isBlan kWhenNull="false"evaluationTime="Now"hyperlinkType="None"hyperlinkTarget="S elf"><reportElementx="13"y="7"width="62"height="30"key="textField-1"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="14"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><textFieldExpression class="ng.Intege r"><![CDATA[$F{id}]]></textFieldExpression></textField><textField isStretchWithOverflow="false"isBlan kWhenNull="false"evaluationTime="Now"hyperlinkType="None"hyperlinkTarget="S elf"><reportElementx="98"y="7"width="105"height="29"key="textField-2"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="14"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><textFieldExpression class="ng.String "><![CDATA[$F{city}]]></textFieldExpression></textField><textField isStretchWithOverflow="false"isBlan kWhenNull="false"evaluationTime="Now"hyperlinkType="None"hyperlinkTarget="S elf"><reportElementx="212"y="8"width="100"height="28"key="textField-3"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="14"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><textFieldExpression class="ng.String "><![CDATA[$F{name}]]></textFieldExpression></textField><textField isStretchWithOverflow="false"isBlan kWhenNull="false"evaluationTime="Now"hyperlinkType="None"hyperlinkTarget="S elf"><reportElementx="331"y="7"width="111"height="30"key="textField-4"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="14"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><textFieldExpression class="ng.String "><![CDATA[$F{street}]]></textFieldExpression></textField><line direction="TopDown"><reportElementx="-30"y="37"width="593"height="0"key="line-1"/><graphicElement stretchType="NoStretch"/></line></band></detail><columnFooter><band height="37"isSplitAllowed="true"></band></columnFooter><pageFooter><band height="50"isSplitAllowed="true"><textField isStretchWithOverflow="false"isBlan kWhenNull="false"evaluationTime="Now"hyperlinkType="None"hyperlinkTarget="S elf"><reportElementx="98"y="18"width="138"height="23"key="textField-8"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement textAlignment="Right"><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="12"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><textFieldExpression class="ng.String "><![CDATA["椤垫暟" + String.valueOf($V{PAGE_NUMBER}) + " of"]]></textFieldE xpression></textField><textField isStretchWithOverflow="false"isBlan kWhenNull="false"evaluationTime="Report"hyperlinkType="None"hyperlinkTarget ="Self"><reportElementx="239"y="18"width="83"height="23"key="textField-9"/><box topBorder="None"topBorderColor="# 000000"leftBorder="None"leftBorderColor="#000000"rightBorder="None"rightBor derColor="#000000"bottomBorder="None"bottomBorderColor="#000000"/><textElement><font fontName="瀹嬩綋"pdfFont Name="STSong-Light"size="12"isPdfEmbedded ="true"pdfEncoding ="UniGB-UCS2-H "/></textElement><textFieldExpression class="ng.String "><![CDATA[" " + String.valueOf($V{PAGE_NUMBER})]]></textFieldExpression></textField></band></pageFooter><lastPageFooter><band height="50"isSplitAllowed="true"></band></lastPageFooter><summary><band height="0"isSplitAllowed="true"></band></summary></jasperReport>这里需要说明的是,由于俺们中国的中文比较特殊,由此在PDF中显示的时候,需要一些额外的Jar包字体来支持。
JasperReports安装配置和制作
JasperReports安装配置和制作一、JasperReports简要介绍^JasperReports is a powerful open source Java reporting tool that has the ability to deliver rich content onto the screen, to the printer or into PDF, HTML, XLS, CSV and XML files.It is entirely written in Java and can be used in a variety of Java enabled applications, including J2EE or Web applications, to generate dynamic content.Its main purpose is to help creating page oriented, ready to print documents in a simple and flexible manner.二、以下为JasperReports安装配置和制作步骤,希望能对初学者有所帮助。
1、JasperReport和iReport的资源,最新版本可以到下面官方网站得到。
iReport官方网站:JasperReports官方网站:2、安装1)、JDK的安装,并配置JAVA_HOME。
比如我的JAVA_HOME 路径如下:JAVA_HOME D:\Program Files\j2sdk1.4.2_032)、由于中文的问题,所以还需要下载:itext-1.02b.jar和iTextAsian.jar包。
下载地址:并在CLASSPATH中设置。
例如我的CLASSPATH如下:CLASSPATH E:\Program Files\Apache Group\T omcat4.1\webapps\testreport\WEB-INF\lib\itext-1.02b.jar;E:\Program Files\Apache Group\Tomcat 4.1\webapps\testreport\WEB-INF\lib\iTextAsian.jar;E:\Program Files\Apache Group\Tomcat 4.1\webapps\testreport\WEB-INF\lib;D:\tools\iReport0.2.3\lib3)、iReport的安装iReport只要解压就OK,如果没有安装Ant,可以直接在iReport下的noAnt目录下,运行startup.bat就可以了,这样iReport就可以启动了。
JasperReport 报表总结
为了开发报表,已经拜读了一大堆的资料,其中大部分是重复的。
可以看得出,国人还是比较热衷于copy&paste的工作。
所以找了一大堆的资料都是相同的,或者可以用一个词来形容,换汤不换药的。
有必要对于jasper Report的学习进度进行一下总结,一来可以更新一下以前的资料中的一些旧得不能再旧的不再适用的东西,二来让后来者可以轻松的上手。
首先,jasperReport是一个以java实现的报表工具,(好像是句废话)。
可以实现多种格式的报表。
再我们先理解一下jasperReport的实现过程。
笔者不再画图,网上到处都是。
1)定制报表格式。
有二种方式,一种就是写jrxml文件,其实就是xml文件,只不过是后缀名不一样罢了。
另一种方式更直接,就是生成一个JasperDesign类的实例,在japsperDesign中自己定义模板。
jrxml文件也是通过一个JRXmlLoad加载过来,转成JasperDesign类的实例。
也就是说写jrxml文件还需要进行解析,加载。
现实中我们使用的报表一般格式比较固定,因而可以通过先使用iReport工具生成模板,再加载解析的方式。
这种方式简单,而且可见性强。
2)填充数据。
在最新版(2007.4.30发布)的jasperReports1.3.3中,支持了很多的格式,包括了对于Hibernate的支持。
填充数据对于我们经常使用的来说,一般是二种方式,一种方式是通过JDBC连接提供数据源,一种就是通过javaBean的集合提供数据源。
当然还有web Service的xml文件提供的。
我的建议是,如果你的程序中的统计直接使用Jdbc就可以完成,那么就使用jdbc数据源的方法,反之,使用javaBean的集合是不错的选择,因为这样不会在意你的数据的来源,你也可以任意处理,比如说,要通过权限检查的数据才在报表中生成的话,就可以过滤到不符合权限的数据。
3)显示或打印。
显示,即将JasperReport生成的文件直接显示出来,打印所使用的方式其实就是生成文件,然后调用打印来对文件进行打印。
JasperReport5.6.1编码及Studio使用
JasperReport5.6.1 编码及Studio使用目录目录1.JasperReport编码 (1)1.1.加入Jar包 (1)1.2.生成报表传给客户端 (1)1.3.报表另存为多种格式 (2)2.JasperSoft Studio报表设计器使用 (5)2.1.简介 (5)2.1.1.报表生命周期 (5)2.1.2.界面 (6)2.2.基本使用 (7)2.2.1.配置数据连接(数据适配器) (7)2.2.2.创建新报表 (12)2.2.3.设置查询语句 (15)2.2.4.报表各部分组成 (16)2.2.5.制作明细表 (16)2.2.5.1.添加表头 (16)2.2.5.2.添加字段 (18)2.2.5.3.设定PDF字体 (19)2.2.5.4.设定边框 (20)2.2.5.5.设定栏高 (21)2.2.5.6.设置字段域 (22)2.2.6.参数的使用 (23)2.2.6.1.添加参数 (23)2.2.6.2.程序中传递参数 (24)2.2.6.3.报表模板接收参数 (24)2.2.7.自定义变量的使用 (24)2.2.7.1.顺序号 (24)2.2.7.2.小计 (26)2.2.7.3.合计 (28)2.2.7.3.1.表头合计 (28)2.2.7.3.2.表尾合计 (28)2.3.报表设计器进阶 (30)2.3.1.分组报表 (30)2.3.2.图形报表 (33)2.3.3.子报表 (35)2.3.3.1.制作父报表 (35)2.3.3.2.制作子报表 (36)2.3.3.3.子报表自适应行高 (41)1.JasperReport编码下面详细说明一下如何利用JasperReport实现自己系统中的报表功能。
1.1. 加入Jar包首先在工程中加入核心类包。
解压从官网上下载的压缩包,在dist目录中可以找到“jasperreports-5.6.1.jar”和“jasperreports-fonts-5.6.1.jar”,复制到项目WEB-INF/lib下,加入到Eclipse的构建配置中。
JasperReport报表开发说明(深入浅出)
1.报表制作流程实例:我们实现一个简单的JasperReports示例,展现其基本的开发、使用流程。
Jasper Studio是基于Eclipse的报表设计工具(不熟悉Eclipse的看官先去熟悉一下基本知识吧),默认工作区设置为当前用户主目录下的JaspersoftWorkspace文件夹,并且不可更改。
首先,我们创建一个报表工程,本例中命名为DemoProject,然后创建一张新的报表(File --> New–->Jasper Report),就会出现类似下图所示的窗口让我们选择一个模板。
此例我们选Coffee模板,然后点Next。
在接下来的页面里,我们给报表模板起个名字(Demo1.jrxml)并放在DemoProject的根目录下,然后点Next,于是进入了数据源选择界面:数据源是填充报表的关键,我们必须制定一个数据适配器(Data Adapter),此时我们有三种选择:1、选择“OneEmpty Record - Empty rows”,这样我们就可以专注于报表的设计,而暂时不指定数据源,创建完报表之后,我们随时可以制定别的数据源。
2、选择“SampleDB - Database JBDC Connection”,这是JaspersoftStudio安装时提供的一个示例数据库。
3、点击“New”按钮创建一个新的数据源。
这正是本例要采用的方式,我们将创建一个连接到本机MySql数据库的world的数据源。
首先点击“New”,在弹出的向导页中选择“Database JDBC Connection”,然后点“Next”弹出下图所示的页面:配置好基本的数据库连接信息,点击“Test”测试通过之后,一个数据源就配置好了,我们点击“Finish”结束配置。
初次配置MySql数据源需要在Driver Classpath页面指定MySql驱动包的路径:配置并选择数据适配器之后,我们需要指定数据查询的语句,该语句查询出的字段将直接用于报表中的数据字段。
JasperReport学习笔记5-其它数据生成动态的报表(WEB)
JasperReport学习笔记5-其它数据⽣成动态的报表(WEB)1.空数据(Empty Datasources)就是说JRXML⽂件⾥⾯的内容都是静态的,直接使⽤JREmptyDataSource就⾏了Java代码1. JasperRunManager.runReportToPdfStream(reportStream,2. servletOutputStream, new HashMap(), new JREmptyDataSource());2.Map数组(Map Datasources)有的时候数据不⼀定要从数据库⾥⾯来,还有可能从Map数组⾥⾯来成⽣Map[]的⽅法Java代码1. private Map[] initializeMapArray()2. {3. //你可以把数组⾥⾯的每个map看成⼀个对象,就相于数据库⾥⾯的每个字段4. HashMap[] reportRows = new HashMap[4];5. HashMap row1Map = new HashMap();6. HashMap row2Map = new HashMap();7. HashMap row3Map = new HashMap();8. HashMap row4Map = new HashMap();9. row1Map.put("tail_num", "N263Y");10. row1Map.put("aircraft_serial", "T-11");11. row1Map.put("aircraft_model", "39 ROSCOE TRNR RACER");12. row1Map.put("engine_model", "R1830 SERIES");13. row2Map.put("tail_num", "N4087X");14. row2Map.put("aircraft_serial", "BA100-163");15. row2Map.put("aircraft_model", "BRADLEY AEROBAT");16. row2Map.put("engine_model", "R2800 SERIES");17. row3Map.put("tail_num", "N43JE");18. row3Map.put("aircraft_serial", "HAYABUSA 1");19. row3Map.put("aircraft_model", "NAKAJIMA KI-43 IIIA");20. row3Map.put("engine_model", "R1830 SERIES");21. row4Map.put("tail_num", "N912S");22. row4Map.put("aircraft_serial", "9973CC");23. row4Map.put("aircraft_model", "PA18-150");24. row4Map.put("engine_model", "R-1820 SER");25. reportRows[0] = row1Map;26. reportRows[1] = row2Map;27. reportRows[2] = row3Map;28. reportRows[3] = row4Map;29. return reportRows;30. }⽣成JRMapArrayDataSource对象Java代码1. private JRDataSource createReportDataSource()2. {3. JRMapArrayDataSource dataSource;4. Map[] reportRows = initializeMapArray();5. dataSource = new JRMapArrayDataSource(reportRows);6. return dataSource;7. }Servlet⾥⾯Java代码1. JRDataSource dataSource = createReportDataSource();2. JasperRunManager.runReportToPdfStream(reportStream,3. servletOutputStream, new HashMap(), dataSource);3.Map集合Java代码1. private JRDataSource createReportDataSource()2. {3. JRMapCollectionDataSource dataSource;4. Collection reportRows = initializeMapCollection();5. dataSource = new JRMapCollectionDataSource(reportRows);6. return dataSource;7. }8. private Collection initializeMapCollection()9. {10. ArrayList reportRows = new ArrayList();11. HashMap row1Map = new HashMap();12. HashMap row2Map = new HashMap();13. HashMap row3Map = new HashMap();14. HashMap row4Map = new HashMap();15. row1Map.put("tail_num", "N263Y");16. row1Map.put("aircraft_serial", "T-11");17. row1Map.put("aircraft_model", "39 ROSCOE TRNR RACER");18. row1Map.put("engine_model", "R1830 SERIES");19. row2Map.put("tail_num", "N4087X");20. row2Map.put("aircraft_serial", "BA100-163");21. row2Map.put("aircraft_model", "BRADLEY AEROBAT");22. row2Map.put("engine_model", "R2800 SERIES");23. row3Map.put("tail_num", "N43JE");24. row3Map.put("aircraft_serial", "HAYABUSA 1");25. row3Map.put("aircraft_model", "NAKAJIMA KI-43 IIIA");26. row3Map.put("engine_model", "R1830 SERIES");27. row4Map.put("tail_num", "N912S");28. row4Map.put("aircraft_serial", "9973CC");29. row4Map.put("aircraft_model", "PA18-150");30. row4Map.put("engine_model", "R-1820 SER");31. reportRows.add(row1Map);32. reportRows.add(row2Map);33. reportRows.add(row3Map);34. reportRows.add(row4Map);35. return reportRows;36. }使⽤Java代码1. JRDataSource dataSource = createReportDataSource();2. JasperRunManager.runReportToPdfStream(reportStream,3. servletOutputStream, new HashMap(), dataSource);4.对象数组(Java Objects as Datasources)对象JAVABEANJava代码1. public class AircraftData2. {3. public AircraftData(String tail, String serial, String model,4. String engine)5. {6. setTailNum(tail);7. setAircraftSerial(serial);8. setAircraftModel(model);9. setEngineModel(engine);10. }11. public AircraftData()12. {13. }14. private String tailNum;15. private String aircraftSerial;16. private String aircraftModel;17. private String engineModel;18. //set get method.....19. }JRXML⽂件Java代码1. <?xml version="1.0" encoding="UTF-8"?>2. <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"3. "/dtds/jasperreport.dtd">4. <jasperReport name="AircraftReport">5. <field name="tailNum" class="ng.String"/>6. <field name="aircraftSerial" class="ng.String"/>7. <field name="aircraftModel" class="ng.String"/>8. <field name="engineModel" class="ng.String"/>9. <pageHeader>10. <band height="30">11. <staticText>12. <reportElement x="0" y="0" width="69" height="24"/>13. <textElement verticalAlignment="Bottom"/>14. <text>15. <![CDATA[Tail Number: ]]>16. </text>17. </staticText>18. <staticText>19. <reportElement x="140" y="0" width="69" height="24"/>20. <text>21. <![CDATA[Serial Number: ]]>22. </text>23. </staticText>24. <staticText>25. <reportElement x="280" y="0" width="69" height="24"/>26. <text>27. <![CDATA[Model: ]]>28. </text>29. </staticText>30. <staticText>31. <reportElement x="420" y="0" width="69" height="24"/>32. <text>33. <![CDATA[Engine: ]]>34. </text>35. </staticText>36. </band>37. </pageHeader>37. </pageHeader>38. <detail>39. <band height="30">40. <textField>41. <reportElement x="0" y="0" width="69" height="24"/>42. <textFieldExpression class="ng.String">43. <![CDATA[$F{tailNum}]]>44. </textFieldExpression>45. </textField>46. <textField>47. <reportElement x="140" y="0" width="69" height="24"/>48. <textFieldExpression class="ng.String">49. <![CDATA[$F{aircraftSerial}]]>50. </textFieldExpression>51. </textField>52. <textField>53. <reportElement x="280" y="0" width="69" height="24"/>54. <textFieldExpression class="ng.String">55. <![CDATA[$F{aircraftModel}]]>56. </textFieldExpression>57. </textField>58. <textField>59. <reportElement x="420" y="0" width="69" height="24"/>60. <textFieldExpression class="ng.String">61. <![CDATA[$F{engineModel}]]>62. </textFieldExpression>63. </textField>64. </band>65. </detail>66. </jasperReport>调⽤Java代码1. private JRDataSource createReportDataSource()2. {3. JRBeanArrayDataSource dataSource;4. AircraftData[] reportRows = initializeBeanArray();5. dataSource = new JRBeanArrayDataSource(reportRows);6. return dataSource;7. }8.9. private AircraftData[] initializeBeanArray()10. {11. AircraftData[] reportRows = new AircraftData[4];12. reportRows[0] = new AircraftData("N263Y", "T-11", "39 ROSCOE TRNR13. RACER", "R1830 SERIES");14. reportRows[1] = new AircraftData("N4087X", "BA100-163", "BRADLEY15. AEROBAT", "R2800 SERIES");16. reportRows[2] = new AircraftData("N43JE", "HAYABUSA 1", "NAKAJIMA17. KI-43 IIIA", "R1830 SERIES");18. reportRows[3] = new AircraftData("N912S", "9973CC", "PA18-150",19. "R-1820 SER");20. return reportRows;21. }22.23. //最后servlet⾥⾯调⽤24. JRDataSource dataSource = createReportDataSource();25. JasperRunManager.runReportToPdfStream(reportStream,26. servletOutputStream, new HashMap(), dataSource);5.对象集合和对象数组基本上⼀样,就是最后⽣成的是JRBeanCollectionDataSourceJava代码1. private JRDataSource createReportDataSource()2. {3. JRBeanCollectionDataSource dataSource;4. Collection reportRows = initializeBeanCollection();5. dataSource = new JRBeanCollectionDataSource(reportRows);6. return dataSource;7. }8.9. JRDataSource dataSource = createReportDataSource();10. JasperRunManager.runReportToPdfStream(reportStream,11. servletOutputStream, new HashMap(), dataSource);6.XML数据成⽣报表(XML as Datasource)Xml代码1. <?xml version="1.0" encoding="UTF-8"?>2. <AircraftData>3. <aircraft>4. <tail_num>N263Y</tail_num>5. <aircraft_serial>T-11</aircraft_serial>6. <aircraft_model>39 ROSCOE TRNR RACER</aircraft_model>7. <engine_model>R1830 SERIES</engine_model>8. </aircraft>9. <aircraft>10. <tail_num>N4087X</tail_num>11. <aircraft_serial>BA100-163</aircraft_serial>12. <aircraft_model>BRADLEY AEROBAT</aircraft_model>13. <engine_model>R2800 SERIES</engine_model>14. </aircraft>15. <aircraft>16. <tail_num>N43JE</tail_num>17. <aircraft_serial>HAYABUSA 1</aircraft_serial>18. <aircraft_model>NAKAJIMA KI-43 IIIA</aircraft_model>19. <engine_model>R1830 SERIES</engine_model>20. </aircraft>21. <aircraft>22. <tail_num>N912S</tail_num>23. <aircraft_serial>9973CC</aircraft_serial>24. <aircraft_model>PA18-150</aircraft_model>25. <engine_model>R-1820 SER</engine_model>26. </aircraft>27. </AircraftData>这样获得Java代码1. JRXmlDataSource xmlDataSource = new JRXmlDataSource(2. new BufferedInputStream(getServletConfig().getServletContext()3. .getResourceAsStream("/reports/AircraftData.xml")),4. "/AircraftData/aircraft");JREmptyDataSource,JRMapArrayDataSource,JRMapCollectionDataSource,JRBeanArrayDataSource,JRBeanCollectionDataSource,JRXmlDataSource他们都implements JRDataSource主要⽬地就是不从数据库⾥⾯取数据,这个⽅⾯和Hibernate结合。
Jasper + ireport 集成报表到Web应用,操作说明
北京xxxxxxxxx公司JasperReport + ireport集成报表到Web应用操作说明郝建柱2011/2/24第一部分,下载与安装Ireport官网:/,从这里可以下载到下载后的文件名安装:没什么注意的,一路回车就好了第二部分,ireport与JasperReport简单说明1,ireport,是一个制作报表的工具,用其设计报表样式2,JasperReport,是在程序里操作ireport报表的一套类库先简单介绍,以下详细说明第三部分,使用ireport制作报表以ireport3.7.6为例,依次选择“文件–》New…”出现下图在接下来出现的对话框中选择保存位置就好了。
建好的报表分这样几个部分,下面依次说明Title : 报表标题,也就是在报表首页出现的Page Header : 报表每页的页头,Page Footer页脚Column Header : 列头,Column Footer 列脚Detail : 对数据源进行循环显示Summary : 汇总,也就是在报表最后一页出现的不需要的部分可以在ireport左边删掉,如下图示接下来以Oracle数据库的scott用户中DEPT表为例,制做一个简单的报表1,设置报表语言在报表边缘外单击,在ireport右边的属性面板中找到Language属性,设置为Java,如下图示2,以数据库为报表的数据源,显示简单的报表首先,把oracle的jdbc驱动引到ireport里,具体做法为:点击:工具-》选项,找到Classpath选项卡,按下图操作找到oracle的JDBC,添加进来就好了然后,点击ireport工具栏上的这个按钮在弹出的窗口中点new按向导,建一个数据源,注意,这个数据源我们在ireport里设计报表用的,与程序并没有关系接下来点工具栏上这个在弹出的窗口中写查询语句,如下图示点OK后,在ireport左边的面板上Fields下边就有了sql所查出来的列,如图现在只要把Fields下边的,将来要显示字段拽到报表设计器中上Detail部分,就好了,注意:把Field拽到Detail中后,在Column Header会自动出现对应的列头,只要双击,就可以写中文了接下来从ireport右边的组件面板中找到Static Text控件,拽到Title里,双击就可以输入文字,结果如下注意:这里所有的Static 和Field,需要在右边的属性面板中,逐一设置两个属性,如图这是为了将来把报表集成到程序里之后,让其在页面上显示中文点击就可以看到结果一般查询都是有条件的,刚才写的sql是查全部的,现在写带查询条件的sql,具体做法为:在ireport窗口左边的面板里,找到Parameters右击,添加Parameter,如图选中刚才添加的这个参数,在右边的属性面板中给其设置名字,比如叫parDname修改刚才写的sql为这样的简单说明红色的部分:在ireport里,用$P{参数名}来取参数,这个参数以后可以从程序里传进来,上边的$P!{parDname},多了一个!号,表示,把接来的参数作为字符串拼到sql中,如果去掉!号,写成$P{parDname},就表示SQL参数,相当于在JDBC中写select * from dept where dname like ?这样就创建了带条件的查询3,使用Variable(变量)做简单的汇总以统计查询结果的总条数,和总人数为例注:在scott的dept表里没人部门人数一列,在此用部门编号来代替在ireport左边找到Variables点右键,添加两个Variable添加后,在右边的属性面板分别给两个变量起名,varPcount (统计总人数),varRecordCount(统计总记录数)在属性面板上,对varPcount设置,如图这几个属性一看就清楚其作用了,Reset type:Report是对事个报表做统计在Variable Expression里选择要统计的Field名,如图在属性面板上,对varRecordCount配置,如图在Calculation属性中,选择count,表示统计数量因为是数量,所以,Variable Expression里随便选一列就行对比:在没有分组过的sql里select count(*)和selectcount(deptno)的结果是一样的配置好好,将两个Variable从左边拽到报表中对应位置就好了,可参照下图预览后就可以看到结果了4,图表的显示,在此,以显示部门人数为例,做一个图表首先给报表添加一个数据集,操作如图示起名为dsPcount按向导完成数据集的创建,之后配置数据集,给数据集添加参数,如图起名为dsParDname在创建好的数据集上右键-》Edit Query,添加查询条件然后在从右边的组件面板中拽一个Chart控件到Summary部分,选择一个样式后,点OK,在接下来的向导中,第一步选择刚创建的数据集,dsPcount,第二步中,选择Key,Value,分别写两个按钮,选择要显示的键和值完成后,在生成的图表上右键-》Chart Data,在DataSet标签上下边做如下配置在Parameters标签中这样配置在Dataset parameters name,选择数据集的参数,在Value expression里,选择主报表定义的参数在Detail标签中,这样配置这样,显示图表的操作就完成了,预览就可以看到效果了第四部分,把报表集成到Web应用程序中用MyEclipse新建一个Web Project,在WebRoot下新建一个reports文件夹,用来放ireport生成的jasper文件找到前边保存ireport报表的路径,报表在预览后,生成jasper 文件,如图把这个deptReport.jasper文件复制到Web项目里的reports 文件夹中导入JasperReport的包,包可以从以下路径找到Ireport安装路径\iReport-3.7.6\ireport\modules\ext把这里所有的包引到Web项目里,引入oracle的jdbc驱动,接下来进行编程,以Servlet为例1,生成报表并且以HTML形式在网页上显示Servlet的主要逻辑代码如下:request.setCharacterEncoding("utf-8");// 接收查询参数,将来这个参数就是我们在报表中定义的parDnameString deptName = request.getParameter("dname");// 报表文件路径,我们用ireport做的jasper文件路径// JasperReport需要jasper文件的真实路径String reportPath = request.getSession().getServletContext().getRealPath("/reports/deptReport.jasper");// 报表参数,jasper文件可能不只一个参数// 在程序里,用一个Map对象,向jasper文件传递他需要的参数Map reportParameters = new HashMap();reportParameters.put("parDname", deptName);// 报表连数据库所用的数据连接// 因为报表直接以数据库为数据源,所以在这里需要给jasper文件一个jdbc连接Connection con = null;// 清空响应流response.reset();// 设置输出格式response.setContentType("application/html");// 创建JDBC连接Class.forName("oracle.jdbc.OracleDriver");con = DriverManager.getConnection("jdbc:oracle:thin:@oracle10:1521:oracle", "scott", "tiger");// JasperReport提供的类,用于生成一个HTML文件JasperRunManager.runReportToHtmlFile(reportPath, reportParameters, con);response.sendRedirect(request.getContextPath()+ "/reports/deptReport.html");/** 如果要在网页上显示PDF文件,把前两句去掉,放开这段注释* ServletOutputStream out = response.getOutputStream();* //从jasper报表生成PDF字节* byte[] pdfBytes = JasperRunManager.runReportToPdf(reportPath, reportParameters, con);* //设置输出内容长度* response.setContentLength(pdfBytes.length); //将PDF写入报表* out.write(pdfBytes, 0, pdfBytes.length);* out.flush();* out.close();*/// 关闭数据连接con.close();这里只写出逻辑代码,实际用的时候,加上各种异常的处理。
Jasperreports使用总结
总结本文主要是基于我在项目开发中,使用jasperreports+ireport制作报表的一个归纳,里面对一些问题的解决方法,都经本人使用验证过,可以作为参考。
1.制作报表制作报表所必须的jar包,如图:只阐述要点部分,细节请参考其他文档,网络上有很详细的说明,由于我在项目中使用的数据源大部分是JavaBean,所以以该数据源为例:1.1使用JavaBean数据源制作简单报表(1)写两个Java 类作为数据源a. DailySales.java 源代码,实体类package com.ireport.test;import java.io.Serializable;public class DailySales implements Serializable {private static final long serialVersionUID = 1L;private String productNo;private String productName;private int number;private int money;private int id;......//省略了构造函数与getter 与 setter 方法b. DailySalesFactory.java 源代码,提供实体数组的工厂package com.ireport.test;import java.util.Arrays;import java.util.Collection;/*** 简单工厂类,取得测试数据*/public class DailySalesFactory {private static DailySales[] data = {new DailySales( " 货号 1" , " 物品1 " , 1,1000),new DailySales( " 货号 2" , " 物品 2" , 2,2000),new DailySales( " 货号 3" , " 物品 3" , 3,3000),new DailySales( " 货号 4" , " 物品 4" , 4,4000),new DailySales( " 货号 5" , " 物品 5" , 5,5000),new DailySales( " 货号 6" , " 物品 6" , 6,6000),new DailySales( " 货号 7" , " 物品 7" , 7,7000),new DailySales( " 货号 8" , " 物品 8" , 8,8000),new DailySales( " 货号 9" , " 物品 9" , 9,9000),new DailySales( " 货号 10" , " 物品 10" , 10,10000) };public static Object[] getBeanArray() {return data;}//必须是静态的,返回必须是数组public static Collection<DailySales> getBeanCollection() { return Arrays.asList(data);}}(2)把以上两个class 打成 jar 包,放入 iReport 安装目录下 lib文件夹(最好是手动将该jar包载入ireport,该jar包只在制作模板时供测试用)(3)启动iReport,制作模板a.填写数据源属性为数据源填写一个名称:TestJavaBean,工厂类:com.ireport.test.DailySalesFactory,静态工厂方法:getBeanCollection填写完整后,可测试一下是否可以连接。
解决Jasperreport的web 套打
解决Jasperreport的web 套打关于在web中的打印套打是经常被提到的,这个需求很广泛,中间忙了一些其他的事情,到今天才把在Jasperreport实现web套打的内容整理好。
下面开始讲述一下整个套打的过程1:首先用ireport制作一张套打的报表如下图如下模板所示在一个image组件上放上要打印的内容,我这里的演示是从数据库中取到的字段打印出来。
至于ireport模板的制作,我这里不做介绍,因为我自己也没有接触多久,会的不一定比你多。
2:创建JSP文件代码如下<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><%@ page import="net.sf.jasperreports.engine.*"%><%@ page import="java.util.*"%><%@ page import="java.io.*"%><%@ page import="java.sql.*"%><%@ page import="net.sf.jasperreports.engine.util.*"%><%@ page import="net.sf.jasperreports.engine.export.*"%><html><head><!-- 插入打印控件 --><OBJECT ID="jatoolsPrinter"CLASSID="CLSID:B43D3361-D975-4BE2-87FE-0571********"codebase="jatoolsPrinter.cab#version=5,3,0,0"></OBJECT></head><script type="text/javascript">function doPrint(how){//打印文档对象var myDoc ={settings:{pageWidth: 2100, //自定义纸张宽度(单位为十分之一毫米)pageHeight: 1400, //自定义纸张高度(单位为十分之一毫米)orientation: 1 //打印方向},enableScreenOnlyClass:true, // 使所有使用 screen-only 样式类的对象,只在预览、显示时可见,打印时隐藏documents: document, // 打印页面(div)们在本文档中marginIgnored: true,settingsID: 'mydocc', //打印设置的ID保存在注册表中copyrights: '杰创软件拥有版权 ' // 版权声明必须};// 调用打印方法if(how == '打印预览')jatoolsPrinter.printPreview(myDoc,true ); // 打印预览else if(how == '打印')jatoolsPrinter.print(myDoc ,true); // 打印前弹出打印设置对话框elsejatoolsPrinter.print(myDoc ,false); // 不弹出对话框打印}</script><body bgcolor="white"><br><input type="button" value="打印预览" onClick="doPrint('打印预览')"><input type="button" value="打印" onClick="doPrint('打印')"><input type="button" value="打印" onClick="doPrint('打印')"><br><%File reportFile = new File(application.getRealPath("/jasper/taoda.jasper"));JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());Map parameters = new HashMap();Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/DataName", "user", "password"); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);JRXhtmlExporter exporter = new JRXhtmlExporter();StringBuffer sbuffer = new StringBuffer();Map imagesMap = new HashMap();session.setAttribute("IMAGES_MAP", imagesMap);exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap); String imgServDirUrl = "/images/";File imgRealDir = new File(request.getRealPath(File.separator)+ imgServDirUrl);if (!imgRealDir.exists()) {imgRealDir.mkdirs();}exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, request.getContextPath()+ imgServDirUrl);exporter.setParameter(JRHtmlExporterParameter.IMAGES_DIR,imgRealDir);exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR,Boolean.TRUE);exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,Boolean.FALSE);exporter.exportReport();conn.close();%>其中以下内容为jatoolsprinter所需代码<OBJECT ID="jatoolsPrinter"CLASSID="CLSID:B43D3361-D975-4BE2-87FE-0571********"codebase="jatoolsPrinter.cab#version=5,3,0,0"></OBJECT>function doPrint(how){//打印文档对象var myDoc ={settings:{pageWidth: 2100, //自定义纸张宽度(单位为十分之一毫米)pageHeight: 1400, //自定义纸张高度(单位为十分之一毫米)orientation: 1 //打印方向},enableScreenOnlyClass:true, // 使所有使用 screen-only 样式类的对象,只在预览、显示时可见,打印时隐藏documents: document, // 打印页面(div)们在本文档中marginIgnored: true,settingsID: 'mydocc', //打印设置的ID保存在注册表中copyrights: '杰创软件拥有版权 ' // 版权声明必须};// 调用打印方法if(how == '打印预览')jatoolsPrinter.printPreview(myDoc,true ); // 打印预览else if(how == '打印')jatoolsPrinter.print(myDoc ,true); // 打印前弹出打印设置对话框elsejatoolsPrinter.print(myDoc ,false); // 不弹出对话框打印起先在在jasperreprot中输出格式为html 背景图一直不显示,单独放一张图片,图片上不要有其他组件,就会显示,一直没搞清楚这个问题是什么原因,但是输出格式为xhtml的时候图片就会显示。
jasperReportStudiojava报表设计(详细)
jasperReportStudiojava报表设计(详细)⼀、环境搭建 在spring-mvc.xml加⼊<!-- jasperReports--><import resource="classpath*:spring-mvc-jasperreports.xml"/>spring-mvc-jasperreports.xml具体配置代码:<beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:context="/schema/context" xmlns:mvc="/schema/mvc"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-4.2.xsd/schema/context /schema/context/spring-context-4.2.xsd/schema/mvc /schema/mvc/spring-mvc-4.2.xsd"><!-- jasperReports报表集成视图解析器 --><bean id="jasperReportsViewResolver"class="org.springframework.web.servlet.view.jasperreports.JasperReportsViewResolver"><!-- 执⾏优先级,值越⼩优先级越⾼ --><property name="order" value="0"/><!-- 处理视图返回 --><property name="viewClass" value="com.silverdata.smart.report.jasperreports.JasperReportsView"/><property name="prefix" value="/WEB-INF/jasper/"/><property name="suffix" value=".jasper"/><!-- 可通过配置此项⽤来过滤是否执⾏此视图解析器 --><!-- <property name="viewNames" value="rpt*"/> --><!-- 报表数据源 --><property name="jdbcDataSource" ref="dataSource"/><!-- 扩展参数 --><property name="exporterParameters"><map><!-- 指定格式报表的内容编码 --><entry key="net.sf.jasperreports.engine.JRExporterParameter.CHARACTER_ENCODING"><value>UTF-8</value></entry><!-- 通过Web访问时图⽚的URI --><!-- <entry key="net.sf.jasperreports.engine.export.JRHtmlExporterParameter.IMAGES_URI"><value type="ng.String">/jasper/image.jsp?image=</value></entry> --><!-- 图⽚⽬录的绝对路径 --><!-- <entry key="net.sf.jasperreports.engine.export.JRHtmlExporterParameter.IMAGES_DIR_NAME"><value type="ng.String">D:\\work\\***\\framework\\tmp</value></entry> --><!-- 是否输出图⽚到⽬录 --><!-- <entry key="net.sf.jasperreports.engine.export.JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR"><value type="ng.String">true</value></entry> --></map></property></bean></beans>jar包需要:<!-- jasperreports --><dependency><groupId>net.sf.jasperreports</groupId><artifactId>jasperreports</artifactId></dependency><dependency><groupId>net.sf.jasperreports</groupId><artifactId>jasperreports-fonts</artifactId></dependency>⼆、jasperreports报表设计步骤1.新建项⽬配置jar包若jar包unbond未找到~检查是否⽬录路径是纯英⽂的~中⽂不识别2.新建报表模版~⼀般中国的报表直接⽤空⽩A4去做3.若要⽤测试数据展现表格配置然后根据需要查询字段表~加⼊测试数据⼀般也不使⽤4.页⾯设计5.配置样式编译java代码部分:开发代码:public ModelAndView apply(ModelAndView modelAndView,@PathVariable("id") Long id) { 注释部分为⼆维码⽣成/*List<Order> list = Lists.newArrayList();Order order;for (int i = 0; i < 100; i++) {order = new Order(i, "供应商" + i, "厦门市" + i + "号楼", i % 2 == 0 ? "厦门" : "周⼝", new Timestamp(System.currentTimeMillis()));list.add(order);}ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();QRCodeUtils.encode("PE12873619284611231213", 100, 100, byteArrayOutputStream);InputStream file = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());Map<String, Object> m = new HashMap<String, Object>();m.put("QRCodeString", "PE12873619284611231213");m.put("QRCode", file);m.put("image", "E:\\ideaWorkSpace\\pipegallery\\pipegallery-operation\\src\\main\\webapp\\WEB-INF\\jasper\\silhouette.jpg");return ReportUtils.toPdf("Silhouette4", m, list);*/List<ApplyDetails> applyDetailsList = Lists.newArrayList();Map<String, Object> m = new HashMap<String, Object>();List<Map> list =materialsIeApplyDetailsService.getAllByDynamicWhere(id);MaterialsIeApply materialsIeApply=materialsIeApplyService.get(id);m.put("APPLICANT",materialsIeApply.getApplicant());//申请⼈m.put("ORDERNO",materialsIeApply.getOrderno());m.put("IEAPPLYTYPE","0".equals(materialsIeApply.getIeApplyType())?"租⽤":"使⽤");m.put("PLANGETDATE",materialsIeApply.getPlanGetDate());//领⽤时间m.put("PLANRETURNDATE",materialsIeApply.getPlanReturnDate());//归还时间m.put("AUDIT",materialsIeApply.getAuditId());//审核⼈m.put("AUDITDATE",materialsIeApply.getApplyDate());//审核时间//(0未提交、1待审核、2已审核、3未通过、4打回、5部分出库、6全部出库、7作废)m.put("APPROVALSTATE", ReturnMaterialsIeApplyString.returnString(materialsIeApply.getApprovalState()));//申请单状态m.put("APPLYDATE",materialsIeApply.getApplyDate());//申请提交时间m.put("REASON",materialsIeApply.getReason());m.put("REMARK",materialsIeApply.getRemark());m.put("AUDITOPINION",materialsIeApply.getAuditOpinion());//审核意见ApplyDetails applyDetails;for (Map map:list){applyDetails=new ApplyDetails(map.get("materialsname").toString(),map.get("suppliername").toString(),Integer.parseInt(map.get("amount").toString()),map.get("remark").toString(),map.get("spec").toString(),"1"); applyDetailsList.add(applyDetails);}return ReportUtils.toPdf("MaterialsIeApply", m, applyDetailsList);}。
基于JasperReport+iReport的SCADA系统Web报表设计与实现
INFORMATION TECHNOLOGY 信息化建设摘要:报表是信息浏览、分析、打印的有力工具,是SCADA 系统的一个重要组成部分。
基于Web开发的报表具有高性能、开放性和扩展性等优点,在各行各业得到了广泛的应用。
论文研究了Web 报表的系统结构、生成机制及设计与实现,介绍了JAVA开源报表引擎JasperReport 与IReport的相关技术。
基于Web 报表的设计实现了动态数据报表与图形报表的生成、查询与在线打印,在SCADA 系统中得到了良好的应用。
关键词:JasperReport;iReport;SCADA系统;开源;Web报表人类社会已进入信息化时代,数字信息资源在国民经济社会发展中扮演着举足轻重的角色,各行业希望可以快捷地将数据库中所关心的数据以其它相关的信息直观展现,以便于决策分析,而报表的开发就可以实现这一需求。
由于众多分布式B/S架构系统的应用,用户需要远程对大量的分布式数据进行综合统计分析,所以基于Web架构方式设计开发的报表系统是最为简洁和高效。
考虑到SCADA系统报表业务量巨大,报表的设计如果按照传统的设计方式,不仅开发成本和运行成本高,而且开发周期长。
而iReport的出现,将报表从设计到发布的过程变得更为简单[1]。
本系统所采用的是基于浏览器方式的Web报表系统,它可以满足SCADA系统操作人员方便的查看各个场站的信息。
一、JasperReport与 iReport技术对比分析JasperReports是一个功能强大的报表生成开发工具,它可以将丰富的内容输出到展示端或生成PDF、HTML、 XLS、CSV和XML文件,并提供在线报表打印。
JasperReports基于Java编写,并可在各种Java应用中用来生成内容丰富的动态数据。
它是以一种灵活而简便的方式为用户提供创建导向式的Web页面[2-5]。
JasperReports通过XML文件,来描述定义报表设计,以JDBC连接的方式来获取关系数据库数据内容。
JasperReport报表使用方法
public List<Map> getResultList(List<DrivingHistoryDataVO> dataList) {
List<Map> returnList = new ArrayList<Map>();
// 保证记录顺序不变,使用TreeMap
第四部执行编译成jasper文件
1、首先,在用iReport设计报表时将要显示中文数据的地方的属性设置如下:
Font name: 宋体 (中文字体)
PDF font name: STSong-Light
PDF Encoding: UniGB-UCS2-H(Chinese Siplified)
jrxml编译成jasper文件的步骤:
第一步:建立好java实体类(pojo)
第二步:将建立好的java类达成jar包
(此处一定要记得配置classpath读取jar文件)
第三步:设置iRport数据源(javaBeanDataSource),输入完整的全类名(包括包名)
先定义一个功能需求,然后我们展开说明。一个车辆行驶数据分析系统中需要实时获取行驶数据,这需要车载设备来实现。数据上传存储在Web端的数据库中,我们需要从数据库中获取数据来显示内容。
使用JavaBean作为数据源,首先我们要扩展JasperReport的数据源。实现方法很简单,我们定义一个类去实现net.sf.jasperreports.engine.JRDataSource接口即可,覆盖其中的方法。下面给出一个示例。
而问题又出现了,如果这两个字段自动换行了,那么必然把一行上的其他元素都给撑大了,那么还需要对其他元素进行设置。选中其他的所有元素,在属性面板的Stretch Type中选择Relative to Tallest Object就可以自适应到最高换行的元素了,显示效果就正常了。
跟我学JasperReports报表框架——JasperReport系统包中的Demo示例的功能说明
1.1跟我学JasperReports报表框架——JasperReport系统程序包中的Demo示例的功能说明1、Demo示例解压jasperreports-0.5.0-project.zip 后目录jasperreports\demo\samples下的例子为其Demo示例,要运行sample下的例子,首先要安装ant,并设置好环境变量。
如ANT_HOME 等,然后到dos方式下,到某一个sample的目录,比如到jasperreports\demo\samples\alterdesign 目录下运行ant 则会编译报表文件,运行ant view 则会展现报表。
2、各个示例的主要功能(1)alterdesign该例子演示了报表编译后,在报表展现的时候如何动态的控制其中的元素。
比如让某一个矩形变色或其他。
(2)antcompile演示如何让ant 来编译(3)chart演示了如何在报表中添加图像,JasperReport是用scriptlet的方式往报表中添加图像,而scriptlet是调用也是开源的jfreechart的Api来生成图形,去jfreechart看一下,该工具能的图形生成能力也很强。
(4)datasource演示了如何在报表中使用各种数据源,能够使用beanarray和beancollection,也可以用自定义的数据源,只要继承了JRDataSource的两个接口,这个能给用户提供非常大的灵活性,报表的数据不用局限于一条Sql语句,也可以使用存储过程,对生成报表中的数据也可以排序,二次检索,等等。
(5)fonts各种字体的演示(6)horizontal演示了水平分栏的报表,演示报表中分了三栏,其中还用到了textFieldExpression,就像if语句的效果来选择输出的内容。
(7)hyperlink演示了各种样式的链接(8)images演示了如何在报表中加入图像以及图像的显示方式。
JasperReport应用于web工程的开发步骤
//b、使用JRLoader报表加载器的loadObject()方法加载文件对象
JasperReport jasperReport = (JasperReport)JRLoader.loadObject(reportFile);
4、将IReport工具编译生成的“.jasper”文件导入;
例如:city.jasper
5、在Java或jsp中获取“xxx.japer”文件(a、根据存放路径找到文件,创建文件对象;b、用JRLoader报表加载器的loadObject()方法加载文件对象);
//a、根据存放路径找到文件,创建文件对象;
6、获取数据源;
//JDBC数据源:
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/world";
String user = "root";
String password = "xtlhdemo2013";
conn.close();
11、对响应方式进行设置;
//设置响应头,文件导出时,选择存放路径
response.setHeader("Content-Disposition", "attachment;filename=first.pdf");
//设置文件扩展名
IReport3.7开发Web报表
我已经很久没有亲自使用IReport开发报表了,记得当时用时还是零点几版本,转眼这么久过去了(估计2年了吧),今天公司要开发报表,而新同事们都不会,只好亲自上手做一个,也算是Demo吧。
再次到的官网下了一个IReport3.7.2的最新版,惊奇发现现在这东西好用多了,完全是Netbeans 框架实现的(本人可以Netbeans的忠实粉丝,一直用Netbeans开发)操作方便、人性化。
好了下面我就逐步来介绍IReport的使用,以后还打算写一个在项目中使用报表的例子。
1、下载IReport(既是废话,又套路,呵呵,就从这里开始吧)官网下载地址是:/plugins/project/project_home.php?projectname=ireport2、安装IReportIReport安装十分简单,这里就略了,否则真要被人拍砖了。
3、运行IReport直接在桌面上双击IReport图标就可以了,IReport3.7.2的闪屏还是蛮好看的,大家看看吧,如下图:进入IReport主界面后,大家会发现其和Netbeans真的是很像,毕竟一个遗传基因的,呵呵。
还是中文版的哦。
4、使用报表向导我将以一个简单报表的制作来讲解IReport制作报表时的一些常用项。
选择菜单中”文件“——>”New“(如图所示):进入报表设计的向导程序(如下图所示),在向导程序中可以选择报表模板,其它的(如风格、图表等)目前都不能用,我就选择”Blank A4“:选择”Launch Report Wizard“,系统引导你下一步(如下图所示)。
在这一步中在”Report Name“中输入报表的文件名,”Location“中指定报表文件存储目录。
选择”下一步“按钮,系统引导你配置数据源模式(如下图所示),在这里系统默认提供两种数据源模式”Empty DataSource“和”Sample Database(HSQLDB test)“,我在这里新建一个自己的数据源模式——”Javabean DataSource“。
第12章 Struts 2整合JasperReports开发
12.6.3 设计报表设计文件
使用iReport工具设计报表设计文件。为了能显示Action中的User, 需要增加三个文本字段。并配置文本字段的name属性与User类中 属性相对应。 首先找到“Document structure”视图窗口。在该视图窗口中选 择“add”→“Field”选项,打开文本字段添加对话框。通过该 对话框配置文本字段的名称以及数据类型,如图12-44所示。 添加完成文本字段后,可以将其直接拖曳到设计面板中,如图1245所示。
12.1 初涉JasperReports
12.1.1 JasperReports简介 12.1.2 下载并安装JasperReports和iReport
12.1.1 JasperReports简介
本章来推荐一款非常好的报表生成工具JasperReports。和 JFreeChart一样,JasperReports同样是开源项目,可以免 费使用。并且该项目完全由Java编写,使用它可以在Java 桌面程序或者Java Web应用中生成报表。 JasperReports功能是非常强大的,而且其非常容易上手。 只用给出一份XML格式的报表设计文件,对其进行编译、填 充、导出,就可以生成多种格式的报表文件。包括PDF、 HTML、Excel、XLS等。相比传统的只能生成HTML文档或其 他单一格式文档的报表生成工具,JasperReports显得非常 强大。 通过Struts 2提供的JasperReports插件,可以非常方便和 简单的通过JasperReports生成报表。
12.6.4 配置Action
配置该Action非常简单,只需为该Action指定一个类型为jasper的Result。 同时可以为该Result指定三个参数:location、format和dataSource,分 别用来指定jasper格式文件所在路径,生成报表格式以及报表使用数据源, 代码如下所示。
iReport 和 Jasperreport 整合开发 WEB 报表向导
iReport 和Jasperreport 整合开发WEB 报表向导本文由Jplateau 所撰写版权归属于Jplateau作者主页我是在一个星期以前接触iReport 和Jasperreport 的,下载最初它们并没有吸引我的兴趣(或信任),主要是他们的版本的问题(我一直不敢用版本都不到1.0的工具软件,目前它们的版本:iReport0.2.2, Jasperreport0.5.0),不过听说有人在用他们,于是就仔细看了一下(因为在java 应用程序的web 打印方面我一直都是采用浏览器打印,非常痛苦,所以宁可信其有不可信其无,呵呵……)一个星期下来,我针对项目中关于报表的一些需求点进行了尝试,发现他们都可以解决,真实大快人心,于是今天把他们推荐给各位。
其实我们做报表用的只是Jasperreport,iReport 是一个Jasperreport 的可视化开发工具(不要看它的界面有些简陋,我们要的操作他都可以帮我们轻松搞定。
),当然iReport 还有其他的用处,不过这里不做阐述。
目前几乎还没有中文的介绍他们整合开发的文章,尽管如此我也不准备非常详细的介绍它们,在这里我仅将我的一些经验写出来,不乏有些地方浅尝辄止,如果想细致的研究它们还请阅读它们配套的英文文档。
Jasperreport 的配套文档非常详细,该文档是收费的,不过网上有流传的电子版本,本人有幸得到一份,如果你需要可以到本人站点()获得,在此感谢Jasperreport 的为开源世界做出的贡献。
相反iReport 的文档不多,也许作者认为其足够简单,我也是经过无数的探索才有些开发的经验。
好了,让我们进入上述两者整合开发报表的历程……1.首先你要得到它们最新的版本,你可以到下边的地址下载iRport: Jasperreport: 他们的配置也很简单:iReport 解压缩以后编辑目录下的iReport.bat 文件即可,如下@echo offset JAVA_HOME=C:\jdk14set ANT_HOME=d:\antset IREPORT_HOME=C:\Documenti\progetti\iReport\iReport2\rem %ANT_HOME%\bin\ant javadocs%ANT_HOME%\bin\ant iReport是不是很简单,你只要设置相应的一些路经就可以,这里是采用ant 来运行,当然如果你没有安装ant 也不想安装它,那么也可以,不过这里我买个官子,你们自己可以到解压缩以后的目录中找到相应的运行方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JasperReport报表开发与Web项目整合V1.0
根据项目要求,需要在项目中将用户需要的数据以报表的形式展示和导出,结果类似下图
提供给用户输入JSP页面
1.新建一个JSP页面bookinfoInit.jsp,在该页作为给用户提供输入查询条件的窗口。
当用户写好查询条件后,点击“查询”按钮,进行查询。
这里可以将查询的结果立即展示给用户。
就需要在bookinfoInit.jsp中定义一个内联框架<iframe>,用来放置展示查询结果的JSP页面,我们把这个页面定义为htmlReport.jsp。
2.在bookinfoInit.jsp页面的<iframe>框架中,我们需要将htmlReport.jsp的路径给<iframe>,并将查询条件作为参数传递给htmlReport.jsp页面。
代码如下:
在这里,当用点击查询按钮时,<iframe>中连接地址src被赋值,在跳转的同时携带参数。
对于中文参数需要同时转码传输,根据参数内容可以用JavaScript提供的编码方法,如encodeURIComponent(),encodeURI()或者其他可用的方法。
document.getElementById("_listframe").src=
"<%=_base%>/system/bookinfo/htmlReport.jsp?pBookName="+encodeURIC omponent(bookName)+"&pCategory="+category+"&pBookAuthor="+encodeU RIComponent(bookAuthor)+"";
用于导出和展示报表的JSP页面
获取查询参数和解码
在htmlReport.jsp页面首先需要接收调用页面bookinfoInit.jsp传过来的参数,可以通过request.getParameter()方法接收。
如果有中文参数则需要进行解编码,java 库函数提供了解编码方法URLDecoder.decode(),接参和解码代码如:
String pBookName=
URLDecoder.decode(request.getParameter("pBookName"),"utf-8");
定义一个Map变量存放报表参数。
代码如下:
Map parameters=new HashMap();
parameters.put("pBookName",pBookName);//参数1
parameters.put("pCategory",pCategory);//参数2
……//参数n
首先需要获得数据源。
方法如下
//获得数据源,根据自己的数据源,选择合适的方式
BasicDataSource datasource=
(BasicDataSource)BeanFactory.getBean("dataSource");
Connection conn=datasource.getConnection();
获取jasper文件。
ServletContext
servletContext=this.getServletConfig().getServletContext();
File jasperFile=new
File(servletContext.getRealPath("/report/reportFiles/test1.
jasper"));
根据报表参数将数据装填进报表
JasperPrint jasperPrint=
JasperFillManager.fillReport(jasperReport,parameters,conn);以HTML格式在页面展示报表
JRHtmlExporter exporter=new JRHtmlExporter();
在页面展示报表代码:
导出XLS格式
oStream.setCharacterEncoding("UTF-8");//编码
oStream.setHeader("Content-Disposition",
"attachment;filename="+new
String(("myExcel.xls").getBytes()));//保存名
导出PDF格式
以html格式展现报表时实现上下页翻页。
定义两个变量一个为当前页,一个为末页
int pageIndex=0;
int lastPageIndex=0;
定义一个StringBuffer用来在JSP页面展示报表
StringBuffer sbuffer=new StringBuffer();
定义一个变量用来保存翻页时传递的页码信息
String pageStr=request.getParameter("pageIndex");
try{
if(pageStr!=null){
pageIndex=Integer.parseInt(pageStr);
}
}catch(Exception e){
e.printStackTrace();
}
页码的阈值,jasperPrint.getPage().size()为总页数
首页、上一页、下一页和末页四个控件是通过页面跳转实现,并在跳转时会再次从数据库读出信息。
这样就要求,页面跳转时应该携带查询数据库所用的参数以及需要显示的页面的页码数。
如下:
<a href="本页?pageIndex=0&参数1=<%=参数1%>&参数2=<%=参数2%>">首
页</a>
<a href="本页?pageIndex=<%=pageIndex-1%>&参数1=<%=参数1%>&参数
2=<%=参数2%>">上一页</a>
<a href="本页?pageIndex=<%=pageIndex+1%>&参数1=<%=参数1%>&参数
2=<%=参数2%>">下一页</a>
<a href="本页?pageIndex=<%=lastPageIndex%>&参数1=<%=参数1%>&参数
2=<%=参数2%>">尾页</a>
导出PDF和XLS格式控件。
导出时,href链接需要携带条件查询参数和导出类型,如下:
<a href="本页?expType=pdf&参数1=<%=参数1%>&参数2=<%=参数
2%>"><img src="<%=_base%>/images/pdf.gif"alt="导出PDF格式
"></a>
<a href="本页?expType=xls&参数1=<%=参数1%>&参数2=<%=参数
2%>"><img src="<%=_base%>/images/xls.gif"alt="导出XLS格式
"></a>
一些说明与可能遇到的问题的解决办法。
1)相关包版本引起的问题解决,当前项目是以Ireport5.6版本开发的jas 文件,请导入如下版本包,否则报错:
2)翻页和导出报表时在href中携带中文参数乱码,导致页面跳转后不能按输入条件查询。
在URL中传递参数,是通过HTTP报头来传递的.并不是类似于通过表单来传递,表单中传递的参数是在HTTP中的BODY中传送的.而设置字符过滤器只能起到过滤HTTP中
BODY中的参数.而TOMCAT默认是ISO8859-1的编码方式,所以你在URL中传递过去后就是乱码了.而且过滤器也不管用了.解决方法.直接改变TOMCAT的默认字符编码方式: tomcat做web服务器时,通过地址栏传中文参数时,为防止浏览器上的为乱码需在服务器server.xml中配置对应的端口中配置编码方式即可.例如:
中加入useBodyEncodingForURI="true"URIEncoding="UTF-8"就可以了.
3)本文档列举的方法可能不为通用方法,需根据自己的开发环境选择,仅供参考。