`
bit6211
  • 浏览: 73214 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jasperreport中JRDataSource之JRMapArrayDataSource的应用

    博客分类:
  • j2ee
 
阅读更多
       在jasperreport中,当我们填充数据到.jasper文件,来生成.jrprint文件时,常用的一个JRDataSource类是, JRBeanCollectionDataSource,这个类的构造方法是,public JRMapCollectionDataSource(java.util.Collection col) ,col参数这就大家熟悉的javabean list数组了。该类的用法在网上有许多例子,这里就不重复了。
        而JRDataSource的另一个实现类JRMapArrayDataSource,它的构造方法如下,public JRMapArrayDataSource(Object[] array),其中array参数是一个数组。我们来看该类的源代码,如下:
public class JRMapArrayDataSource implements JRRewindableDataSource
{


/**
*
*/
private Object[] records = null;
private int index = -1;


/**
*
*/
public JRMapArrayDataSource(Object[] array)
{
records = array;
}


/**
*
*/
public Object getFieldValue(JRField field)
{
Object value = null;

Map currentRecord = (Map)records[index];

if (currentRecord != null)
{
value = currentRecord.get(field.getName());
}

return value;
}

......
}
我们通过records = array;和Map currentRecord = (Map)records[index];可以得知,array参数是一个map数组。那这有什么好处呢?
       我在开发中发现了一个好处是,由于开发中需要动态生成.jrxml文件(我用xom开源jar包来生成),然后再compile为.jasper文件。而在.jrxml文件中,field是需要动态生成的,其中field的name和个数是不固定的,如下所示,
<field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<field name="address" class="java.lang.String">
        <fieldDescription><![CDATA[address]]></fieldDescription>
</field>
......
这样在填充数据时,如果使用JRMapCollectionDataSource来填充,则构造的javabean就必须事先定义了field的所有变量,这是比较麻烦的。而如果用JRMapArrayDataSource来填充,我们可以在需要填充的时候,才创建合适的map,并把map放到数组里,如下所示,
Object[] objs = new Object[100];
for(int i = 0; i < 100; i++)
{
Map map = new HashMap();
map.put("name", "name" + i);
map.put("address", "address" + i);
objs[i] = map;
}
JRDataSource dataSource = new JRMapArrayDataSource(objs);
所以,在这种情况下,用JRMapArrayDataSource是比较方便的。由于这个问题困扰了我几天,特此记录。
3
2
分享到:
评论
2 楼 inpt 2012-06-03  
终于解决了,少了一个next()方法,居然折腾了好几天
1 楼 inpt 2012-05-30  
大侠,有完整的例子吗?

相关推荐

Global site tag (gtag.js) - Google Analytics