- 使用ireport创建含有子表的报表,在web工程中使用
- 首先创建实体类,在这里创建两个实体类,分别为Building,Room,他们的关系为一个Building对象中含有多个Room对象,所以Room对象为子表的数据源,Building对象中含有一个Room对象的集合作为自身的成员变量。代码如下:
Room实体类:
package test.allan.modular;
public class Room {
}
Building实体类:
package test.allan.modular;
import java.util.List;
public class Building {
}
- 创建完实体类后在iReport中创建对应的jrxml文件,主表名为building.jrxml,子表名为room.jrxml,选择JavaBean Datasource作为数据源,再在iRport的工具->选项菜单中配置JavaBean的数据来源,此时选择对应工程的class目录,如图:
编辑room.jrxml文件,首先选择JavaBean作为数据来源,再在Class name 中输入类的全称,,点击 Add selected field(s),属性就会出现在下面的框中,再选择OK
- 再在building.jrxml文件中拖入子表控件,选择空的数据源,如图
- 继续编辑building.jrxml文件,在组件面板中选择Subreport properties,然后在Subreport Expression中输入子表的路径,在Expression Class中选择java.lang.String,在Connection type中选择Use a datasource expression,最重要的是在要将Data Source Expression改为自己定义的那个属性(将先前那个值给删掉,再选择自己定义的属性),这里是rooms,如图:
- 还有一步很重要,就是要在主表(building.jrxml)中选中Parameters,再选择SUBREPORT_DIR,然后在属性面板中编辑Field Class
这一步可以说是最重要的,要将rooms的属性改为org.apache.struts2.views.jasperreports.ValueStackDataSource,这是最重要的,如图:
- 将上述操作处理完后,还需要在导入几个包,因为上面定义的那个类型ireport中是没有的,需要导入的包有两个,一个是struts2-jasperreport-plugin.jar,还有一个是x-work.jar,版本自己选择,也是在classpath中配置,如图: