• 1. JasperReport 与iReport --Java报表应用教程第一讲 JasperReport 与iReport的基础知识
  • 2. 本章目标JasperReport 简介。 iReport简介。 iReport几个重要的概念。 JasperReport报表结构。 使用iReport 制作报表。 java参数传递。
  • 3. JasperReport 简介JasperReport 是一款报表打印组件,是开放源代码组织sf.net 中的一个java 报表打印工程,JasperReport 的最新版本可以从http://jasperreports.sourceforge.net/index.html 下载得到。JasperReport 适合用来做WEB 应用程序与Java Application 的报表打印组件,而且关键的一点是:JasperReport 是免费的!
  • 4. JasperReport 简介一个报表是由一个源代码的文件来描述,这个源文件就是由DTD(jasperreport.dtd, version 0.6.3 is listed in Appendix B)来定义的XML标记。在0.5.3版本中它的源文件扩展名变成了.jrxml; 取代了一般的.xml扩展名。报表的源代码被编译成jasper文件(扩展名是.jasper)。 jasper文件是一种预报表,严密的说就像是java的类被封状成的对象。Jasper文件通过你的应用程序来加载。它被添加一个数据源的标记从而创建报表,接着它就能以你想要的格式输出(例如:pdf或xls)。
  • 5. iReport简介iReport 也是开源组织sf.net 中的一款免费软件,其主要作用是用来以可视化的方式设计生成JasperReport 所使用的报表格式文件,因为JasperReport 本身并未提供很好的可视化报表设计工具,iReport 的出现正好弥补了这个缺陷。 现在的iReport 的最新版本是3.7.2,iReport 可以从http://ireport.sourceforge.net 下载得到,注意下载的iReport 一定要与你所使用的JasperReport 版本相匹配,当然也可以更新iReport 中所使用的JasperReport 组件。 iReport运行时需要sun java2 SDK 1.5及以上版本,为了能编译我们的报表文件我们需要完整的安装JDK。
  • 6. iReport简介
  • 7. iReport几个重要的概念iReport 的输出格式:PDF、HTML、CSV、JAVA2D、Excel、纯文字、JRViewer,其中最常用的是PDF、JRViewer。 报表的动态对象变量、参数、字段 字段(Fields):是数据库抽取出来的,希望在报表中出现的数据库内容。比如一个ID的所有值。$F{ filedsName } 参数(Parameters):这是你的应用需要提供给报表的入口,比如你希望在报表被解释的时候提供Where语句的条件值,那么就可以使用参数(Parameters)。$P{ parameterName } 变量(Variables):这是报表中一些逻辑运算的表现,比如统计值。$V{ variablesName }
  • 8. iReport几个重要的概念编译、静态运行、动态运行 Jasperreport 运行时需要的就是一个jasper后缀的文件,编译过程其实就是把jrxml后缀的文件生成jasper后缀的文件。 静态运行和动态运行是相对的,后者带数据源运行,比如带数据库运行。前者就是静态文本运行,和数据源无关,如果报表中出现和数据源有关的对象,则以null显示。
  • 9. 报表结构报表被垂直分成若干个部分,每一个部分我们叫它“band”。每一个band都有自己的特性,在报表生成的时候有些会打印一次,有些会打印多次。报表的结构大致是几个部分:title、pageHeader、columnHeader、detial、columnFooter、pageFooter、summary、groupHeader、groupfooter。如下图:
  • 10. 报表结构Title:title 段只在整个报表的第一页的最上面部分显示,除了第一页,不管报表中有多少个页面也不会再出现Title band 中的内容。就是报表的标题。 pageHeader:pageHeader 段中的内容将会在整个报表中的每一个页面中都会出现,显示的位置在页面的上部。如果是报表的第一页,pageHeader 中的内容将显示在Title Band 下面,除了第一页以外的其他所有页面中,pageHeader 中的内容将显示在页面的最上端,即页眉。报表的一些公共要素,比如页码、创建时间、创建人等信息放置在这里是比较好的选择。 columnHeader:无可非议的这里是放置列的名称,记住不是列数据。 Detial:报表内容段,在这个Band 中设计报表中需要重复出现的内容,Detail 段中的内容每页都会出现。比如销售记录数据。 columnFooter:放置列级别的统计计算值或是列的说明。 pageFooter:显示在所在页面的最下端,即页脚。放置页级别的统计值或是页的说明。
  • 11. 报表结构Summary:表格的合计段,出现在整个报表的最后一页中的Detail band 的后面,一般用来统计报表中某一个或某几个字段的合计值。可能需要对几页(你的报表可能有几个页组成)的统计值。比如50个销售记录共占用了3页,那么放置这些统计记录的统计值最好的地方就是summary。 groupHeader:每个表的内容可能需要根据某个属性进行划分显示内容和计算内容,比如希望以月份为单位每组分开显示销售记录,那么就可以定义一个组,groupHeader就是放置组说明或是组标志最好的地方。 Groupfooter:放置组的统计或是说明 lastPageFooter:内容将会出现在报表的最后一页的最后部分。
  • 12. 使用iReport 制作报表的详细过程第一步:新建一个报表,如下图所示
  • 13. 使用iReport 制作报表的详细过程第一步:选择保存路径与数据库连接,如下图所示
  • 14. 使用iReport 制作报表的详细过程第一步:查询数据,生成字段,如下图所示:
  • 15. 使用iReport 制作报表的详细过程第一步:查询数据分组,新建报表完成,如下图所示:
  • 16. 使用iReport 制作报表的详细过程说明:如何新建一个数据库连接,如下图所示:
  • 17. 使用iReport 制作报表的详细过程说明:如何新建一个数据库连接,如下图所示:
  • 18. 使用iReport 制作报表的详细过程第二步:编辑报表,如下图所示:
  • 19. 使用iReport 制作报表的详细过程第二步:编辑报表,在报表中的各个band分别放置如下内容:
  • 20. 使用iReport 制作报表的详细过程第二步:编辑报表,将要显示的字段拖到“detail”栏内:
  • 21. 使用iReport 制作报表的详细过程第三步:查看报表执行结果,编译报表:点击“Preview”
  • 22. 使用iReport 制作报表的详细过程第三步:查看报表执行结果,编译报表:
  • 23. java参数传递基本类型作为参数传递的例子public class Test1 {        public static void main(String[] args) {         int n = 3;         System.out.println("Before change, n = " + n);         changeData(n);         System.out.println("After changeData(n), n = " + n);     }               public static void changeData(int nn) {         n = 10;     } } 基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的,输出的结果证明了这一点: Before change, n = 3 After changeData(n), n = 3
  • 24. java参数传递对象作为参数传递的例子public class Test2 {        public static void main(String[] args) {         StringBuffer sb = new StringBuffer("Hello ");         System.out.println("Before change, sb = " + sb);         changeData(sb);         System.out.println("After changeData(n), sb = " + sb);     }               public static void changeData(StringBuffer strBuf) {         strBuf.append("World!");     } } 先看输出结果: Before change, sb = Hello After changeData(n), sb = Hello World! 从结果来看,sb的值被改变了,那么是不是可以说:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。
  • 25. java参数传递我们对上面的例子稍加改动一下public class Test3 {        public static void main(String[] args) {         StringBuffer sb = new StringBuffer("Hello ");         System.out.println("Before change, sb = " + sb);         changeData(sb);         System.out.println("After changeData(n), sb = " + sb);     }               public static void changeData(StringBuffer strBuf) {            strBuf = new StringBuffer("Hi ");            strBuf.append("World!");     } } 运行一下这个程序,你会发现结果是这样的: Before change, sb = Hello After changeData(n), sb = Hello
  • 26. java参数传递先看Test2这个程序: StringBuffer sb = new StringBuffer("Hello "); 这一句执行完后,就会在内存的堆里生成一个sb对象,请看图1: 如图1所示,sb是一个引用,里面存放的是一个地址“@3a”(这个“@3a”是我举的代表内存地址的例子,你只需知道是个内存地址就行了),而这个地址正是“Hello ”这个字符串在内存中的地址。
  • 27. java参数传递changeData(sb); 执行这一句后,就把sb传给了changeData方法中的StringBuffer strBuf,由于sb中存放的是地址,所以,strBuf中也将存放相同的地址,请看图2: 此时,sb和strBuf中由于存放的内存地址相同,因此都指向了“Hello”。 strBuf.append("World!"); 执行changeData方法中的这一句后,改变了strBuf指向的内存中的值,如下图3所示
  • 28. java参数传递 所以,Test2 这个程序最后会输出: After changeData(n), sb = Hello World! 再看看Test3这个程序。 在没有执行到changeData方法的strBuf = new StringBuffer(“Hi “);之前,对象在内存中的图和上例中“图2”是一样的,而执行了strBuf = new StringBuffer(“Hi “);之后,则变成了:
  • 29. java参数传递 此时,strBuf中存放的不再是指向“Hello”的地址,而是指向“Hi ”的地址“@3b” 了,new操作符操作成功后总会在内存中新开辟一块存储区域。        strBuf.append("World!");        而执行完这句后,
  • 30. java参数传递通过上图可以看到,由于sb和strBuf中存放地址不一样了,所以虽然strBuf指向的内存中的值改变了,但sb指向的内存中值并不会变,因此也就输出了下面的结果: After changeData(n), sb = Hello String类是个特殊的类,对它的一些操作符是重载的,如: String str = “Hello”; 等价于String str = new String(“Hello”); String str = “Hello”; str = str + “ world!”;等价于str = new String((new StringBuffer(str)).append(“ world!”)); 因此,你只要按上面的方法去分析,就会发现String对象和基本类型一样,一般情况下作为参数传递,在方法内改变了值,而原对象是不会被改变的。
  • 31. java参数传递综上所述,我们就会明白,在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。
  • 32. (本页无文本内容)
  • 33. 谢 谢2010年05月24日