- 浏览: 281652 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jim8757:
能提供下完整的代码吗?
实例解析java + jQuery + json工作过程(登录) -
befairy:
收藏,谢谢LZ
基于Java、jQuery应用的账务管理系统开源了(09.3.19更新) -
Gilbert_Sam:
我看过这本书,很好,看到二十几章的地方,结果网站就登陆不上,写 ...
Linux C编程一站式学习 http://learn.akae.cn/ -
ljy520zhiyong:
这个网址进入不了呀
Linux C编程一站式学习 http://learn.akae.cn/ -
蜀山红日:
如果后台要向前台返回复杂数据该怎么办呢
实例解析java + jQuery + json工作过程(登录)
共三篇,下接:http://jimmy-shine.iteye.com/blog/123595
为了开发报表,已经拜读了一大堆的资料,其中大部分是重复的。可以看得出,国人还是比较热衷于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-digester-1.7.jar;commons-logging-1.0.2.jar;commons-logging-api-1.0.2.jar;itext-1.3.1.jar;jasperreports-1.3.3.jar;jdt-compiler-3.1.1.jar;jxl-2.6.jar;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方式来获得。可以参照笔者写的如下:
源自:http://www.iteye.com/topic/78678
/** * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd. * @author Jimmy.Shine 2007-5-11 */ package cn.com.reachway.framework.report; import java.sql.Connection; import java.sql.DriverManager; import cn.com.reachway.framework.exception.JasperReportException; /** * Used for get a JDBC connection for Jasper Report */ public class JDBCConnection { /** * Which Jdbc driver were used. Like: "net.sourceforge.jtds.jdbc.Driver" */ private String jdbcDriver; /** * The jdbc url,define which database server,which db. Like: * "jdbc:jtds:sqlserver://192.168.1.50:1433;DatabaseName=JAVA5;SelectMethod=Cursor" */ private String jdbcUrl; private String dbUser; private String dbPassword; public String getDbPassword() { return dbPassword; } public void setDbPassword(String dbPassword) { this.dbPassword = dbPassword; } public String getDbUser() { return dbUser; } public void setDbUser(String dbUser) { this.dbUser = dbUser; } public String getJdbcDriver() { return jdbcDriver; } public void setJdbcDriver(String jdbcDriver) { this.jdbcDriver = jdbcDriver; } public String getJdbcUrl() { return jdbcUrl; } public void setJdbcUrl(String jdbcUrl) { this.jdbcUrl = jdbcUrl; } public JDBCConnection() { super(); } /** * Get the Connection * @return connection * @throws JasperReportException */ public Connection getConnection() throws JasperReportException { Connection con; try { check(); Class.forName(this.jdbcDriver); con = DriverManager.getConnection(this.jdbcUrl, this.dbUser, this.dbPassword); return con; } catch (Exception e) { e.printStackTrace(); throw new JasperReportException("Get JDBC Connection Error"); } } /** * Check the Configure * @throws JasperReportException */ private void check() throws JasperReportException { if (this.jdbcDriver == null || this.jdbcDriver.equals("") || this.jdbcUrl == null || this.jdbcUrl.equals("") || this.dbUser == null || this.dbUser.equals("") || this.dbPassword == null) { throw new JasperReportException("Jdbc Configure error!"); } } }
/** * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd. * @author Jimmy.Shine 2007-5-14 */ package cn.com.reachway.framework.report.dataSource; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRField; /** * 报表的dataSource的基类,所有利用DataSource产生报表的继承此类 */ public abstract class ReportDataSource implements JRDataSource { /** * 取值 */ public abstract Object getFieldValue(JRField jrField) throws JRException; /** * 指针移动 */ public abstract boolean next() throws JRException; }
这样可以共用配置文件中的jdbc连接的相关参数。
对于其它的数据源,JavaBean Collection,笔者采用了一个抽象类,使用抽象类的目的,是为了使开发者尽可能不用直接接触jasperReport(此为笔者自己的方式,笔者是PM,为了考虑底下的人的开发)。以下为抽象类以及笔者提供的一个sample:
- ireport-cn-1.part1.rar (4.8 MB)
- 下载次数: 6307
- ireport-cn-1.part2.rar (4.8 MB)
- 下载次数: 5181
- ireport-cn-1.part3.rar (2.6 MB)
- 下载次数: 4778
/** * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd. * @author Jimmy.Shine 2007-5-14 */ package cn.com.reachway.framework.report.dataSource; import java.util.ArrayList; import java.util.List; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRField; /** * 利用JavaBean Collection生成ReportDataSource的例子 */ public class ReportDataSourceSample extends ReportDataSource { private List docs = new ArrayList(); private int index = -1; public ReportDataSourceSample() { for (int i = 0; i < 10; i++) { Document doc = new Document("ViewTimes is:" + i, i); this.docs.add(doc); } } // 内部类,作为demo时使用 private class Document { private String name; private int viewTimes; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getViewTimes() { return viewTimes; } public void setViewTimes(int viewTimes) { this.viewTimes = viewTimes; } public Document() { } public Document(String name, int viewTimes) { this.name = name; this.viewTimes = viewTimes; } } public List getDocs() { return docs; } public void setDocs(List docs) { this.docs = docs; } @Override public Object getFieldValue(JRField jrField) throws JRException { String fieldName = jrField.getName(); Document doc = this.docs.get(index); if ("name".equals(fieldName)) { return doc.getName(); } if ("viewTimes".equals(fieldName)) { return doc.getViewTimes(); } return null; } @Override public boolean next() throws JRException { index++; return (index < this.docs.size()); } }java 代码
以上的例子应当很清楚的写明了如何生成数据源。
对于数据源的填充,笔者使用了二个类,分别用来对应使用Connction及JavaBean Collection进行填充。
/** * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd. * @author Jimmy.Shine 2007-5-12 */ package cn.com.reachway.framework.report.jasperPrint; import java.io.File; import java.sql.Connection; import java.util.Map; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.util.JRLoader; import cn.com.reachway.framework.exception.JasperReportException; /** * 使用报表模板及数据等来生成JapserPrint */ public class JasperPrintWithConnection { /** 传入的参数 */ private Map params; /** 模板文件的地址 */ private String reportFilePath; /** JDBC connection */ private Connection con; public Connection getCon() { return con; } public void setCon(Connection con) { this.con = con; } public Map getParams() { return params; } public void setParams(Map params) { this.params = params; } public String getReportFilePath() { return reportFilePath; } public void setReportFilePath(String reportFilePath) throws JasperReportException { if (reportFilePath == null || !reportFilePath.endsWith(".jasper")) throw new JasperReportException("您传入的模板文件格式不对,请传入以.jasper为后缀的文件!"); this.reportFilePath = reportFilePath; } public JasperPrintWithConnection() { super(); } public JasperPrintWithConnection(String reportFilePath, Map params, Connection con) throws JasperReportException { if (reportFilePath == null || !reportFilePath.endsWith(".jasper")) throw new JasperReportException("模板文件格式不对,请传入以.jasper为后缀的文件!"); if (con == null) throw new JasperReportException("Conncetion不应当为null!"); this.setReportFilePath(reportFilePath); this.setParams(params); this.setCon(con); } /** * 取得JasperPrint * @return * @throws JasperReportException */ public JasperPrint getJasperPrint() throws JasperReportException { File reportFile = new File(this.reportFilePath); if (!reportFile.exists()) throw new JasperReportException("传入的模板文件不存在!"); try { // Load编译好的模板 JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath()); // 进行数据填充 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, this.params, this.con); return jasperPrint; } catch (JRException jre) { jre.printStackTrace(); throw new JasperReportException("在进行数据填充时发生了错误中,请检查是否是数据库连接错误或者是用来填充的参数map有误!"); } } }
/** * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd. * @author Jimmy.Shine 2007-5-14 */ package cn.com.reachway.framework.report.jasperPrint; import java.io.File; import java.util.Map; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.util.JRLoader; import cn.com.reachway.framework.exception.JasperReportException; /** * */ public class JasperPrintWithDataSource { /** 传入的参数 */ private Map params; /** 模板文件的地址 */ private String reportFilePath; /** dataSrouce */ private JRDataSource dataSource; public JRDataSource getDataSource() { return dataSource; } public void setDataSource(JRDataSource dataSource) { this.dataSource = dataSource; } public Map getParams() { return params; } public void setParams(Map params) { this.params = params; } public String getReportFilePath() { return reportFilePath; } public void setReportFilePath(String reportFilePath) throws JasperReportException { if (reportFilePath == null || !reportFilePath.endsWith(".jasper")) throw new JasperReportException("您传入的模板文件格式不对,请传入以.jasper为后缀的文件!"); this.reportFilePath = reportFilePath; } public JasperPrintWithDataSource() { super(); } public JasperPrintWithDataSource(String reportFilePath, Map params, JRDataSource dataSource) throws JasperReportException { if (reportFilePath == null || !reportFilePath.endsWith(".jasper")) throw new JasperReportException("模板文件格式不对,请传入以.jasper为后缀的文件!"); if (dataSource == null) throw new JasperReportException("DataSource不应当为null!"); this.setReportFilePath(reportFilePath); this.setParams(params); this.setDataSource(dataSource); } /** * 取得JasperPrint * @return * @throws JasperReportException */ public JasperPrint getJasperPrint() throws JasperReportException { File reportFile = new File(this.reportFilePath); if (!reportFile.exists()) throw new JasperReportException("传入的模板文件不存在!"); try { // Load编译好的模板 JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath()); // 进行数据填充 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, this.params, this.dataSource); return jasperPrint; } catch (JRException jre) { jre.printStackTrace(); throw new JasperReportException("在进行数据填充时发生了错误中,请检查是否是数据库连接错误或者是用来填充的参数map有误!"); } } }java 代码
其中使用的JasperReportException为笔者定义的异常,用来统一处理报表异常。
5、报表产生
报表产生是程序中最终可见的一部分,在jasperReport的demo中,大部分中使用了jasperReport的net.sf.jasperreports.j2ee.servlets.*中的类来生成。其实这也算是开源的产品的一个问题,其实jasperReport提供的report的工具,只能算是demo级别的,不能算是产品级别的。相信很多的朋友在使用的时候就碰上无法生成的问题。笔者在此基础上封装了一下。
具体参见以下:
发表评论
-
自定义js延时函数
2010-03-26 11:38 4479setTimeout不是真正意义上的延时函数,而且在表单提交后 ... -
ssh jar包配置
2009-11-27 11:31 2272本文中ssh指:struts2,srping2.5,hib ... -
每个项目中,你不得不知的11个Java第三方类库
2009-11-02 09:06 1076Java第三方library ecosystem是一个很广阔的 ... -
J2EE学习中一些值得研究的开源项目
2009-08-10 10:07 1148这篇文章写在我研究J2SE、J2EE近三年后。前3年 ... -
对JXL包的研究(java操作excel)
2009-06-25 07:44 1502对JXL包的研究(java操作excel) 在开源世界中,有两 ... -
java类中成员的装载顺序你知道吗
2009-04-03 08:18 975最近去参加了SCJP培训,相信对于绝大多数的JAVA工作者来说 ... -
java操作word文件
2009-03-31 15:41 1685一个jacob操作Word的例子 import java. ... -
Java操作PDF文件(iText)
2009-03-31 15:32 5854然jacob中也有关于PDF的方法,但是过于复杂。iText是 ... -
java对excel操作
2009-03-31 15:11 1442从Excel文件读取数据表 Java Excel API既可 ... -
JAVA解析XML的四种方法
2009-03-31 08:49 1392XML现在已经成为一种通 ... -
Java:集合类性能分析
2009-03-20 20:41 19271.Java 集合框架图 -集合接口:6个接口(短虚 ... -
在看commons-lang.jar包源码时候的一些发现及实践
2009-03-11 10:55 3591通常,我们在完成一个标准的JavaBean的时候,都需要同时完 ... -
解决大批量数据导出Excel产生内存溢出的方案(二)
2009-03-11 10:42 6295客户要求一次导出20w行数据,这就要求导出的文件必须带shee ... -
解决大批量数据导出Excel产生内存溢出的方案
2009-03-11 10:41 5393POI或者JXL在导出大量数据的时候,由于它们将每一个单元格生 ... -
java语言的反射机制1
2009-03-11 10:23 1090java语言的反射机制为是java语言所提供的一项特别吸引人的 ... -
Java获取各种常用时间方法(二)
2009-03-11 09:43 1024//获得本年最后一天的日期 * ... -
Java获取各种常用时间方法
2009-03-11 09:40 1181本人之前做的项目中积累常用的时间方法,贴出来与大家共享,如果哪 ... -
JavaSE6.0 Web Service学习笔记(二)
2009-03-11 09:30 7377JavaSE6.0下的Web Service 从JavaSE6 ... -
JavaSE6.0 Web Service学习笔记(一)
2009-03-11 09:24 1407Web Service概述 Web Service ... -
JDK5.0 Annotation学习笔记(一)
2009-03-11 09:22 938背景知识: 从JDK5开始提供名为Annotat ...
相关推荐
JasperReport报表设计总结
jasperreport报表开发小结,使用ireport设计报表模板,javabean作为数据源,整合springboot实现在线预览和导出各种格式的报表
jasperReport 进行报表开发 可以输出HTML ,JSP,PDF等格式
使用ireport和struts2进行报表设计的简单示例,生成普通报表和饼图、柱状图。java工程的lib里包含丰富的jar包,且很多都是从各个网站下载的最新版本,文件夹内还包含一些ireport和jasperreport文档,适合刚入门学习...
iReport-JasperReport 报表开发指南,PDF格式,里面带有图文,入门性质的教程
JasperReport 中交叉报表指南
使用Spring2.5+Struts2+ibatis+jasperreport3.1.4 实现Struts2与Jasperreport报表结合
JasperReport6.4.0报表设计,webSpringmvc,maven,idea,请使用jdk1.7
JasperReport报表成型框架,可直接导入Myeclipse使用,附带文档有相关解释。
springboot整合JasperReport实现报表功能文章所需的全部资源
ireport-5.6.0 Jasperreport 报表工具 jar包大全Two
JasperReport 水晶报表 , 支持子报表 多数据源。
ireport-5.6.0 Jasperreport 报表工具 jar包大全
JasperReports作为一种优秀且开源的报表引擎,不利用太可惜了。同时,借助开源的JasperReports模板设计利器iReports,可以可视化的设计报表模板。基于Web的报表在很多项目中都是需要的。而随着Struts2的流行,就应该...
iReport-5.6.0 Jasperreport
jasperreport 6.4.1报表动态列,以及生成导出html,可直接导入到eclipse中进行运行,包含一个完整的demo
子报表的列子刚开始学的不知道如何下手,看了这个例子都明白了