您的位置:首页 > 编程语言 > ASP

使用jaspersoft创建jasper模板的经验总结

2016-07-15 17:45 591 查看
一、
1) jasper单元格合并具体思路:
其实就是通过条件为文本框设置不同的style(是否显示边框来实现)
1)在设置过程中碰到的问题
.)创建style时,必须将style设置为没有边框的,
然后在里面再设置一个当有条件时应该使用的样式,否则不起作用
styles
style
new java.lang.Boolean((($V{count}>1 || $F{plan-merge-count}==-1) && ($F{plan-merge-count}!=null && $F{plan-merge-count}!=0)))
.) 设置边框时属性中Padding and borders 和pen 都要设置

2)jasper中组件绑定数据时对应的路径
.) jasper文件xpath应该写成绝对路径,就是以 /开头
如:/batch-contract-dTO/contract-list/contract-dTO
.) 数据原对应的路径(这个xpath也是写成绝对路径,这个路径与jasper文件的目录(xpath)没有关系,
设置这个路径,是为了设置dataset中对应的field,方便使用时引用)

.) 引用数据原作为数据来源的组件,其对应的路径需要相关对于jasper文件的xpath(如果接下来是
一个llsit,直接相对到其下的dto即可)
((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("contract-dTO/risk-group-info-list/risk-group-dTO/plan-info-list/plan-dTO")

.) table中又嵌套table,其对应的路径是相对于其上一个table的subdataSource的路径

.)table中又嵌套了一个子模板,子模板的subdataSource路径是相对于table的subDataSource的路径

.) 子模板文件对应的xpath该如何设置(既可以设置成相对路径,也可以设置成绝对路径)

总结:
1)添加一个styles样式,设置padding and borders边框,Pen边框的宽度.
在已创建的style下面再创建一个condition style条件样式, 在Condition Expression中添加如下的
boolean,为真的话,就会执行这个条件样式
new java.lang.Boolean((($V{count}>1 || $F{plan-merge-count}==-1) && ($F{plan-merge-count}!=null && $F{plan-merge-count}!=0)))

2) 创建一个变量(Variable)count: 用来判断险种下的责任有几个,如果只有一个的话,底部的边框是需
要显示出来的,plan-merge-count=-1,表示此险种是被合并了。
count是一个变量,用来统计一个险种下的责任的
count对应的属性值如下:
variable class : java.lang.Integer
Calculation: Count
Reset Type: Report
increment type: None
Variable Expression: $F{duty-name}
initial Value Expression : 1
3) table可以实现表格的展示,使用子模板也可以实现表格的展示(实现本质:数据是list集合,对应的显
示组件都是放到页面的detail中了,所以就可以循环显示出来数据了)

二、jasper中实现一个对象的高度随着零一个对象的高度变化
组件1 和 组件2 紧挨着

1)如何实现1的高度随着2的高度变化而变化(就是2被撑高了,1也要随着变高)
.)1的属性:positionType: Float;(当其上面的组件下移时,解决内容显示重复的问题)
strechType: Relative to Band Height --->这个表示其引用与其结合在一起的对象的高度.
.)2的属性:positionType: Float;
strech with overflows: 勾选,表示内容有溢出时,自动伸缩变高

2)如何实现2的高度随着1的高度变化而变化(就是1被撑高了,2也要随着变高)
.1)1的属性:positionType: Float; --->这个表示1的位置自动浮动(解决内容重叠在一起的问题)
strech with overflows: 勾选,表示内容有溢出时,自动伸缩
.2)的属性:
positionType: Float;
strechType: Relative to tallest Object--->这个表示其高度相对与最高的对象

三、jasper中数据的层级关系
1)当前页面放到detail中的内容会(根据数据源的数据)循环
// /batch-contract-dTO/contract-list/contract-dTO/risk-group-info-list/risk-group-dTO/plan-info-list/plan-dTO --->当前页面定位到这个dto.
// 对应的Fields中的字段的路径也是从这个DTO开始取值(切忌,否则运行主模板时,子模板中的字
段可能取不到值)

2)创建一个dataset数据源是用来绑定table的,数据源是为了指定要显示的字段
这个数据源对应的xpath无需相对于当前页面对应的dto来设置

3) .table对应的 datasource expression,
subDataSource的路径是相对与当前页面对应的dto来写路径的
比如当前页面的路径是: /contract-dTO/risk-group-info-list/risk-group-dTO/risk-person-info-list/risk-person-dTO
那table对应的subDataSource: risk-person-dTO/plan-info-list/plan-dTO (就是从risk-person-dTo开始往下取plan-dTO)

. 如果table下又嵌套table的话,其对应的subDataSource要相对于其父table对应的subDataSource来取值。
比如如果在取plan-dTO下面的duty的话,应该是plan-dTO/duty-info-list/duty-dTO.

jasper关于dto路径的问题----其实就是上面的总结:
1)jasper页面对应的xpath:是为了添加field字段使用的,一般都是使用绝对路径的,如: /batch-contract-dTO/contract-list/contract-dTO

4) . jasper页面中的table组件关联的dataset 对应的xpath,也是绝对路由,也是为了设置dataset中的
相关field字段而设置的,不用相对jasper页面对应的xpath来设置
. table组件 对应设置subDatasourcet时,对应的路径需要相对当前页面对应的xpath来设置
((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("contract-dTO/risk-group-info-list/risk-group-dTO")
.) table组件再嵌套table时,子table设置subDatasource时,其路径相对于父table的
subDataSource路径来设置.

5)jasper主页面引入子jasper页面的组件,需要设置data source expression(对应的subDataSource路
径是相对于页面的xpath路径设置的)
((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("contract-dTO/applicant-info-list")
引入子页面对应的属性值:
Subreport Expression : xxxx.jasper -->就是子模板名字
connection type : Use a datasource expression
Data Source Expression : 就是上面的subDataSource
parameters: 如果要往子模板中传参数的话,可以在这里设置(这里设置后,子模板中创建同
样的parameter属性,值会自动传进去的)

jasper模板中,所有的字体应该一致(就是字体font Name属性) ,如果不一致的话(是针对有值的组
件),就会出现如下的错误.
Could not load the following font :
pdfFontName : FZSTJ.ttf
pdfEncoding : Identity-H
isPdfEmbedded : false

四、主模板如何向子模板传递参数
1) 在主模板定义一个field变量: 如param1
在主模板对应的子模板组件上设置属性parameters---->即传参数给子模板
2) 这样在子模板中就可以定义parameter参数了,如主模板上传过来的param1,其值会直接取值,这里无
需再设置。然后在子模板中就可以使用了$P{param1}

五、文本框的内容如果显示不完整的话,如何将其换行继续显示呢?
stretch with overflow 勾选

六、总结:
0)为何新创建的模板预览是提示无内容呢?
是因为设置数据源xml文件时,没有选择usethereportXPath expression when fillling the report.
1)如何让内容直接显示在第二页呢。
.)第一个detail的高度尽量接近页面的高度。
.)这样再创建一个新的detail(你会发现detail 的left,和top属性都是0,表明它会展示在页首的),这样这个detail中的内容就会展示在第而页了。
2)关于组件自动撑高,最高能撑多高的问题。
detail就像是个容器,其里面的组件设置了(Stretch with overflow),其内容会被撑高,但它最高
也不会超出当前页面的page Height高度(当前页面作为子模板时要注意这点)。
3)如果页面是循环一个list进行展示时,detail中的内容就会循环的接连着展示内容,此时如果想一个
item展示在一页内容上,下一个item展示在下一页该如何设置呢。
需要在detail中的最下边设置一个page break组件,这样当detail展示到这里时,这个内容就会终
止。新的内容将另起一页展示。
4)组件对应的属性printWhenDetailOverflows 此字段,有时选择后会影响到其它组件的显示(留出空白
再显示内容,此问题很难找)所以组件不要选择此字段,也不知道是什么意思。
5) 动态text组件,当需要其自动撑高时,它是有一定的限制的,不会无限被撑高的。(所以需要设置一
些高度,再让其自动撑高些比较好)
6)jasper模板中如何获取list的数量呢(其实就是xpath的写法)
定义一个field: count(print-special/ply-business-list/ply-business-list-dTO/plan-info-
list/plan-dTO) ---->这样就可以获取list的数量了。

7)关于打印jasper生成的pdf文件时存在自适应打印和按原大小打印的区别(做套打时要注意这一点)
.)自适应的大小为96%,原样打印是100%
8)还有就是jasper主模板取名不能有下滑线和中间线等特殊字符(采用java驼峰式的)--->这个应该是我
们系统自己添加的约束。
9)frame组件的用法:
当一些组件需要放到一起,并且一边的内容需要随着另一边扩大而扩大时(此时不能自动撑高时),
需要用一个frame将其包裹起来。
10)有时为何会产生第二页的问题,是因为最后一个组件有多余的空隙,或detail的最下边有多余的空
隙,去除即可。
11)主模板仅设置页边距(方便调整),detail中根据条件设置对应的子模板
主模板有对应的宽和高,子模板也有对应的宽和高(这个要相对与主模板的宽和高);
即便主模板设置了页边距,子模板也应该设置页边距,方便调整。
12)页面上如何显示页数,使用变量PAGE_NUMBER
.)显示当前页码,将其变量放置在一个text组件中,将此text组件的evaluation time选择now.
.)显示总页码,将其变量放置在一个text组件中,将此text组件的evaluation time选择Report.
13)如果添加图片的展示。
可以设置相对路径,这样就可以保证你电脑上模板与图片的路径和服务器上的路径是一致的,方便
预览。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jasper