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”是我在报表中定义的列的名字。 
|