用Jasper report实现横向分栏报表

  Jasper或BIRT等报表工具通常只支持纵向分栏,很难实现记录横向摆放并分栏的布局,比如下面的报表。


  集算器具有结构化强计算引擎,集成简单,可以协助报表工具方便地实现此类需求。下面通过一个例子来说明横向分栏的实现过程。

  库表emp存储着员工信息,EId是员工编号。报表需要按编号顺序依次显示员工编号、姓名、部门,数据横向分三栏,条件为编号的起止区间。部分源数据如下:

  下面用集算器将原来的3字段数据转为9字段,代码如下:


  A1=myDB1.query(“select EId,Name,Dept from emp where EId>=? and EId<=? order by EId “,begin,end)

  这句代码用SQL语句从数据库查询数据,begin、end是来自报表的参数,表示员工编号起止区间。当begin=4、end=20时,A1的计算结果如下:

  A2=A1.step(3,1)

  这句代码每隔3条记录从A1取出第1条,组成新的二维表。函数step的第1个参数是跨度,第2个参数是起始位置,还有第3个参数:从起始位置取出的条数。这里省略了第3个参数。A2计算结果如下:

  B2、C2以此类推。由于B2、C2可能比A2少一条记录,因此需要在末尾追加一条空记录。运算符“|”表示将两个集合纵向合并。当begin=4、end=20时,A2、B2、C2的计算结果依次如下:


  A3=A2.derive(B2(#).EId:EId2,B2(#).Name:Name2,B2(#).Dept:Dept2,C2(#).EId:EId3,C2(#).Name:Name3,
  C2(#).Dept:Dept3)

  这句代码将B2、C2横向拼接在A2上。函数derive表示追加新列,可以追加多个,其中B2(#).EId:EId2是第1个新列的表达式,符号“#”表示A2中每条记录的行号,“B2(#).EId”表示取出B2中第#条记录的EId字段,“:EId2”表示重命名为EId2。加入6个新字段后,A3就是报表需要的最终数据,如下:

  result A3

  这句代码将A3返回给报表工具。集算器对外提供JDBC接口,报表工具会将集算器识别为普通数据库,集成方案请参考相关文档。

  接下来以JasperReport为例设计一张简单报表,模板如下:

  需要定义两个报表参数pbegin、pend,分别对应集算器中的两个参数。


  报表调用集算器的方法和调用存储过程一样,比如将本脚本保存为horizontalColumn.dfx,则在JasperReport的SQL设计器中可以用call horizontalColumn($P{pbegin},$P{pend})来调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JasperReport 是一个开源的报表生成工具,它提供了丰富的功能来创建和设计报表。在 JasperReport 中,可以使用分页来控制报表的布局和显示。 要实现分页,首先需要在报表的设计中定义一个分页区域。可以通过在报表模板中添加 Page Header(页眉)、Page Footer(页脚)以及 Detail(详细内容)等部分来定义报表的布局。 在 JasperReport 中,可以使用不同的元素和属性来控制分页行为。以下是一些常用的分页相关元素和属性: 1. Page Break 元素:可以将报表内容分隔到不同的页面上。可以在需要分页的地方添加一个 Page Break 元素,它会将内容分割到下一页。 2. Keep Together 属性:可以设置元素是否保持在同一页上。如果将元素的 Keep Together 属性设置为 true,则 JasperReport 会尽量将该元素保持在同一页上,避免被分割到不同页面。 3. Band Height 属性:可以设置各个 band(区域)的高度。通过适当设置 band 的高度,可以控制每页显示的内容量。 4. Print When Expression:可以使用 Print When Expression 来根据条件控制元素的显示。通过在元素上设置 Print When Expression,可以根据特定条件来决定元素是否显示在报表中,从而达到控制分页的目的。 通过合理地使用以上元素和属性,可以实现 JasperReport 的分页功能。需要根据具体的报表设计和需求来选择合适的方式来控制分页行为。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值