我在我的JSF应用程序中使用JasperReport和ireport即时生成报告。
这是我要实现的目标:
我的问题是:
1.我无法将集合(读取为HashMap/ArrayList)传递给子报表,以用我的代码中的数据填充它。
我绝对确定必须有某种方法可以将整个集合传递到子报表以便填充它,并且我还尝试创建JavaBean数据源连接,但是在创建连接时会显示缺少类路径条目。
由于值在结构中不断变化,因此我无法将相应的类捆绑在一个jar中并将该jar放入类路径中。
任何人都可以指导我如何创建Java bean数据源/将Java数据源传递到报表,以便可以填充数据...
请指导...
更新部分:
用于将参数传递给报告并生成报告的Java代码:-
public class TestDataSource
{
public static void main(String[] args)
{
try {
JasperDesign jasperDesign = JRXmlLoader.load("D:\\jasperReports\\subReportDataSource.jrxml");
JasperReport jasperReport =(JasperReport)JasperCompileManager.compileReport(jasperDesign);
Map<String,Object> parameters = new HashMap<String,Object>();
parameters.put ("Title",generateCollection());
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JRBeanCollectionDataSource(generateCollection()));
JasperViewer.viewReport(jasperPrint);
}catch(Exception e)
{
e.printStackTrace();
}
}
public static ArrayList<PersonBean> generateCollection()
{
ArrayList<PersonBean> arrlist=new ArrayList<PersonBean>();
arrlist.add(new PersonBean("A", 20));
arrlist.add(new PersonBean("B",30));
arrlist.add(new PersonBean("C",40));
arrlist.add(new PersonBean("D",50));
arrlist.add(new PersonBean("E",40));
arrlist.add(new PersonBean("F",60));
return arrlist;
}
}
现在,我创建了一个新报告(Report)。在其中放置了一个子报告(Sub-Report)。
新的net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($ P {Title})
连接类型:-使用数据源连接类型。
现在,在我的子报表中,我仅放置了两个静态字段,即名称和年龄。
我如何告诉我的报表/子报表打印作为哈希表中正在传递的值的当前值。
最佳答案
如果您已经有一个数据源,那么在填写报告时,可以在参数 map 中传递列表/ map 。
Map<String, Object> param = new HashMap<String, Object>();
param.put("SUB_DATA_SOURCE", yourList);
JasperFillManager.fillReport(jasperReport, param,
new JRBeanCollectionDataSource(yourMainListHere));
为此,您必须在MAIN报表中创建一个参数,该参数与您在参数映射中设置的名称相同,并为其指定类型类(在我的情况下为List)。
比您必须创建子报表元素并将“连接类型”设置为“使用数据源表达式”,然后在“数据源表达式”内部进行以下设置:
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUB_DATA_SOURCE})