在JasperReport中创建/传递Java bean数据源
我在我的JSF应用程序中使用JasperReport和ireport来动态生成报告。 这就是我想要实现的目标: –
-
我的结构(读作HashMap / ArrayList)包含需要传递给报表的数据,以便在报表中显示相同的数据。
-
我的报告已经包含一个数据源连接,我使用该连接从DB获取一些值并在报告中填充它。
-
我正在创建一个子报表,以便对于需要从代码传递的数据,我可以使用子报表并将此子报表嵌入主报表中。
我的问题是: – 1.我无法将集合(读作HashMap / ArrayList)传递给子报告,用我的代码中的数据填充它。
我绝对相信必须有一些方法将整个集合传递到子报表以填充它,我也尝试创建JavaBean数据源连接,但是在创建连接时它会显示Missing classpath条目。
我不能将相应的类捆绑在jar中并将jar放在classpath中,因为值在结构中不断变化,….
任何人都可以指导我如何创建/传递java bean数据源到报告,以便可以填充数据…
请指导……
更新部分: –
用于将参数传递到报告和生成报告的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 parameters = new HashMap(); parameters.put ("Title",generateCollection()); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JRBeanCollectionDataSource(generateCollection())); JasperViewer.viewReport(jasperPrint); }catch(Exception e) { e.printStackTrace(); } } public static ArrayList generateCollection() { ArrayList arrlist=new ArrayList(); 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)..在里面我放了一个子报告(子报告)..将子报告数据源配置为新的net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($ P {标题})
连接类型: – 使用数据源连接类型。
现在在我的子报告中,我刚刚放置了两个静态字段作为名称和年龄。 我如何告诉我的报告/子报告打印值作为正在传递的hashmap中的值。
如果您已经拥有DataSource,那么在填写报告时,您可以通过param Map传递List / Map。
Map param = new HashMap(); param.put("SUB_DATA_SOURCE", yourList); JasperFillManager.fillReport(jasperReport, param, new JRBeanCollectionDataSource(yourMainListHere));
这样做你必须在MAIN报告中创建一个参数,你在param Map中设置了一个相同的名称,并给它一个Type Class(在我的例子中为List)。
您必须创建子报表元素并将连接类型设置为“使用数据源表达式”并在“数据源表达式”中设置:
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUB_DATA_SOURCE})