iReport —— 使用 JavaBean 作为数据源

在制作报表时,想直接使用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)

iReport —— 使用 JavaBean 作为数据源

2、设置数据源

工具栏 > Data > 连接/资料来源 

在弹出的界面中,点击 New 按钮。

在接下来弹出的界面中,选中 JavaBeans set data source ,点击 Next 

出现如下图的界面。

a、Name ,给你的datasource取个名字,例如:MyJavaBeanTest

b、Factory class ,就是上面的工厂类,包括包名和Java文件名

c、method ,工厂类里的那个静态方法。注意方法名要对应。名字可以任取。

iReport —— 使用 JavaBean 作为数据源

3、向报表填充值

工具栏 > Data > 报表查询 ,出现如下界面。

a、选中 JavaBean Data Source 选项卡。

b、在 Class name 栏里,填入JavaBean类,包括包名和Java文件名。

c、点击 Read attributes 。可以看到下面的栏里显示出了JavaBean的属性。

d、选中相关属性,点击 Add Selected Field(s) 

e、点击 OK 

iReport —— 使用 JavaBean 作为数据源

经历过上面的步骤,可以看到在你的报表文件的视图中,Fields栏里多了刚刚加上的属性。

iReport —— 使用 JavaBean 作为数据源

将各属性拖放到相应的位置。如图。

iReport —— 使用 JavaBean 作为数据源

好了。看看效果吧!

在菜单栏里,点击 执行报表(使用动态连结),如图。

如果配置了多个数据源的话,请注意动态连结的数据源是否正确。

iReport —— 使用 JavaBean 作为数据源

预览效果如下:

iReport —— 使用 JavaBean 作为数据源


P.S. 其中的Java源代码和iReport的报表文件(jrxml)已打包上传到网上。有兴趣的可以看看。

下载地址:http://download.csdn.net/detail/zhuyang7654321/4475107

上一篇:数据拟合:多项式拟合polynomial curve fitting


下一篇:MariaDB MaxScale