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

时间:2016-07-15 22:04:12   收藏:0   阅读:3956

一、

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
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!