龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

用CustomDataSource向iReport中传递数据

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
iReport是个很好用的免费报表制作工具。它小巧易用,也不乏扩展性。利用CustomDataSource向报表中传数据就是它的可扩展性的一个方面。 实现CustomDataSource需实现接口JRDataSource。这里有两个

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


  
精彩图集

赞助商链接