当前位置: 代码迷 >> 报表 >> 解决表格特殊布局的若干示例
  详细解决方案

解决表格特殊布局的若干示例

热度:407   发布时间:2016-04-29 01:51:18.0
解决报表特殊布局的若干示例

? 有些特殊布局难用报表工具提供的功能直接实现,但如果准备出合适的数据源,就能大大降低报表设计的难度。

??使用免费的集算器可以弥补这一不足。集算器支持集合运算、有序计算、动态脚本执行,还提供了简单易用的JDBC接口,报表工具可将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果,详情参考集算器辅助报表工具的应用过程。

??下面举例说明报表常见的特殊布局,以及集算器对应的解法。

??横向分栏

??报表工具大多有纵向分栏的功能,但很少有提供横向分栏的。使用集算器事先准备数据集可以可以弥补这一不足:

??库表emp有3个字段,部分数据如下:

?

? 期望的报表布局是记录先横后纵摆放,且横向分为3栏,如下:



?

? 用集算器将原来的3字段数据转为9字段,就可以用报表工具实现横向分栏了:

??将数据按序号分成3部分,存在A2\B2\C2,再将B2\C2中的字段依次加入A2:

错行分栏

? 将库表emp横向分为两栏,每行的第2栏和下一行的第1栏相同,报表布局如下:

? 集算器代码:
?

? A2:错位拼接,将上一条记录和当前记录依次拼接起来,从第3行开始取拼接结果。结果如下:
?

? A3、B3、A4:按照前面的例子横向分两栏。

单字段纵向动态分栏

??按照先纵后横的布局将单字段结果集展现在报表中,行数和列数都是参数。源数据如下:
?

? 集算器代码:

?

? A1:取出单字段数据,转换为序列(有序集合)。

? A2:生成与报表布局相同的二维表,初始值为空。参数Row和Col来自报表。
?

? A3:向A2追加数据,最终结果如下:
?

宽表横向打印

??sOrderEmp是数据库中的宽表,一张纸打印不下,报表要求每张纸打印列头和列号,在第1张纸打印前1到N列,第2张纸打印N+1到2N列,以此类推,示意图:
?

? 集算器代码如下:
?

? 上面是通用代码,可横向打印任意库表argSource,每页argPageCol列,argPageRow行。A2:动态生成列数为argPageCol的空二维表。A3:将A1每隔argPageRow行分一组。A4:将A1中的字段名每argPageCol个分为一组。A5:拼字符串,在A6中可动态执行。A6:循环A3的每组数据,每次向A2插入argPageCol*argPageRow行,依次插入每页的字段名、字段值。A7:将A2返回给报表工具。

??A2计算结果如下:

复制行

??按次序将记录复制3份,并用报表展现。

??集算器代码:
?

? A2: []表示序列(有序集合),[~]表示将A1当前记录作为单成员序列,[~]*3可将当前记录复制3份,函数conj对A1每个记录执行计算,最后进行合并。计算结果如下:

用条件控制分组表的格式

??展现一张分组表,数据来自库表sOrder,分组字段是Seller,明细字段是Client和Amount。特殊要求是:

??1.每组明细中,从第2条直到结束需要显示“+”号,第1条不显示。

??2.如果每组明细多于1条,则在该组最后显示对Amount的汇总求和,明细只有1条时不显示汇总。表样示意如下:

? 集算器代码:
?

? 解释:查询数据库,按照SellerId分组,并循环访问每组数据。循环中向空序表A2追加当前组的明细,如果序号#大于1,则在Client之前加“+”,如果当前组记录数大于1,则向A2追加subtotal。A2最终结果如下:
?

? A5:将A2通过jdbc传回报表工具。

将子表动态插入主表

??库表dColThread是主表,主键是tID。dColQuestion是子表,外键是tID,如下。

??dColThread
?

? dColQuestion
?

? 报表需要根据ApplicationName查询主表并以列表的形式展现数据。主表每条记录对应的status字段值有多个,但不超过5个,需要横向插入主表的Phone、Decline字段之间,依次命名为QuestionNo1、QuestionNo2…QuestionNo5。如果某列数据都为空,则这一列不显示。表样形如:
?

? 集算器代码如下:
?

? 解释:用SQL取出主子表关联数据,按照tID分组,循环访问每组数据。每次循环向空序表A3插入一条记录,主表字段直接插入,子表字段列变行后再插入,并补足至少5个字段。循环结束后A3如下:
?

横向拼接列表

??table1是Oracle数据库表,table2.xlsx文件,两者结构相同,部分数据如下:
?

? 需要将table1、table2分别按name分组并对各组计数对active字段求和,最后在报表中并排展示。理想表样如下:

? 集算器代码:
?

? 解释:分别从数据库和excel文件取数,将两者进行全连接,将需要的字段拼合到一个数据集中。A5存储合并的结果,如下:
?

交叉表列间计算

??数据库表store存储着多种产品在2014、2015年的销售量,需要用交叉表呈现每种产品每年的销售量,并计算出各产品的年增长率。部分源数据如下:
?

?理想表样如下:
?

? 集算器代码:
?

? 解释:交叉表的列是动态生成的,进行列间计算时需要二次动态引用,用报表脚本实现难度较大,此时可以用集算器将列间计算的结果事先追加到源数据中,之后只需设计简单的交叉表就能实现需求。
??A1的计算结果如下:

?

?

1 楼 mx122723 2 小时前  
不错,学习了!
  相关解决方案