iReport —— 使用 JavaBean 作为数据源
在制作报表时,想直接使用Java代码提供数据。
网上找了一些文章,很多都是用Servlet做的。我不是想通过浏览器来观察它的输出。我想使用iReport的动态连接直接预览。
结合一些资料,加上自己的摸索终于成功了。
现整理如下:
-
需要的环境
JDK + iReport + Eclipse + PDF Reader
如果Eclipse没有的话也没关系,iReport需要的只是Java文件编译后的class文件。
-
Java部分(Eclipse)
1、JavaBean
一个简单 JavaBean —— Student。
1 package ds.javabean; 2 /** 3 * 4 * 5 * @author by Young.ZHU 6 * on 2012-8-3 7 * 8 * Package&FileName: ds.javabean.Student 9 */ 10 public class Student { 11 //~ Instance fields ******************************************************** 12 // 序号 13 private int id; 14 // 姓名 15 private String name; 16 // 性别 17 private String gender; 18 // 出生年月 19 private String birthday; 20 21 //~ Constructors *********************************************************** 22 public Student() { 23 } 24 public Student(int id, String name, String gender, String birthday) { 25 this.id = id; 26 this.name = name; 27 this.gender = gender; 28 this.birthday = birthday; 29 } 30 31 //~ Methods **************************************************************** 32 public int getId() { 33 return id; 34 } 35 public void setId(int id) { 36 this.id = id; 37 } 38 39 public String getName() { 40 return name; 41 } 42 public void setName(String name) { 43 this.name = name; 44 } 45 46 public String getGender() { 47 return gender; 48 } 49 public void setGender(String gender) { 50 this.gender = gender; 51 } 52 53 public String getBirthday() { 54 return birthday; 55 } 56 public void setBirthday(String birthday) { 57 this.birthday = birthday; 58 } 59 }
2、Factory
iReport在使用JavaBean作为数据源时需要一个Factory。主要用来生成报表数据。
1 package ds.javabean; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 6 /** 7 * 生成JavaBean的工厂类。 8 * 在iReport的DataSource的配置中会用到。 9 * 10 * @author by Young.ZHU 11 * on 2012-8-3 12 * 13 * Package&FileName: ds.javabean.StudentFactory 14 */ 15 public class StudentFactory { 16 //~ Static fields/initializers ********************************************* 17 18 // 生成实体对象的个数 19 private static final int RECORD_COUNT = 100; 20 21 //~ Methods **************************************************************** 22 23 /** 24 * 这个方法在iReport的DataResource配置时也会用到 25 * 必须是静态方法 static 26 * 27 * @return 28 */ 29 public static Collection<Student> createBeanCollection() { 30 Collection<Student> beanCollection = new ArrayList<Student>(); 31 32 for (int i = 0; i < RECORD_COUNT; i++) { 33 beanCollection.add(StudentUtil.createStudent(i + 1)); 34 } 35 36 return beanCollection; 37 } 38 }
3、Student的工具类
该类用来产生Student实例。主要是为了报表的数据不那么单调。
1 package ds.javabean; 2 3 import java.text.DateFormat; 4 import java.text.SimpleDateFormat; 5 6 import java.util.Date; 7 import java.util.Random; 8 9 10 /** 11 * 随机生成Student实体对象的工具类 12 * 13 * @author by Young.ZHU 14 * on 2012-8-3 15 * 16 * Package&FileName: ds.javabean.StudentUtil 17 */ 18 public class StudentUtil { 19 //~ Static fields/initializers ********************************************* 20 21 /* 22 * “姓”的字符数组 23 */ 24 private static String[] FIRST_NAME_ARR = { 25 "赵", 26 "钱", 27 "孙", 28 "李", 29 "王", 30 "张", 31 "慕容", 32 "上官", 33 "东方", 34 "朱" 35 }; 36 37 /* 38 * 其他中文数组 39 */ 40 private static String[] LAST_NAME_ARR = { 41 "燕", 42 "岩", 43 "艳", 44 "明", 45 "建国", 46 "小刚", 47 "小娟", 48 "华", 49 "天明", 50 "洋", 51 "盈盈", 52 "仁" 53 }; 54 55 /* 56 * 性别 57 */ 58 private static String[] GENDER_ARR = { 59 "男", 60 "女" 61 }; 62 private static DateFormat DATE_FORMATER = new SimpleDateFormat( 63 "yyyy年MM月dd日"); 64 65 //~ Methods **************************************************************** 66 67 public static Student createStudent(int id) { 68 String firstName = getRandomCharFromArray(FIRST_NAME_ARR); 69 String lastName = getRandomCharFromArray(LAST_NAME_ARR); 70 String name = firstName + lastName; 71 72 String gender = GENDER_ARR[new Random().nextInt(1000) % 2]; 73 74 String birthday = getRandomDate(); 75 76 return new Student(id, name, gender, birthday); 77 } 78 79 80 private static String getRandomCharFromArray(String[] arr) { 81 Random random = new Random(); 82 int index = random.nextInt(arr.length); 83 84 return arr[index]; 85 } 86 87 /** 88 * 随机生成一个比当前日期小的日期 89 * 90 * @return (yyyy年MM月dd日) 91 */ 92 private static String getRandomDate() { 93 Date date = new Date(); 94 long dateMill = date.getTime(); 95 96 Random random = new Random(); 97 dateMill = (long) (random.nextDouble() * dateMill); 98 99 return DATE_FORMATER.format(new Date(dateMill)); 100 } 101 }
-
报表设计(iReport)
报表的设计部分就不多说了。
主要说一下,如何使用Java类向报表中传数据。
1、设置classpath
iReport使用JavaBean时使用的是Java的class文件。所以需要制定classpath,让iReport知道到哪去找那些class文件。
工具栏 > Options > Classpath (如果iReport是英文版本,请自己对照),出现下图的界面。
a、点击 添加文件夹 ,找到上面提到的几个Java类的class文件的路径。笔者使用的是Eclipse,而且建的是Java Project,所以笔者的路径是 $workspace\$projectName\bin 。
b、点击 Save Classpath 。
(注:设置完成后,请重启iReport。有时在视图上的修改不能及时显示,可以多试几次。还是显示不出来,重启吧!不知道是不是iReport的bug。笔者使用的版本是2.0.1)
2、设置数据源
工具栏 > Data > 连接/资料来源 。
在弹出的界面中,点击 New 按钮。
在接下来弹出的界面中,选中 JavaBeans set data source ,点击 Next 。
出现如下图的界面。
a、Name ,给你的datasource取个名字,例如:MyJavaBeanTest
b、Factory class ,就是上面的工厂类,包括包名和Java文件名
c、method ,工厂类里的那个静态方法。注意方法名要对应。名字可以任取。
3、向报表填充值
工具栏 > Data > 报表查询 ,出现如下界面。
a、选中 JavaBean Data Source 选项卡。
b、在 Class name 栏里,填入JavaBean类,包括包名和Java文件名。
c、点击 Read attributes 。可以看到下面的栏里显示出了JavaBean的属性。
d、选中相关属性,点击 Add Selected Field(s) 。
e、点击 OK 。
经历过上面的步骤,可以看到在你的报表文件的视图中,Fields栏里多了刚刚加上的属性。
将各属性拖放到相应的位置。如图。
好了。看看效果吧!
在菜单栏里,点击 执行报表(使用动态连结),如图。
如果配置了多个数据源的话,请注意动态连结的数据源是否正确。
预览效果如下:
P.S. 其中的Java源代码和iReport的报表文件(jrxml)已打包上传到网上。有兴趣的可以看看。
下载地址:http://download.csdn.net/detail/zhuyang7654321/4475107
posted on 2013-08-18 21:37 Memory4Young 阅读(7395) 评论(0) 编辑 收藏 举报