如何以JavaBeans作为数据源显示嵌套对象?
以下是我的java对象: Class1.java:如何以JavaBeans作为数据源显示嵌套对象?,java,jasper-reports,javabeans,Java,Jasper Reports,Javabeans,以下是我的java对象: Class1.java: public class Class1 { public Class2 object2; ... } public class Class2 { public Class3 object3; ... } public class Class3 { public List<Class4> list4; ... } public class Class4 { public S
public class Class1 {
public Class2 object2;
...
}
public class Class2 {
public Class3 object3;
...
}
public class Class3 {
public List<Class4> list4;
...
}
public class Class4 {
public String string1;
public String string2;
public String string3;
public Class5 object5;
...
}
Class2.java:
public class Class1 {
public Class2 object2;
...
}
public class Class2 {
public Class3 object3;
...
}
public class Class3 {
public List<Class4> list4;
...
}
public class Class4 {
public String string1;
public String string2;
public String string3;
public Class5 object5;
...
}
Class3.java:
public class Class1 {
public Class2 object2;
...
}
public class Class2 {
public Class3 object3;
...
}
public class Class3 {
public List<Class4> list4;
...
}
public class Class4 {
public String string1;
public String string2;
public String string3;
public Class5 object5;
...
}
我有一个带有子报表的报表,它们都使用相同的数据源,如下所示:
public static void execute(List<Class1> data) throws FileNotFoundException, JRException {
BufferedInputStream reportStream = new BufferedInputStream(new FileInputStream("C:/Users/user1/Downloads/report2.jrxml"));
// Bing the datasource with the collection
JRDataSource datasource = new JRBeanCollectionDataSource(data, false);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("SUBREPORT_DIR", "C:\\Users\\user1\\Downloads\\");
parameters.put("SUB_DATA_SOURCE", data);
// Compile and print the jasper report
JasperReport report = JasperCompileManager.compileReport(reportStream);
JasperPrint print = JasperFillManager.fillReport(report, parameters, datasource);
// Export report to PDF
JasperExportManager.exportReportToPdfFile(print, "C:/Users/user1/Downloads/JavaBeansPDF.pdf");
}
publicstaticvoidexecute(列表数据)抛出FileNotFoundException、JRException{
BufferedInputStream reportStream=新的BufferedInputStream(新文件输入流(“C:/Users/user1/Downloads/report2.jrxml”);
//将数据源与集合绑定
JRDataSource datasource=新的JRBeanCollectionDataSource(数据,false);
映射参数=新的HashMap();
参数.put(“子报表目录”,“C:\\Users\\user1\\Downloads\\”;
参数put(“子数据源”,数据);
//编译并打印jasper报告
JasperReport report=jaspecompilemanager.compileReport(reportStream);
JasperPrint print=JasperFillManager.fillReport(报告、参数、数据源);
//将报告导出为PDF格式
JasperExportManager.exportreporttopdf文件(打印,“C:/Users/user1/Downloads/JavaBeansPDF.pdf”);
}
SUB_DATA_SOURCE是我在iReport中的报表和子报表中定义的一个参数,参数类为:java.util.List
我曾尝试将Class1中的简单值显示到报表中,效果很好
但我的问题是如何将列表的内容显示到子报表中
我需要在报告中显示此“表”:
string1---string2---string3---object5.getElement1 abc-----------cde------测试-----------值1
我不知道我的问题是否清楚,请告诉我是否有混淆或遗漏的地方
PS:我使用JasperReports v5.6.0和iReport v5.6.0作为数据源传递
列表
,这意味着您在报告中有此字段定义
<field name="object2" class="your.package.Class2"/>
处理
NullPointer
超出了这个答案的范围,我假设您要将List
传递为数据源的所有字段都有公共getter,这意味着您在报告中有此字段定义
<field name="object2" class="your.package.Class2"/>
处理
NullPointer
超出了这个答案,我假设所有字段都有公共getter我真的不明白为什么要将列表作为子报表的SUB_数据源传递,因为列表中的每个Class1的数据源都会改变。我已经发布了一个忽略SUB_DATA_SOURCE参数的一般答案。@PetterFriberg我正在传递SUB_DATA_SOURCE,以便能够在我的子报表中使用其内容。这就是我发现这样做的唯一原因。但也许我必须指定,在我的例子中,我总是在列表数据
中输入一项,检查答案并告诉我什么不清楚(不需要传递参数),我真的不明白为什么要将列表作为子报表的子数据源传递,因为数据源对于列表中的每个类都会发生变化。我已经发布了一个忽略SUB_DATA_SOURCE参数的一般答案。@PetterFriberg我正在传递SUB_DATA_SOURCE,以便能够在我的子报表中使用其内容。这就是我发现这样做的唯一原因。但可能我必须指定,在我的情况下,我总是在列表数据中有一项检查答案,并告诉我什么不清楚(无需传递参数),好的,但如何将该数据源放入子报表中以显示其内容?因为$F{object2}没有“重新定义”到子报表范围中,不?@Siho这就是创建数据源并将其传递到子报表的方式,在子报表中定义字段string1、string2、string3,并在详细信息栏中对其进行迭代,所以它会自动在$F{object2}.getObject3().getList4()和string1之间建立链接,第二条、第三条$F{object2}在子报表范围中没有“重新定义”,这取决于您作为参数和/或数据源传递的内容。如果什么都没有,什么都没有,那是我的问题。。。我应该传递什么作为参数?好的,但是如何将该数据源获取到子报表中以显示其内容呢?因为$F{object2}没有“重新定义”到子报表范围中,不?@Siho这就是创建数据源并将其传递到子报表的方式,在子报表中定义字段string1、string2、string3,并在详细信息栏中对其进行迭代,所以它会自动在$F{object2}.getObject3().getList4()和string1之间建立链接,第二条、第三条$F{object2}在子报表范围中没有“重新定义”,这取决于您作为参数和/或数据源传递的内容。如果什么都没有,什么都没有,那是我的问题。。。我应该传递什么作为参数?