使用jaspersoft创建jasper模板的经验总结
一、
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 勾选