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编辑  收藏  举报

导航