JasperReport报表设计总结
- 格式:doc
- 大小:160.00 KB
- 文档页数:26
jasperreport中文学习入门教程之编译报表设计
jasperreport中文学习入门教程之编译报表设计
我们在前面的章节中产生的JasperReport模板(JRXML文件)。
这个文件不能直接用于生成报告。
它必须被编译成JasperReport的“本地二进制"格式,称为Jasperfile。
在编制我们把JasperDesign对象转换成JasperReport的对象:
接口net.sf.jasperreports.engine.design.JRCompiler编译过程中起着核心的一部分。
这个接口有根据用于报表表达式语言,它可以只要编译器可以实现在运行时计算它被用Java编写的,Groovy,JavaScript的或任何其他脚本语言的几个实现。
我们可以通过以下两种方式编译JRXML文件:
1.提供编程编译。
2.编译通过ANT任务。
JRXML提供编程编译
JasperReports的API提供了一个门面类
net.sf.jasperreports.engine.JasperCompileManager用于编译JasperReport。
这个类包含几个公共静态方法编制的报告模板。
模板的源可以从文件,输入流,内存中的对象。
该jrxml文件(jasper_report_template.jrxml)的内容如下。
它被保存在目录C:\tools\jasperreports-5.0.1\test:。
为了开发报表,已经拜读了一大堆的资料,其中大部分是重复的。
可以看得出,国人还是比较热衷于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生成的文件直接显示出来,打印所使用的方式其实就是生成文件,然后调用打印来对文件进行打印。
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驱动包的路径:配置并选择数据适配器之后,我们需要指定数据查询的语句,该语句查询出的字段将直接用于报表中的数据字段。
1.1跟我学JasperReports报表框架——利用iReport工具管理Web报表的应用示例1.1.1利用iReport工具操作报表1、编译报表由于Jasperreport在运行时需要的就是一个*.jasper后缀的文件,编译过程其实就是把*.jrxml后缀的文件生成*.jasper后缀的文件。
(1)有关的菜单(2)编译过程中的状态输出(3)编译后所产生出*.java程序和*.jasper后缀的文件2、执行报表Jasperreport提供了两种运行的方式-------静态运行和动态运行,动态运行是带数据源的运行,比如带数据库运行。
前者就是静态文本运行,和数据源无关。
因此,在静态运行方式下,如果报表中出现和数据源有关的对象,则以null显示。
(1)静态运行的菜单(2)动态运行的菜单最好采用动态连接(前面已经设置了动态连接),从而能够动态地获得数据库表中的数据值。
将出现下面的结果3、预览显示报表在iReport中提供了JRViewer的预览显示方式,JRViewer是直接以C/S方式作为报表的输出格式,在JFrame框架下输出。
Jasperreport提供默认的JRViewer输出类,这是iReport 自身带的PDF格式预览。
选择其菜单然后再选择“执行报表(使用动态连结)”,将出现下面的结果4、导出为其它格式的报表iReport的出格式可以支持以下几种:PDF、HTML、CSV、JA V A2D、Excel、纯文字等形式。
选择其他格式的预览,系统会以这种格式保存到磁盘中。
保存位置读者也可以选择,在iReport菜单栏中选择Options,在其中选择Compiler标签,选择编译好的文件以及各种形式的报表保存位置。
在一些应用程序环境下,将JasperReport生成的文档从其特有的格式导出到其他更为流行的格式如PDF,HTML是非常有用的。
这样一来,其他人就可以在没有安装JasperReport 的情况下查看这些报表,特别是当这些文档要通过网络发送出去的时候。
java报表方案随着信息技术的发展,报表在企业的决策分析、业务管理和数据展示中发挥着重要的作用。
而Java作为一种高度灵活的编程语言,也为报表的生成和展示提供了丰富的解决方案。
本文将探讨几种常见的Java报表方案,分别是JasperReports、POI和BIRT。
一、JasperReports报表方案JasperReports是一个开源的Java报表生成框架,它提供了强大的报表设计和生成功能。
使用JasperReports,可以将数据从各种数据源读取出来,然后通过定义报表模板和样式进行格式化、整理和展示。
最终,可以将报表输出为PDF、HTML、Excel等多种格式。
JasperReports的核心是报表模板,它是使用XML定义的布局文件。
通过在布局文件中添加元素,设置数据源和样式,我们可以设计出丰富多样的报表。
而在应用程序中,我们可以使用Java代码来填充数据,并将数据源与报表模板进行绑定,完成报表的生成和展示。
二、POI报表方案POI(Poor Obfuscation Implementation)是Apache软件基金会下的一个开源项目,提供了Java操作各种Office文档的API。
其中,HSSF用于操作Excel文件,XSSF用于操作Excel 2007及以上版本的文件。
通过POI,我们可以使用Java代码来读取、创建和修改Excel文件,从而实现报表的生成和展示。
可以将数据逐行逐列地写入指定的单元格,设置字体、颜色、边框等样式,甚至可以插入图表和图片。
最后,将数据保存为Excel文件,就得到了我们所需的报表。
三、BIRT报表方案BIRT(Business Intelligence and Reporting Tools)是一个开源的商业智能和报表工具,由Eclipse基金会开发和维护。
BIRT提供了一套完整的报表设计、生成和展示功能,并且易于集成到Java应用程序中。
使用BIRT,我们可以通过可视化界面来设计报表模板,其中包括布局、数据源和样式。
JasperReport制作⾏内容合并的表格效果图:实现思路⼀:交叉表另⼀个思路:普通表格缺点:⽆法实现内容垂直居中显⽰准备⼯作⼀、数据准备DROP TABLE IF EXISTS `address_item_sex_value`;CREATE TABLE `address_item_sex_value` (`id` int(11) NOT NULL AUTO_INCREMENT,`address` varchar(255) DEFAULT NULL,`sex` varchar(255) DEFAULT NULL,`item` varchar(255) DEFAULT NULL,`value` int(11) DEFAULT NULL,`proportion` int(11) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=34DEFAULT CHARSET=utf8;-- ------------------------------ Records of address_item_sex_value-- ----------------------------INSERT INTO `address_item_sex_value` VALUES ('1', '城区', '男⽣', '指标1', '2', '50');INSERT INTO `address_item_sex_value` VALUES ('2', '远郊', '男⽣', '指标1', '3', '40');INSERT INTO `address_item_sex_value` VALUES ('3', '近郊', '男⽣', '指标1', '1', '60');INSERT INTO `address_item_sex_value` VALUES ('9', '城区', '⼥⽣', '指标1', '3', '40');INSERT INTO `address_item_sex_value` VALUES ('10', '远郊', '⼥⽣', '指标1', '5', '50');INSERT INTO `address_item_sex_value` VALUES ('11', '近郊', '⼥⽣', '指标1', '4', '60');INSERT INTO `address_item_sex_value` VALUES ('15', '城区', '男⽣', '指标2', '6', '70');INSERT INTO `address_item_sex_value` VALUES ('16', '远郊', '男⽣', '指标2', '3', '50');INSERT INTO `address_item_sex_value` VALUES ('17', '近郊', '男⽣', '指标2', '5', '30');INSERT INTO `address_item_sex_value` VALUES ('18', '城区', '⼥⽣', '指标2', '7', '20');INSERT INTO `address_item_sex_value` VALUES ('19', '远郊', '⼥⽣', '指标2', '3', '10');INSERT INTO `address_item_sex_value` VALUES ('20', '近郊', '⼥⽣', '指标2', '6', '50');INSERT INTO `address_item_sex_value` VALUES ('21', '城区', '男⽣', '指标3', '2', '50');INSERT INTO `address_item_sex_value` VALUES ('22', '远郊', '男⽣', '指标3', '3', '40');INSERT INTO `address_item_sex_value` VALUES ('23', '近郊', '男⽣', '指标3', '1', '60');INSERT INTO `address_item_sex_value` VALUES ('25', '城区', '⼥⽣', '指标3', '3', '40');INSERT INTO `address_item_sex_value` VALUES ('26', '远郊', '⼥⽣', '指标3', '5', '50');INSERT INTO `address_item_sex_value` VALUES ('27', '近郊', '⼥⽣', '指标3', '4', '60');INSERT INTO `address_item_sex_value` VALUES ('28', '城区', '男⽣', '指标4', '6', '70');INSERT INTO `address_item_sex_value` VALUES ('29', '远郊', '男⽣', '指标4', '3', '50');INSERT INTO `address_item_sex_value` VALUES ('30', '近郊', '男⽣', '指标4', '5', '30');INSERT INTO `address_item_sex_value` VALUES ('31', '城区', '⼥⽣', '指标4', '7', '20');INSERT INTO `address_item_sex_value` VALUES ('32', '远郊', '⼥⽣', '指标4', '3', '10');INSERT INTO `address_item_sex_value` VALUES ('33', '近郊', '⼥⽣', '指标4', '6', '50');⼆、设置SQL与字段SELECT report.address_item_sex_value.id,report.address_item_sex_value.address,report.address_item_sex_value.sex,report.address_item_sex_value.item,report.address_item_sex_value.value,1 aFROM report.address_item_sex_value order by report.address_item_sex_value.addressSQL中有⼀个空闲的字段a、有⼀个默认值。
报表设计基础及JasperReort,JFreeChart简明教程摘要本文先从通用的角度定义了与报表相关的各种概念。
然后介绍了怎么应用JasperReport和Ireport设计报表,最后介绍了怎么使用JfreeChart生成图形报表。
文章中出现的很多概念和定义都出自作者自己的思考,没有通用性,在阅读时请不必深究它的准确性。
1、什么是报表,什么是报表应用程序1.1 什么是报表报表是数据统计结果的呈现。
常见的报表格式有表格、数据立方体(多维表)、曲线图、直方图、饼图等等,其中以表格最为常见。
总结各种报表的共同特征,可以这样来定义报表的结构。
一般来说,Report = Title + Page(s) + Report FooterPages(s)表示一个报表可能有一页或多页Page = PageHeader + Content + PageFooterContent则代表真正的数据,它一般由若干列和若干行组成。
Content = ColumnHeader + Row(s) + ColumnFooter一个报表的结构可以表示为下图所示的树形:这棵树中的所有叶结点,就构成了报表的实体。
一个叶结点一般称作一个Band,从上到下排列,一个Report的组成如下图所示:下图是一个报表的例子。
它有3页。
1.2 计算机上的报表与报表应用程序可以利用计算机处理数据和界面设计的功能来生成、展示报表。
计算机上的报表的主要特点是动态化。
已经有各种各样的计算机报表设计工具,它们一般提供格式设计和数据填充等功能。
广义地讲,EXCEL、WORD、甚至写字板都可以算作报表设计工具,但是它们没有定义专门的报表结构,也无法实现报表格式和报表数据的动态决定,无法实现计算机报表的“动态化”特性,也就是说不能用它来开发“报表应用程序”,所以它们一般不能视为报表设计工具。
而所谓报表应用程序,指的是能够在运行时动态地决定报表格式和报表数据的应用程序,它必须要实现数据格式和数据内容之间的分离,也就是报表和数据源之间的分离。
JasperReport使⽤⼼得1. JasperReport 报表⽂件视图化⽣成⼯具iReport。
iReport做为⼀个⽣成JasperReport的视图⼯具,和我们是使⽤的⼤多数报表创建⼯具没有太⼤的差别,都是拖控件,搭出报表的样⼦,和⽔晶报表差不多。
但是iReport有⼀个不同的地⽅,它的存储⽂件是是⼀个.jrxml的⽂件,是⼀个纯xml⽂件,编译后会产⽣⼀个.jasper的⽂件,这两个⽂件,在构建报表的时候都是需要的。
note: 1. 拖完页⾯,编译⼀下,可以发现新建的⽂件中的⼀些错误,例如页⾯中使⽤的值是否在dataSource的Fields中定义。
2. JasperReport 中有⼀个⾮常简单的dataSource:net.sf.jasperreports.engine.data.JRBeanCollectionDataSource可以使⽤。
它有⼀个构造⽅法,可以传⼊⼀个集合来产⽣这个dataSource。
例如:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{collectionList}) 就是建⽴⼀个以collectionList作为数据的数据源。
在report中我们就可以使⽤$F{Field}(是collectionList<Bean> Bean中的属性)来得到List中每个Bean的数据了。
2.JasperReport ⽣成report// 编译.jrxml⽂件pileReportToFile("testJasperReport.jrxml"), context.getRealPath("testJasperReport.jasper"));// 加载jasperFile reportFile = new File("testJasperReport.jasper");JasperReport jasperReport = (JasperReport)JRLoader.loadObject(reportFile.getPath());// 填充Report parameters 是⼀个Map,new net.sf.jasperreports.engine.JREmptyDataSource()表⽰我们不需要传⼊是个空DataSource// 将数据和xml组合,⽣成需要的打印⽂件JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new net.sf.jasperreports.engine.JREmptyDataSource()); // 将jasperPrint输出到html页⾯上JRHtmlExporter exporter = new JRHtmlExporter();request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "image?image=");// 设置分页exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "<br style='page-break-before:always;'>");System.out.println("jasperreports html print stop");exporter.exportReport();附: ireport在服务器中发布出现问题及其解决⽅案 1. 报表打印⽂件(.jasper)⽆法⽣成,有找不对象错误,造成原因为⽂件系统空间不⾜。
JasperReport教程之报表设计在JRXML模板(或JRXML文件)中的JasperReport都是标准的XML文件,以.JRXML扩展。
所有JRXML文件包含标签<jasperReport>,作为根元素。
这反过来又包含许多子元素(所有这些都是可选的)。
JasperReport框架,可以处理不同类型的数据源。
在本教程中,我们将展示如何生成一个基本的报表,只是通过传递Java数据对象(使用Java Bean)集合传给JasperReport引擎。
最后报表应显示的人的名单的名字和国家。
本章介绍如何设计一个JasperReport。
下面的步骤将在本章中:∙创建一个JRXML报表模板。
∙预览XML报表模板。
创建一个JRXML报表模板创建JRXML文件,该文件是jasper_report_template.jrxml使用文本编辑器,并保存此文件按照我们的环境设置,在C:\tools\jasperreports-5.0.1\test。
<queryString><![CDATA[]]></queryString><field name="country"class="ng.String"><fieldDescription><![CDATA[country]]></fieldDescription></field><field name="name"class="ng.String"><fieldDescription><![CDATA[name]]></fieldDescription></field><columnHeader><band height="23"><staticText><reportElement mode="Opaque"x="0"y="3"width="535"height="15"backcolor="#70A9A9"/><box><bottomPen lineWidth="1.0"lineColor="#CCCCCC"/> </box><textElement/><text><![CDATA[]]></text></staticText><staticText><reportElement x="414"y="3"width="121"height="15"/><textElement textAlignment="Center"verticalAlignment="Middle"><font isBold="true"/></textElement><text><![CDATA[Country]]></text></staticText><staticText><reportElement x="0"y="3"width="136"height="15"/><textElement textAlignment="Center"verticalAlignment="Middle"><font isBold="true"/></textElement><text><![CDATA[Name]]></text></staticText></band></columnHeader><detail><band height="16"><staticText><reportElement mode="Opaque"x="0"y="0"width="535"height="14"backcolor="#E5ECF9"/><box><bottomPen lineWidth="0.25"lineColor="#CCCCCC"/> </box><textElement/><text><![CDATA[]]></text></staticText><textField><reportElement x="414"y="0"width="121"height="15"/><textElement textAlignment="Center"verticalAlignment="Middle"><font size="9"/></textElement><textFieldExpression class="ng.String"><![CDATA[$F{country}]]></textFieldExpression></textField><textField><reportElement x="0"y="0"width="136"height="15"/><textElement textAlignment="Center"verticalAlignment="Middle"/><textFieldExpression class="ng.String"><![CDATA[$F{name}]]></textFieldExpression></textField></band></detail></jasperReport>下面是在上述报表模板主要字段的详细信息:∙<queryString>:这是空的(因为我们传递的数据通过Java Beans)。
总结本文主要是基于我在项目开发中,使用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填写完整后,可测试一下是否可以连接。
JasperReports最终用户手册中文版第四章报表设计jasperreports最终用户手册中文版第四章报表设计第四章报告设计thereportdesignrepresentsatemplatethatwillbeusedbythejasperreportsenginetodeli verdynamiccontenttotheprinter,tothescreenortotheweb.datastoredinthedatabaseiso rganizedduringthereportfillingprocessaccordingtothisreportdesigntoobtainreadyt oprint,pageorienteddocuments.通常,“报告设计”包括数据填充后形成的文件的结构和内容有的其他方面的信息。
这些信息包括将要输出到报表上的各种文本,图像元素的位置,内容,以及要进行的数据计算,自定义计算,分组,操作等信息。
通常情况下,报表设计包含所有与文档结构和视图相关的信息,这些信息将在提供数据时生成。
这些信息涉及文档中出现的各种文本或图形元素的位置和范围、它们的外观、生成文档时应执行的客户计算、数据分组和数据处理等。
一般,“报表设计(reportdesign)”用一种特殊的结构定义在xml文档中(我们会在稍后详细分析),在被填充数据前,这一过程属于jasperreports报表的编辑阶段。
但是“报表设计(reportdesign)”也可以用jasperreportsapi以编程的方式在内存中构造.随jasperreports项目源文件一起提供了一个noxmldesign(noxmldesign)例子介绍了如何直接在内存中创建“报表设计(reportdesign)”,而不用编辑xml文档。
4.1 DTD文件参考用xml文档来编辑“报表设计(reportdesign)”时,jasperreports用它自己内部专用的验证本文件内容的DTD文件。
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);}。
ireport+jasperreport使用心得记录使用iReport + JasperReport 交叉报表添加数据的流程:在Java中使用JRDataSource填充Sub Dataset:1.在iReport的报表模板的parameters中添加一个parameter,为其设定名字,并设定其Parameter Class为Object,设定其Default value expression字段的值为null,否则ireport会报空指针错误2.创建一个sub dataset,为其设定一个名字,并在其fields中加入Crosstab所需要的各个字段,数据源选择empty datasource即可3.在summary中创建一个crosstab,选择其dataset为第2步建立的sub dataset,并利用这个dataset的fields字段创立crosstab4.右键点击Report Inspector栏中的crosstab,选择Crosstab data,在下面Dataset run中选择Sub dataset为刚才建立的sub dataset,在其Connection/Datasource exp中选择User datasource expression,在底下的expression栏中填入:$P{第一步建立的Parameter的名字}5.在java代码中,填充时首先建立一个Map<String,Object>的parameters map以便在fill时为parameters赋值,在这个parameters map中添加所有ireport中的手动创建的parameters,特别注意添加第一步时创建的parameter,key为其设定的名字,值为一个JRDataSource6.填充报表时需要注意,如果没有其他detail数据时,需要填充一个JREmptyDataSource作为替代,例子如:JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters,new JREmptyDataSource());7.利用生成的JasperPrint 利用JasperExportManager生成结果文件即可iReport导出pdf的中文不显示问题:在iReport中选定需要输入中文的字段,将其Pdf Font name修改成STSong-Light,并将其Pdf Encoding设定为UniGB-UCS2-H (Chinese Simplified) ,勾上Pdf Embedded,这样就可以了如果还是不能生成中文,则将iTextAsian的jar包加入到iReport 的选项的classPath下即可,同理,在使用JasperFillManager填充的时候也必须在环境中添加此jar包。
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连接的方式来获取关系数据库数据内容。
Ireport+JasperReport制作报表⼆-JasperReport编译模板1. JasperFillManager:填充管理,主要的⽅法如下:fillReport:填充报表,多态函数,返回值为JasperReport,参数为报表和报表参数Map,参数Map⾥包括Parameters、DataSource等,如果是从数据库取数据还要有connection参数;fillReportToFile:填充报表⽣成⽂件,多态函数,⽆返回值,参数为源⽂件、⽬标⽂件和报表参数Map。
2. JasperExportManager:导出管理,主要⽅法如下:exportReportToPdfFile:导出PDF⽂件,多态函数,提供⼏种⽅式:从源⽂件导出到⽬标⽂件、从JasperPrint导出到⽬标⽂件、从源⽂件流导出⽬标⽂件,如果枚举的话有9种⽅式,⽆返回值。
exportReportToHtmlFile:导出HTML⽂件,同上exportReportToXmlFile:导出XML⽂件,同上3. JasperPrintManager:打印管理,主要⽅法如下:printReportToPdfFile:把报表导出成PDF⽂件,然后⾃⼰打印;printReport:直接打印报表,多态函数,提供⽂件名、⽂件流或JasperReport直接启动打印,返回值true/false;printPages:同printReport,但参数增加了页数选择。
4. JasperCompileManager:编译管理,把.jrxml⽂件编译成.jasper⽂件,主要⽤到的⽅法只有⼀个,compileReportToFile:多态函数,参数.jrxml⽂件名或者JasperDesign、InputStream和输出.jasper⽂件名5. JRRewindableDataSource:定义⼀个可以往回查看记录的⽅式的接⼝,主要⽅法是moveFirst移动到第⼀⾏,是JavaBean和TableModel等数据源的祖先。
为了开发报表,已经拜读了一大堆的资料,其中大部分是重复的。
可以看得出,国人还是比较热衷于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生成的文件直接显示出来,打印所使用的方式其实就是生成文件,然后调用打印来对文件进行打印。
看起来是不是很简单,对,确实很简单。
笔者主要从事基于B/S模式的开发,相信大部分人的使用也是基于web进行使用。
故笔者对于基于web的开发进行详细讲述。
1、工程环境配置。
将以下包加入WEB-INF/lib中。
commons-beanutils-1.7.jar;commons-collections-2.1.jar;commons-digeste r-1.7.jar;commons-logging-1.0.2.jar;commons-logging-api-1.0.2.jar;ite xt-1.3.1.jar;jasperreports-1.3.3.jar;jdt-compiler-3.1.1.jar;jxl-2.6.j ar;png-encoder-1.5.jar;poi-2.0-final-20040126.jar以上包是jasperReport必须。
2、iReport的安装这个很简单,直接下一步就可以了。
3、使用iReport生成 .jasper文件.jasper是经过编译的japserReport模板,即.jrxml编译后的。
对于iReport的使用网络上已经有了详细的中文的文档,具体可以下载附件查看。
使用.jasper文件可以避免在系统中再进行编译,增加系统的压力。
4、数据填充数据填充是相对于比较重要的一步,数据填充的目的是为了将数据填充进去,生成一个JapserPrint对象。
笔者在之前已经阐述过,现在主要是基于关系型数据库(比较简单的,没有权限控制的),以及基于JavaBean Collection进行数据填充。
进行数据填充的基本就是一定要实现JRDataSource,JRDataSource定义了二个方法,一个是指针移动的方法next(),另一个是取值的getFieldValue ()方法,用来取值填充。
对于关系型数据库,即直接利用数据库的表来生成报表的,只需要传入一个Java Connection即可。
JasperReport已经有了个默认的实现的JRDataSource的接口了。
对于Java Conncetion的获得,笔者建议使用工厂方法或者使用Spring方式来获得。
可以参照笔者写的如下:java 代码1./**2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.3. * @author Jimmy.Shine 2007-5-114. */5.package .reachway.framework.report;6.7.import java.sql.Connection;8.import java.sql.DriverManager;9.10.import .reachway.framework.exception.JasperReportException;11.12./**13. * Used for get a JDBC connection for Jasper Report14. */15.public class JDBCConnection {16. /**17. * Which Jdbc driver were used. Like: "net.sourceforge.jtds.jdbc.Driver"18. */19. private String jdbcDriver;20. /**21. * The jdbc url,define which database server,which db. Like:22. * "jdbc:jtds:sqlserver://192.168.1.50:1433;DatabaseName=JAVA5;SelectMethod=Cursor"23. */24. private String jdbcUrl;25.26. private String dbUser;27.28. private String dbPassword;29.30. public String getDbPassword() {31. return dbPassword;32. }33.34. public void setDbPassword(String dbPassword) {35. this.dbPassword = dbPassword;36. }37.38. public String getDbUser() {39. return dbUser;40. }41.42. public void setDbUser(String dbUser) {43. this.dbUser = dbUser;44. }45.46. public String getJdbcDriver() {47. return jdbcDriver;48. }49.50. public void setJdbcDriver(String jdbcDriver) {51. this.jdbcDriver = jdbcDriver;52. }53.54. public String getJdbcUrl() {55. return jdbcUrl;56. }57.58. public void setJdbcUrl(String jdbcUrl) {59. this.jdbcUrl = jdbcUrl;60. }61.62. public JDBCConnection() {63. super();64. }65. /**66. * Get the Connection67. * @return connection68. * @throws JasperReportException69. */70. public Connection getConnection() throws JasperReportException{71. Connection con;72. try {73. check();74. Class.forName(this.jdbcDriver);75. con = DriverManager.getConnection(this.jdbcUrl, this.dbUser,this.dbPassword);76. return con;77. } catch (Exception e) {78. e.printStackTrace();79. throw new JasperReportException("Get JDBC Connection Error");80. }81. }82.83. /**84. * Check the Configure85. * @throws JasperReportException86. */87. private void check() throws JasperReportException {88. if (this.jdbcDriver == null || this.jdbcDriver.equals("") ||this.jdbcUrl == null || this.jdbcUrl.equals("")89. || this.dbUser == null || this.dbUser.equals("") || this.dbPassword == null) {90. throw new JasperReportException("Jdbc Configure error!");91. }92. }93.94.}95.java 代码1./**2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.3. * @author Jimmy.Shine 2007-5-144. */5.package .reachway.framework.report.dataSource;6.7.import net.sf.jasperreports.engine.JRDataSource;8.import net.sf.jasperreports.engine.JRException;9.import net.sf.jasperreports.engine.JRField;10.11./**12. * 报表的dataSource的基类,所有利用DataSource产生报表的继承此类13. */14.public abstract class ReportDataSource implements JRDataSource{15.16. /**17. * 取值18. */19. public abstract Object getFieldValue(JRField jrField) throws JRException;20.21. /**22. * 指针移动23. */24. public abstract boolean next() throws JRException;25.26.}27.这样可以共用配置文件中的jdbc连接的相关参数。