最近在研究在ireport,其中很多地方用到subreport,现在分享一下以list作为子报表数据源的例子:
(主报表显示所有的老师,子报表显示每个老师下面所有的学生)
首先我们在程序中设置的数据源:
List<Teacher> teachers= (List<Teacher>) getTeachers();
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(teachers);
这个dataSource就是一个数据源,它里面保存的是Teacher information。我们先看一下Teacher的结构:
public class Teacher{ private String name; private String address; private List<Student> Students;
Teacher.java类里面有一个List用来保存学生的信息,现在我们要使用一个子报表输出学生的信息。现在打开ireport,在左边的树形结构菜单中有一个fields菜单,我们在这个菜单下把Teacher的属性添加进去,注意每个字段的类型,需要跟Teacher.java类中字段保持一致,大小写,属性名,字段类型都需要保持一致。那么我们把Students字段添加到fields菜单下面,在属性框中设置:"Field Class“为java.util.List。
在主报表中把要显示的Teacher信息放入主报表中,然后
在主报表detail band中加入subreport组件,用于显示学生的信息,点击subreport,开始设置它的属性。
ConnectionType属性,这里我们用到的是一个list作为数据源,所以我们选择“Use a datasource expression”,
然后就是设置Data Source Expression,设置数据源的表达式,这是个关键。由于此处我们用到的是一个list集合作为数据源,所以我们设置为:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{students})
。JRBeanCollectionDataSource中传入的参数是集合,list,Set等集合都可以。
然后Parameters,就是用来传参数的,传参数给子报表。这个地方要注意,参数要跟子报表保持一致,名字,类型等都需要保持一致。我们先添加参数:
把teacherName传给子报表,然后右键点击子报表,选择open subreport,然后在子报表中把Parameter菜单中把参数teacherName添加进去:
一定要注意大小写以及数据类型,那么现在teacherName就可以在子报表中使用了。然后在子表中把学生信息放进去,编译就可以了。
还有一点需要注意,当添加一个subreport组件时,在主表中的Parameter菜单下会自动生成一个参数SUBREPORT_DIR,是用来设置子报表的目录的,这个我们需要在程序中设置,
Map map = new HashMap(); map.put("collectionName", collection); map.put("SUBREPORT_DIR", ReportOption.BASENAME);
这样一个子报表就完成了,在下一章节中,我将具体介绍在程序中具体如何生成报表,这一节重点是讲解如何在ireport中设置subreport的属性参数等,具体跟我们程序结合如何使用,我将在接下来的章节中介绍到。
如果有错误的地方,望各位高手指点一二。谢谢!O(∩_∩)O~