在列数固定的报表中逐格横向填充数据并折行

在很多需要打印的报表中,受限于纸张的大小,往往会限制行数或者固定列数。我们在《单据类报表的制作》一文中,曾经介绍了限制了行数的情况如何实现,现在,我们再来看一下,在固定了列数的情况下,如果在某些行中,逐格横向填充数据,并在超过列数后自动折行。

我们先看一个例子的效果图:

x1png

在这张报表,由上而下其实分成了几个部分:

首先,表头和前两行是简单的描述信息;

然后,实际上是一个 4 行 5 列的固定表格,对“核定”、“实有”、“超空”、“批准使用”这四个项目进行了统计汇总;

再往下, “登记”这一行填充了来自数据库的人员姓名,为了整齐美观,要求按 4 个项目对应的 4 列逐格填充,而且人员数量会根据数据库中的实际情况填充,如果,当多于 4 人时还需要折行后继续按照一行 4 列进行填充,如图中的蓝色字体部分所示;

最后的两行都是文本描述。

类似的表格其实我们常常会遇到,例如下面这张 “学校公物监护人统计表”:

bjpg

每一类公物的监护人横向逐格填写,超过 4 个时,都要折行展现,比如表中的“窗帘、窗户”的监护人。

熟悉报表设计的兄弟姐妹都清楚,一个业务字段的取值一般都是定义到一个格子后自动扩展,现在要分别放到 4 个单元格,这怎么拆开定义?

别着急!!下面将结合第一个“使用单”的例子,来了解一个神奇的报表工具。

根据表格本身硬性要求(4 列是固定列,不能自动扩展),我们能想到的方法只有用坐标的方式,按照位置号把登记人依次摆到对应单元格。

如果数据库中登记人员的姓名(XM)如下

x2jpg

那么我们就把登记人前 4 个(张三、李四、王二、王麻子)依次放到对应 1 至 4 格子里,下面 4 个再按照 5 至 8 放至第二行,依次类推。。。

至于另一个问题是应该摆几行?其实很简单,总人数除以 4,我们就可以判断出来了。

下面就是具体的操作过程:

  1. 把“使用单”固定格式的部分先画出来……
  2. 设置数据集,例子里使用润乾报表内建数据集进行模拟,如上图所示;
  3. 按照上面的分析思路完成行数计算及按坐标摆放的工作

dpng

其中:

(1)在“登记”行前增加一行,在 B11 中定义表达式:ds2.select(XM), 把登记人(XM)数据查出来备用,同时 B11 设置为“不可扩展”,此时为 XM 字段所有数据以逗号隔开的字符串(如,“张三, 李四”)。
(2)计算行数

在原 D 列前插入一列,在 D12 中定义表达式:

=to(1,int(ceil(ds2.count()/4)))

其中,int(ceil(ds2.count()/4)) 就是可扩展出的总行数

(3)按坐标摆放:

E12 表达式:=split(B11,“,”)(4*(D12-1)+1)

G12 表达式:=split(B11,“,”)(4*(D12-1)+2)

I12 表达式:=split(B11,“,”)(4*(D12-1)+3)

K12 表达式:=split(B11,“,”)(4*(D12-1)+4)

其中 split 函数后面面括号里的部分即为按位置坐标取数。

(4)把新增的 D 列及 11 行设置为“隐藏”,仅用来辅助存放登记人序列串与生成行数,不需要显示。

4. 最后效果如我所愿,完美解决!

类似的复杂报表还有很多,尤其是带有人工填写痕迹的单据类报表。不过通过这篇文章,我们可以愉快地相信,没有什么报表是在冷静分析后搞不定的,尤其是在掌握了润乾报表这么 NB 的工具后。当然,如果实在找不到思路……那么不妨找一下润乾最牛的支持团队(QQ:800025723),必定会给您满意的答复!

更多特殊报表格式类问题请查看:报表样式汇总导航
* 动态列报表的制作
* 在列数固定的报表中逐格横向填充数据并折行
* 如何通过报表单元格右键控制报表跳转到不同链接地址
* 报表也可以根据单元格计算后结果进行排序
* 按段分组报表制作