第11章JasperReports和iReport报表工具(第3/3部分)
1.1利用iReport工具创建报表
iReport报表可视化设计器工具软件是与JasperReport 报表引擎相配合使用的一个工具软件,因为JasperReport报表引擎本身只提供有丰富的系统类库、但并未提供有操作简洁方便的可视化报表设计工具,而iReport软件则能够弥补它的不足。在报表设计和开发实现中,将它们相互配合使用将会进一步提高开发的效率。
1.1.1使用iReport工具中的Report Wizard向导创建报表
1. 创建SQL查询语句以获得数据库表结构信息
读者可以选中iReport工具中的【档案】菜单中的【报表精灵】子菜单,将弹出下图11.30所示的对话框。在该对话框中的【SQL query】输入框中输入查询功能的SQL语句:本示例为select * from bbs,请见下图11.30中的示例操作结果的截图。
图11.30 创建SQL查询语句以获得数据库表结构信息
2、选择在报表模板中所需要的目标字段
读者在上图11.30所示的对话框中点击其中的【Next】下一步按钮后,将出现下图11.31所示的对话框。读者可以根据在报表中所需要显示的数据要求,选择在报表模板文件中所需要的各个目标字段——请见下图11.31所示的对话框中的各个字段,将左边框中的各个字段名添加到右边框中。
图11.31选择在报表模板中所需要的目标字段
3、选择报表的布局模板和显示风格
读者在上图11.31所示的对话框中点击【Next】下一步按钮后,将出现下图11.32所示的对话框。在该对话框中根据报表模板的风格要求选择iReport工具中所提供的报表布局模板——本示例选择classicC.xml类型的报表模板,请见下图11.32所示的最终选择的结果截图。
图11.32 选择报表的布局模板
读者在上图11.32所示的对话框中点击【Next】下一步按钮后,将出现下图11.33所示的配置成功的对话框。读者点击其中的【结束】按钮,完成本示例的配置过程。
图11.33 配置成功的对话框示图
最后,iReport工具将产生出下图11.34所示的显示风格的报表模板内容。读者然后保存该报表模板文件到磁盘文件中,最终的操作结果请见下图11.34所示。
图11.34 本示例最终的操作结果截图
4、编译和预览报表模板
(1)编译报表模板文件
读者选择iReport工具程序中的【建立】菜单中的【编译】子菜单项目,iReport工具程序将自动地对在图11.34示图中所创建出的报表文件进行编译,编译完成后将在编译的路径中生成一个*.jasper文件——请见下图11.35所示的操作结果的截图。
图11.35 编译报表模板文件后所产生出的结果文件
另外,在生成*.jasper文件的同一个目录下,iReport工具程序会自动地生成一个Java
源程序文件,在该源程序文件中主要包含有报表的特定元素——如字段、参数(Parameters)和变量(Variables)等的定义,以及一些求值的表达式。
(2)预览报表模板文件
读者选择iReport工具程序中的【建立】菜单下的某一种预览模式——本示例选择【HTML预览】子菜单项目,然后再选择【执行报表(使用动态连结)】子菜单项目。请见下图11.36所示的操作过程的截图。
图11.36 以某种预览模式预览报表模板文件
当读者按照图11.36所示的要求选中【HTML预览】子菜单项目后,iReport工具程序将显示输出报表模板文件的内容,读者最终能够看到下图11.37所示的结果示例图。
图11.37 本示例的HTML预览方式下的结果
1.1.2利用iReport工具操作报表模板文件
1、利用iReport工具编译报表模板文件
由于Jasperreport在运行时需要的是一个*.jasper后缀的文件,编译过程其实也就是把*.jrxml后缀的文件生成*.jasper后缀文件的过程。
(1)与示例实现有关的菜单
读者选择【建立】菜单下的【编译】子菜单项目,iReport工具将自动地编译在图11.34示图中的报表模板文件,请见下图11.38所示的操作过程的截图。
图11.38 选择iReport工具中的【编译】子菜单项目
(2)编译过程中输出各种状态提示信息
在iReport工具编译报表模板文件的过程中,会在控制台中显示输出编译过程中的各种状态提示信息——读者依据这些状态提示信息可以了解在报表模板中是否存在错误以及存在什么方面的错误,请见下图11.39所示的显示输出状态信息的截图。
图11.39 在控制台中显示输出编译过程中的各种状态提示信息
(3)编译后还将产生出*.java源程序和*.jasper后缀的报表对象文件
iReport工具成功地编译完报表模板文件后,它还将在当前的目录路径下产生出*.java 源程序和*.jasper后缀的报表对象文件,请见下图11.40所示的执行结果的截图。
图11.40 编译后所还将产生出*.java源程序和*.jasper后缀的报表对象文件
2、执行报表模板文件
iReport工具提供了两种运行报表模板文件的方式:静态运行和动态运行,所谓的动态运行也就是带数据源的运行——直接连接和访问数据库表中的数据,而静态运行是不连接目标数据源的——因此在预览时将无法看到动态的数据值,如果在报表模板文件中出现和数据源有关的对象内容时,都以null显示——请见下图11.42中的显示结果的截图。(1)静态运行报表模板文件
读者可以选择【建立】菜单下的【执行报表】子菜单项目,iReport工具将会以静态的方式执行报表模板文件,请见下图11.41所示的操作过程的截图。
图11.41选择iReport工具中的【执行报表】子菜单项目
当读者按照图11.41中的操作方法选择了iReport工具中的【执行报表】子菜单项目后,iReport工具将开始执行报表模板文件,并出现下图11.42所示的静态预览的报表结果。
图11.42 以静态方式执行报表模板文件的显示结果
(2)动态运行报表模板文件
为了能够真正地预览出所设计出的报表最终的效果,应该要动态运行报表模板文件,从而能够动态地获得数据库表中的数据值。读者可以选择【建立】菜单下的【执行报表(使用动态连结)】子菜单项目,iReport工具将会以动态的方式执行报表模板文件,请见下图11.43所示的操作过程的截图。
图11.43 以动态方式执行报表模板文件
当读者按照图11.43中的操作方法选择了iReport工具中的【执行报表(使用动态连结)】子菜单项目后,iReport工具将开始执行报表模板文件,并出现下图11.44所示的结果。
图11.44 以动态方式执行报表模板文件的显示结果
3、预览显示报表模板文件
在iReport工具中提供了一个内带的JRViewer预览工具的预览显示方式,但JRViewer 是直接以Java应用程序(Application)的方式作为报表的输出界面。在iReport工具中提供默认的JRViewer输出类,这是iReport自身内带的PDF格式的报表预览程序类。
(1)选择JRViewer预览菜单
读者可以选择【建立】菜单下的【JRViewer预览】子菜单项目——该菜单为选项型菜单,iReport工具将会启动自身内带的PDF格式的报表预览程序。请见下图11.45所示的操作过程的截图。
(2)使用动态连结执行报表
当读者选中了【JRViewer预览】子菜单项目后,表明要采用iReport工具中默认的JRViewer预览程序,然后再选择【建立】菜单下的【执行报表(使用动态连结)】子菜单项目,将出现下图11.46所示的执行结果的局部截图,其中的各个数据值都来源于数据库表。
图11.46预览显示本示例的报表模板文件的结果
4、将报表模板导出为其它格式的报表
iReport工具支持将报表模板导出为PDF、HTML、CSV、JA V A2D、Excel、纯文字等多种不同的格式,将iReport工具生成的报表模板文件从其特有的格式导出到其他更为流行的通用格式如PDF、HTML是非常有实用价值的——可以满足在这种平台下的用户浏览的要求。作者在下文中为读者介绍具体的实现方法。
(1)输出为PDF格式的报表
读者首先选择【建立】菜单下的【PDF预览】子菜单项目,表示需要将报表模板导出为PDF格式的文档——请见下图11.47所示的操作过程的截图。
图11.47 将报表模板导出为PDF格式的菜单项目的截图
当读者按照图11.47中的操作方法选择了iReport工具中的【PDF预览】子菜单项目后,然后再选择其中的【执行报表(使用动态连结)】菜单项目——请见下图11.48所示的操作过程的截图,iReport工具将开始执行报表模板文件,并出现下图11.49所示的结果。
图11.48 选择【执行报表(使用动态连结)】菜单项目
iReport工具成功地导出报表模板文件后,将出现下图11.49所示的PDF格式的结果文件——请见下图11.49所示的文件名称为“我的第一个报表”的PDF格式的文件。
图11.49 将本示例的报表模板文件导出为PDF格式文件的结果
(2)导出为Excel格式的文件
读者首先选择【建立】菜单下的【Excel预览】子菜单项目,表示需要将报表模板导出为微软Office Excel格式的文档——请见下图11.50所示的操作过程的局部截图。
图11.50 将报表模板导出为Excel格式的菜单项目的截图
iReport工具成功地将报表模板文件导出为Excel文档后,将出现下图11.51所示的Excel 格式的结果文件内容——请见下图11.51所示的Excel格式文件的预览结果。
图11.51 将报表模板文件导出为Excel格式文件的预览结果
iReport工具也可以导出为其它格式的文件,操作方法与前面介绍的导出为PDF格式的文件和导出为Excel格式的文件的操作方法相同,作者在此不再重复说明。
1.2本章小结
1.2.1本章的学习重点
JasperReports报表引擎和配套的iReport报表设计工具能够帮助开发人员简化对企业报表的设计和开发实现,比直接采用iText类库或者Jakarta的POI项目中的HSSF接口编程实现报表更具有灵活性。而且在应用JasperReports报表引擎进行报表开发可以采用编程实现或者配合利用iReport报表设计工具可视化开发实现,这也将能够更好地满足开发人员的不同项目中的需要。
作者建议读者在学习本章的内容时,重点掌握JasperReports报表引擎和配套的iReport 报表设计工具进行报表设计和开发实现的方法,特别是对于初次接触JasperReports报表引擎的读者来说,不仅能够减轻学习中的负担,而且也还能够对所设计出的报表有一个直观的了解。
1.2.2本章的学习难点
读者在应用JasperReports报表引擎编程开发报表时,由于其API类库设计的比较丰富,这反而会给初次接触JasperReports报表引擎的读者带来在学习方面的复杂性——感觉到无从下手!
为此,希望读者仔细区分JasperCompileManager类(完成对报表的编译工作)、JasperFillManager类(实现报表的数据装填)、JasperPrintManager(打印报表)和JasperExportManager(导出报表)类各自的功能。
1.2.3本章的学习要点
由于JasperReports报表引擎可以实现将报表转换为不同格式的报表文档,因此在应用JasperReports报表引擎时需要添加多个系统库文件,否则在应用中将会出现运行时的错误——请读者再仔细查看图11.5中所说明的各个系统库文件的名称。
在报表的设计和开发实现中,为了能够简化开发的实现过程,一般都采用首先在iReport 报表设计工具软件中设计出报表模板文件,然后再利用JasperReports报表引擎的系统库编程处理报表模板文件的开发实现方式。
1.2.4本章练习
1、什么是企业应用系统中的报表?报表的组成元素一般有哪些?
2、为什么说报表在企业应用系统开发中非常重要?请说明你所见过的各种形式的报表?它们都有什么特点?
3、JasperReports开源报表引擎是什么?请描述JasperReports报表引擎的工作原理及技术特点?
4、请说明JasperCompileManager、JasperFillManager、JasperPrintManager和JasperExportManager类的主要作用是什么?它们分别都包含有哪些常用的方法?
5、请读者设置自己机器中的iReport设计器工具软件的工作环境,并为课程设计中的项目设计和实现一个报表——报表的数据内容自行定义。
《集合框架及泛型》作业 一、根据课上讲解内容,完成演示示例和课堂练习 1、ArrayList获取并打印新闻标题 需求说明:按照以下实现的步骤,使用ArrayList获取和打印新闻标题,显示效果如下图所示: (1)创建多个各类新闻标题对象,包含ID、名称和创建者三个属性; (2)创建存储各类新闻标题的集合对象; (3)按照顺序依次添加各类新闻标题,使用add()方法; (4)获取新闻标题的总数,使用size()方法; (5)根据位置获取相应新闻标题、逐条打印每条新闻标题的名称,使用for 循环遍历。 2、ArrayList存储狗狗信息 需求说明:按照以下实现的步骤,使用ArrayList存储狗狗信息,使用ArrayList的方法对狗狗信息进行删除、读取和判断,显示效果如下图所示:(1)存储多条狗信息,获取狗总数,逐条打印出各条狗信息; (2)删除指定位置的狗,使用remove()方法; (3)判断集合中是否包含指定狗,使用contains()方法;
3、LinkedList添加和删除新闻标题 需求说明:在作业1的基础上,换用LinkedList存储新闻数据,并且使用LinkedList的getFirst()和getLast()方法获取第一条和最后一条数据,以及removeFirst()和removeLast()方法删除第一条和最后一条数据,输出效果如下图所示。 4、集合头尾位置删除和条件狗信息 需求说明:按照作业3的实现方式和所用到LinkedList的方法,实现狗狗信
息的更新并输出,输出效果如图所示。 5、使用Iterator和增强型for循环遍历Set 需求说明:按照以下实现的步骤,使用Iterator和增强型for循环遍历Set,输出效果如下图所示: (1)创建多个各类新闻标题对象,包含ID、名称和创建者三个属性; (2)创建存储各类新闻标题的集合对象; (3)按照顺序依次添加各类新闻标题; (4)获取新闻标题的总数; (5)使用iterator()获取Iterator对象; (6)使用Iterator遍历集合,使用hasNext()方法作为循环条件,判断是否存在另一个可访问的元素; (7)使用增强型for遍历集合;
实验十泛型与集合框架 1.实验目的 1、掌握LinkedList
Java 语言程序设计 C 实验报告 集合框架及泛型机制 学生姓名 专业、班级 指导教师 成绩 计算机与信息工程学院 年月日
一、实验目的 学习课程相关章节知识,通过上机练习,掌握以下知识: 1.掌握 List 接口下 ArrayList 及 LinkedList 的使用方法。 2.掌握 Map 接口下 HashMap 及 HashTable的使用方法 3.掌握集合中泛型的使用 二、实验内容 利用集合完成象数据库那样存储数据,并且可以简单查询,利用 map 存储学生信息,字段如下: id ,name,age,实现步骤: (1)创建类,类图如下: (2)在 main 方法编写逻辑代码 (3)运行程序并测试结果 package https://www.doczj.com/doc/7c1274879.html,; public class Student { private String name ; private int age ; private String id ;
public String getName() { return name ; } public void setName(String name ) { this . name =name ; } public int getAge() { return age ; } public void setAge(int age ) { this. age=age ; } public String getId() { return id; } public void setId(String id) { this. id=id; } public Student(String name ,int age , String id ) { super(); this. name =name ; this. age=age ; this. id=id; } public void sayHi() { System.out.println("name=" +this.getName()+"age=" + this .getAge()+" " + "id=" + this.getId()); } }
Java语言程序设计C 实验报告 集合框架及泛型机制 学生姓名 专业、班级 指导教师 成绩 计算机与信息工程学院 年月日 一、实验目的 学习课程相关章节知识,通过上机练习,掌握以下知识:
1.掌握List接口下ArrayList及LinkedList的使用方法。 2.掌握Map接口下HashMap 及HashTable的使用方法 3.掌握集合中泛型的使用 二、实验内容 利用集合完成象数据库那样存储数据,并且可以简单查询,利用map存储学生信息,字段如下: id ,name,age,实现步骤: (1)创建类,类图如下: (2)在main方法编写逻辑代码 (3)运行程序并测试结果 package com、cn; public class Student { private String name; private int age; private String id; public String getName() { return name; } public void setName(String name) {
this、name = name; } public int getAge() { return age; } public void setAge(int age) { this、age = age; } public String getId() { return id; } public void setId(String id) { this、id = id; } public Student(String name, int age, String id) { super(); this、name = name; this、age = age; this、id = id; } public void sayHi() { System、out、println("name="+this、getName()+"age="+this、getAge()+" "+"id="+this、getId()); } } //Databace类 package com、cn; import java、util、Collection; import java、util、HashMap; import java、util、Iterator; public class Databace { private Student a; public Databace() { super(); map=new HashMap
任务一:用LinkedList存放对象 1.利用面向对象的思想,创建以下类: ●Person类,包含Person的姓名和身份证号码,覆盖Object类的toString() 方法,显示“姓名:XXX 身份证号:XXX”。 ●Student类,继承Person类,包含学生的语文、数学、英文课的成绩,并覆盖 父类的toString()方法,显示“姓名:XXX 身份证号:XXX 语文:XXX 数学:XXX 英文:XXX”。 ●Teacher类,继承Person类,包含教师的工资。并覆盖父类的toString()方 法,显示“姓名:XXX 身份证号:XXX 工资:XXX”。 ●public class Person implements Comparable{ ●String name; ●String ID; ●Person(String s,String i){ ●name=s; ●ID=i; } ●public String toString() { ●String str="姓名:"+name+" 身份证号码:"+ID; ●return str; } ●public int compareTo(Object arg0) { ●Person p=(Person)arg0; ●return https://www.doczj.com/doc/7c1274879.html,pareTo(p.ID); } } ●class Student extends Person { ●int Chinese; ●int Math; ●int English; ●Student(String n,String i,int c,int m,int e){ ●super(n,i); ●Chinese=c; ●Math=m; ●English=e; } ●public String toString() { ●String str; ●str=" 语文成绩:"+Chinese+" 数学成绩:"+Math+" 英语成绩: "+English; ●return super.toString()+str; ●} ●} ●class Teacher extends Person{ ●int salary; ●Teacher(String n,String i,int s){ ●super(n,i); ●salary=s; ●}
浙江大学城市学院实验报告 课程名称面向对象程序设计 实验项目名称集合框架与泛型 学生姓名专业班级学号 一. 实验目的和要求 1. 了解Java集合框架的接口和实现类 2. 理解泛型类、泛型接口、泛型方法的特点 3. 掌握List
泛型与集合框架 1.实验目的 1、掌握LinkedList
java 集合框架(习题) 集合框架 Key Point * Collection 接口、Set 接口、List 接口基本操作 * List 接口及其实现类 * Set 接口及其实现类 * 迭代遍历 * Hash 算法与hashCode 方法 * Comparable 接口 * Map 接口及其实现类 * 遍历Map * 泛型 练习 1. 填空 Collection 接口的特点是元素是对象; List 接口的特点是元素有(有|无)顺序,可以(可以|不可以)重复; Set 接口的特点是元素无(有|无)顺序,不可以(可以|不可以)重复;Map 接口的特点是元素是键值对,其中值可以重复,键不可以重复。 2. (List)有如下代码 import java.util.*; public class TestList{ public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(1, “Learn”); list.add(1, “Java”); printList(list); } public static void printList(List list){ for(Object obj:list){ String str=(String)obj; System.out.println(obj); } } } 要求: 1) 把//1 处的代码补充完整,要求输出list 中所有元素的内容 2) 写出程序执行的结果Hello java Learn World 3) 如果要把实现类由ArrayList 换为LinkedList,应该改哪里?ArrayList 和LinkedList 使用上有什么区别?实现上有什么区别?
实验13 集合框架与泛型 一、实验目的和要求 1. 了解Java集合框架的接口和实现类 2. 理解泛型类、泛型接口、泛型方法的特点 3. 掌握List