上次发布了怎么配置JavaBeanDataSource,那么这次要从这个数据源中获取java对象的属性。
新建一个报表后在report inspector 中右键点击Fields--->添加Field
如果我们的XXXDataSourceFactory 的静态方法返回的是一个Blog对象集合,比如
public class Blog { private String title; private String url; private Date createDate; private List<String> keywordsList; private List<Review> reviewList; private List<Comment> commentList; //getter setter }
那么我们依次添加上述类中的所有在报表中用到的属性,
Review和Comment类在子报表中用到了,此处不做解释。
public class Comment { private String userName; private Date commentDate; private String comment; // getter setter } // 如果在子报表中用到了一个类的属性,那么这个类必须是public public class Review{ private Date viewDate; private String userName; // getter setter }
demo中用到了所有的,添加的时候不要忘记选择相应的类型,是String还是List,Data等等,属性名称和field名称要一样
如果使用的属性是集合那么要注意啦.
我们现在要做得报表是如下:
1.标题点击可以打开相应的html页面。
2.博文发表时间是date类型,在报表中自定义格式输出。
3.第三行用的是子报表,从左往右输出。
4.评论记录用的也是子报表从上往下输出,保持第一个格的高度根据右边的内容高度自适应。
5.剩下的也就那样。
这个报表中除了detail band以外的其它band都去掉了,margin也去掉了,因为有些band,比如title band只会在第一页中出现,但我们不需要那样做。
1. 新建一个Text Field ,宽度大小自己随便设置。
选中该Text Field ,然后再属性列表中找到Markup,选择html
Text Field的内容是 "<a style='color:blue;' href=\""+$F{url}+"\">"+$F{title}+"</a>"
这里用到了一个Blog对象的url和 title属性。
2.第二行那里新建一个 Text Field-->选中然后右键点击-->Edit Expression--->双击我们用到的blog对象的属性,然后确认,如下图
-再次选中Text Field然后右键点击--->Field pattern--->Custom Format-->输入 “发表时间:yyyy年MM月dd HH:mm”点“确认”。这个是我自定义的格式,左侧还有其它格式供大家选择,如下图所示:
3.第三行是一个关键字的列表,从左往右输出,如果限定最多只有5个关键字。
用子报表(Subreport)来输出Blog对象中的集合属性。
第一步从 组件面板 中选择 Subreport 拖拽到报表中放在适合的位置。然后配置子报表的数据源。
选中子报表然后在 选项面板---> User a datasource expression---> new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{keywordsList})
然后再 选项面板中 --> Data Source Expression---> 输入“new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{keywordsList})” ,这样就可以把一个集合传给子报表了。
如图所示:
接下来在子报表中获取在父报表中传递的datasource,
因为在Blog对象中关键字集合是一个字符串集合List<String>而不是一个对象,所以这个时候在子报表中创建一个field,名称为 “_THIS”
来获取这个集合中的对象,输出格式是从左往右,所以在属性面板中把 Print order 设置为 Horizontal ,columns 为 5行,如果不是从左往右输出请不要随便更改这个属性。
当前的报表:
和预览效果如下图所示:
4.评论记录用的也是子报表从上往下输出,数据怎样从父报表给传给子报表上面已经说了,这次主要是讲如何 保持第一个格的高度根据右边的子报表内容高度自适应 并且在子报表中的内容很多时候怎么样输出所有内容而不被截取掉(如果不做设置内容会根据输出区域的高度被截取xx长度的字符)。
首先增加了一个frame,在frame里增加了一个内容为"评论记录"的label,右边是一个子报表。
对"评论记录"这个label要设置2个属性,如图所示
评论记录的子报表中对“评论内容”field要勾选Stretch With Overflow 属性,否则内容很长的时候会被截取,选择这个之后评论内容子报表的高度会自适应。
内容很多时候跟上下两个边界的距离很小,显得很难看,这个时候可以对这个field 的2个属性做一下修改,Spacing Before 和 Left Indent 都设成 5。
看一下效果
报表中还有浏览记录 部分, 这部分代码各位自己看看吧, 报表导出跟实际需求不符请各位不要喷口水
我会上传java代码 和 报表 共各位看看, 关于jasper report有什么问题欢迎大家问我, 我会尽量按时回答