在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是比较方便的。由于这个问题困扰了我几天,特此记录。
分享到:
相关推荐
JasperReport 后台 代码 封装,采用JRDataSource方式。
JasperReport iReport 集成到web应用操作说明
JasperReport中文翻译用户手册,适合新手学习,JasperReport中文翻译用户手册,适合新手学习,
JasperReport中文手册.pdf
JasperReport 中交叉报表指南
Jasperreport中文使用手册
软件说明: jasperreport 是一款报表打印组件,是开放源代码组织sf.net 中的一个java 报表打印工 程,在我写这篇文章时,jasperreport 的最新版本是0.5.2 版,jasperreport 的最新版本可以 从...
JasperReport中文用户手册.pdf
报表工具JasperReport的实现及应用,金辉,,本文详细讨论了报表工具JasperReport的原理及使用方法,它是纯Java编写的,基于XML技术设计报表模板,通过在程序中调用模板动态地显示��
jasperreport 3.75版 jar包 ,修复PDF中中文不能加粗,倾斜等问题。
程序员 使用 jasperreport studio生成中文报表 spring boot 教程
JasperReport中文用户手册,英文的需要付费,所以自己整理了一份,希望能对大家有用
jasperReport自带的web应用Demo 博文链接:https://zmx.iteye.com/blog/572812
JasperReport为用Java生成PDF报表的一种技术
jasperReport ireport文档资料 iReport的中文教程 jaspersoft-studio-user-guide_0.pdf jsp调用jasper JasperReport创建多个子报表
整合Struts2+JasperReport Web报表应用示例 整合Struts2+JasperReport Web报表应用示例
NULL 博文链接:https://zmx.iteye.com/blog/580325
几经探索,终于寻找到在一个报表中使用多个数据源的方法,现在分享出来以便后来者少走弯路!网上很多资料说多数据源只能使用子报表方式,呵呵!