• 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$projectNamein 。

        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

  • 相关阅读:
    Django REST framework+Vue 打造生鲜超市(十一)
    Django REST framework+Vue 打造生鲜超市(十)
    Django REST framework+Vue 打造生鲜超市(九)
    Django REST framework+Vue 打造生鲜超市(八)
    SVN服务器搭建和使用(二)
    SVN服务器搭建和使用(一)
    web前端性能优化
    js数组去重
    常见的字符串隐式转换
    js中this的用法
  • 原文地址:https://www.cnblogs.com/memory4young/p/ireport-datasource-javabean.html
Copyright © 2020-2023  润新知