Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以JavaBeans作为数据源显示嵌套对象?_Java_Jasper Reports_Javabeans - Fatal编程技术网

如何以JavaBeans作为数据源显示嵌套对象?

如何以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

以下是我的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 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}在子报表范围中没有“重新定义”,这取决于您作为参数和/或数据源传递的内容。如果什么都没有,什么都没有,那是我的问题。。。我应该传递什么作为参数?