iReport是个很好用的免费报表制作工具。它小巧易用,也不乏扩展性。利用CustomDataSource向报表中传数据就是它的可扩展性的一个方面。
实现CustomDataSource需实现接口JRDataSource。这里有两个方法-public boolean next() throws JRException 和public Object getFieldValue(JRField field) throws JRException需要实现。
当然,既然是dataSource,肯定得有个乘载数据的地方,这里我用的是一个List,List中的一个对象封装了一条记录。iReport会利用next()遍历这个List,从而取得所有的数据。
getFieldValue则是用来从List中取相应的值。
String fieldName = field.getName();
ArchPerInfoForm api = new ArchPerInfoForm();
api = (ArchPerInfoForm)data.get(index);
if ("A01".equals(fieldName)) {
value = api.getAac001();
} else if ("A02".equals(fieldName)) {
value = api.getAac002();
} else if ("A03".equals(fieldName)) {
value = api.getAac003();
}
return value;
这里传来一个field,可以通过判定field的fieldName来决定取form中的什么字段。
但这样实现很不科学,我们有很多报表需要这么处理,而这里的dataSource根本没什么复用性。
考虑了一下,我决定抽象出一个接口。那就是ReportDataInterface,在这里定义一个方法getFieldByName(String fieldName)。这样我把List中取得的对象当成这个接口来处理,只对这个接口进行操作。在其他地方就不必重新写这个dataSource,只需定义一个对象,实现ReportDataInterface接口,然后把装有数据的这些对象放到List中传给这个DataSource,一切ok了。
对了这里我似乎忘了说一点,上面代码中的”A01”是我在报表中定义的列的名字。