您的位置:首页 > 编程语言 > Java开发

iReport —— 使用 JavaBean 作为数据源

2013-08-18 21:37 411 查看
在制作报表时,想直接使用Java代码提供数据。

网上找了一些文章,很多都是用Servlet做的。我不是想通过浏览器来观察它的输出。我想使用iReport的动态连接直接预览。

结合一些资料,加上自己的摸索终于成功了。

现整理如下:

需要的环境

JDK + iReport + Eclipse + PDF Reader

如果Eclipse没有的话也没关系,iReport需要的只是Java文件编译后的class文件。

Java部分(Eclipse)

1、JavaBean

一个简单 JavaBean —— Student。

package ds.javabean;
/**
*
*
* @author by Young.ZHU
*                on 2012-8-3
*
* Package&FileName: ds.javabean.Student
*/
public class Student {
//~ Instance fields ********************************************************
// 序号
private int id;
// 姓名
private String name;
// 性别
private String gender;
// 出生年月
private String birthday;

//~ Constructors ***********************************************************
public Student() {
}
public Student(int id, String name, String gender, String birthday) {
this.id           = id;
this.name         = name;
this.gender       = gender;
this.birthday     = birthday;
}

//~ Methods ****************************************************************
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}

public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}


2、Factory

iReport在使用JavaBean作为数据源时需要一个Factory。主要用来生成报表数据。

package ds.javabean;

import java.util.ArrayList;
import java.util.Collection;

/**
* 生成JavaBean的工厂类。
* 在iReport的DataSource的配置中会用到。
*
* @author by Young.ZHU
*                on 2012-8-3
*
* Package&FileName: ds.javabean.StudentFactory
*/
public class StudentFactory {
//~ Static fields/initializers *********************************************

// 生成实体对象的个数
private static final int RECORD_COUNT = 100;

//~ Methods ****************************************************************

/**
* 这个方法在iReport的DataResource配置时也会用到
* 必须是静态方法 static
*
* @return
*/
public static Collection<Student> createBeanCollection() {
Collection<Student> beanCollection = new ArrayList<Student>();

for (int i = 0; i < RECORD_COUNT; i++) {
beanCollection.add(StudentUtil.createStudent(i + 1));
}

return beanCollection;
}
}


3、Student的工具类

该类用来产生Student实例。主要是为了报表的数据不那么单调。

package ds.javabean;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.Date;
import java.util.Random;

/**
* 随机生成Student实体对象的工具类
*
* @author by Young.ZHU
*                on 2012-8-3
*
* Package&FileName: ds.javabean.StudentUtil
*/
public class StudentUtil {
//~ Static fields/initializers *********************************************

/*
* “姓”的字符数组
*/
private static String[] FIRST_NAME_ARR = {
"赵",
"钱",
"孙",
"李",
"王",
"张",
"慕容",
"上官",
"东方",
"朱"
};

/*
* 其他中文数组
*/
private static String[] LAST_NAME_ARR  = {
"燕",
"岩",
"艳",
"明",
"建国",
"小刚",
"小娟",
"华",
"天明",
"洋",
"盈盈",
"仁"
};

/*
* 性别
*/
private static String[] GENDER_ARR     = {
"男",
"女"
};
private static DateFormat DATE_FORMATER = new SimpleDateFormat(
"yyyy年MM月dd日");

//~ Methods ****************************************************************

public static Student createStudent(int id) {
String firstName = getRandomCharFromArray(FIRST_NAME_ARR);
String lastName  = getRandomCharFromArray(LAST_NAME_ARR);
String name      = firstName + lastName;

String gender = GENDER_ARR[new Random().nextInt(1000) % 2];

String birthday = getRandomDate();

return new Student(id, name, gender, birthday);
}

private static String getRandomCharFromArray(String[] arr) {
Random random = new Random();
int    index  = random.nextInt(arr.length);

return arr[index];
}

/**
* 随机生成一个比当前日期小的日期
*
* @return (yyyy年MM月dd日)
*/
private static String getRandomDate() {
Date date     = new Date();
long dateMill = date.getTime();

Random random = new Random();
dateMill = (long) (random.nextDouble() * dateMill);

return DATE_FORMATER.format(new Date(dateMill));
}
}


报表设计(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: