1、如何配置数据源,加载属性参见上一篇博客《Ireport报表插件使用之—参数使用》
2、在ireport中,table与list等个人认为应该算是主报表的子报表(例如:交叉报表,个人认为与table这种组件类似,都是作为子表使用);需要说明的是,子表的数据全部都是来自主表,但是有一点需要说明:子表(table)需要使用字段属性名称必须跟主表的一致。在paramer里面子定义参数作为变量提供给子表使用,变量的关联参见下图:
3、主表新建外部参数,名字必须对应,Field字段里面的内容从Datasourc(数据库,或者JavaBean)集合传递
4、子表的属性字段(注意:这里注意区分与3的区别,虽然字段file看起来都一样其实是此处是是DataSet标示子表的数据集合);注意如果table上特殊的表头或者标题,需要在子表的paramer里面自定义参数,然后主表也自定义参数,名称可以一致可以不一致,但是需要映射关系,如果映射关系参见:第6步
5、为子表配置
数据源(为DataSet)
6、为子表的自定义参数关联主表定义的参数变量,右键选择:
7、
映射主表和子表之间的参数(注意需要双击选择,而不是点击)
8、定义controller层方法返回Model:说明这里的controller层只是在生产环境中或者测试环境使用的时候描述如何返回数据,我们在开发过程中,可以使用javaBeanl来模拟数据,此步骤可以省略
public String selectMajorProdAccumIncome(Model model,HttpServletRequest request){ try { KpiMajorProdIndusAllBO kpiMajorProd = new KpiMajorProdIndusAllBO(); kpiMajorProd.setSheetLevelPro("1"); kpiMajorProd.setStatDate("201803"); List<KpiMajorProdIndusAllBO> list = kpiService.selectDownlodKpiSheet(kpiMajorProd);// 报表数据源 JRBeanCollectionDataSource jrDataSource = new JRBeanCollectionDataSource(list); KpiMajorProdIndusAllVO kpiMajorProdIndusAllVO = new KpiMajorProdIndusAllVO(); kpiMajorProdIndusAllVO.setResultsList(jrDataSource); Collection<KpiMajorProdIndusAllVO> testReports = new Vector<KpiMajorProdIndusAllVO>(); testReports.add(kpiMajorProdIndusAllVO); model.addAttribute("title", DateUtil.getCurrentYear()+"年重点产品收入目标整体跟进表"); // 报表格式 model.addAttribute("ytmDataValueTitle", DateUtil.getCurrentYear()+"年累计收入:万元"); // 报表格式 model.addAttribute("quoYtmDataValueTitle", "份额:%("+DateUtil.getCurrentYearMonth()+")"); // 报表格式 model.addAttribute("nowYear", DateUtil.getCurrentYear()+"年:万元"); // 报表格式 model.addAttribute("lastYear", DateUtil.getLastYear()+"年:万元"); // 报表格式 // 动态指定报表模板url model.addAttribute("url", "/WEB-INF/jasper/KpiMajorProdIndusAllVO.jasper"); model.addAttribute("format", "html"); // 报表格式 model.addAttribute("jrMainDataSource", testReports); }catch(Exception e) { result.setCode(0); result.setData(""); result.setMsg("查询失败"); logger.info("selectMajorProdAccumIncome is error!!!",e); } return "reportView"; // 对应jasper-views.xml中的bean id }
9、定义
Factory工厂类
public class KpiMajorProdIndusAllBOTableFactory {
// 生成实体对象的个数
private static final int RECORD_COUNT = 10;
/**
* 这个方法在iReport的DataResource配置时也会用到 必须是静态方法 static
*
* @return
*/
public static Collection<KpiMajorProdIndusAllTableVO> createBeanCollection() {
Collection<KpiMajorProdIndusAllTableVO> testReports = new Vector<KpiMajorProdIndusAllTableVO>();
Collection<KpiMajorProdIndusAllBO> beanCollection = new ArrayList<KpiMajorProdIndusAllBO>();
for (int i = 0; i < RECORD_COUNT; i++) {
KpiMajorProdIndusAllBO kpiMajorProdIndusAllBO = new KpiMajorProdIndusAllBO();
beanCollection.add(kpiMajorProdIndusAllBO);
}
JRBeanCollectionDataSource resultsList = new JRBeanCollectionDataSource(beanCollection);
KpiMajorProdIndusAllTableVO tr = new KpiMajorProdIndusAllTableVO();
tr.setResultsList(resultsList);
testReports.add(tr);
return testReports;
}
}
10、定义业务Bean
public class KpiMajorProdIndusAllTableBO { private String statDate = "999"; private int num; private String indexCode = "999"; private String indexName = "999"; private String ytmDataValue = "999"; private String lyYtmDataValue = "999"; private String yoyYtmDataValue = "999"; private String quoYtmDataValue = "999"; private String momDataValue = "999"; public KpiMajorProdIndusAllTableBO() { } public String getStatDate() { return statDate; } public void setStatDate(String statDate) { this.statDate = statDate; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getIndexCode() { return indexCode; } public void setIndexCode(String indexCode) { this.indexCode = indexCode; } public String getIndexName() { return indexName; } public void setIndexName(String indexName) { this.indexName = indexName; } public String getYtmDataValue() { return ytmDataValue; } public void setYtmDataValue(String ytmDataValue) { this.ytmDataValue = ytmDataValue; } public String getLyYtmDataValue() { return lyYtmDataValue; } public void setLyYtmDataValue(String lyYtmDataValue) { this.lyYtmDataValue = lyYtmDataValue; } public String getYoyYtmDataValue() { return yoyYtmDataValue; } public void setYoyYtmDataValue(String yoyYtmDataValue) { this.yoyYtmDataValue = yoyYtmDataValue; } public String getQuoYtmDataValue() { return quoYtmDataValue; } public void setQuoYtmDataValue(String quoYtmDataValue) { this.quoYtmDataValue = quoYtmDataValue; } public String getMomDataValue() { return momDataValue; } public void setMomDataValue(String momDataValue) { this.momDataValue = momDataValue; } }
11、定义一个用于封装数据源List的JavaBean,注意:下图中的
resultsList变量名称必须对应该VO的
resultsList名称
public class KpiMajorProdIndusAllTableVO {
JRBeanCollectionDataSource resultsList;
public KpiMajorProdIndusAllTableVO() {
}
public JRBeanCollectionDataSource getResultsList() {
return resultsList;
}
public void setResultsList(JRBeanCollectionDataSource resultsList) {
this.resultsList = resultsList;
}
}
12、如果生成的报表有如此大的空白,则是因为你的,面板的Title、PageHeader、ColumnHeader、Detail 1、Column Footer等的属性hight的问题,只要设置为0就行了。
设置的方式: