在不少须要打印的报表中,受限于纸张的大小,每每会限制行数或者固定列数。咱们在《单据类报表的制做》一文中,曾经介绍了限制了行数的状况如何实现,如今,咱们再来看一下,在固定了列数的状况下,若是在某些行中,逐格横向填充数据,并在超过列数后自动折行。数据库
咱们先看一个例子的效果图:工具
在这张报表,由上而下其实分红了几个部分:字体
首先,表头和前两行是简单的描述信息;spa
而后,其实是一个 4 行 5 列的固定表格,对“核定”、“实有”、“超空”、“批准使用”这四个项目进行了统计汇总;设计
再往下, “登记”这一行填充了来自数据库的人员姓名,为了整齐美观,要求按 4 个项目对应的 4 列逐格填充,并且人员数量会根据数据库中的实际状况填充,若是,当多于 4 人时还须要折行后继续按照一行 4 列进行填充,如图中的蓝色字体部分所示;3d
最后的两行都是文本描述。blog
相似的表格其实咱们经常会遇到,例以下面这张 “学校公物监护人统计表”:字符串
每一类公物的监护人横向逐格填写,超过 4 个时,都要折行展示,好比表中的“窗帘、窗户”的监护人。it
熟悉报表设计的兄弟姐妹都清楚,一个业务字段的取值通常都是定义到一个格子后自动扩展,如今要分别放到 4 个单元格,这怎么拆开定义?扩展
别着急!!下面将结合第一个“使用单”的例子,来了解一个神奇的报表工具。
根据表格自己硬性要求(4 列是固定列,不能自动扩展),咱们能想到的方法只有用坐标的方式,按照位置号把登记人依次摆到对应单元格。
若是数据库中登记人员的姓名(XM)以下
那么咱们就把登记人前 4 个(张3、李4、王2、王麻子)依次放到对应 14 格子里,下面 4 个再按照 58 放至第二行,依次类推。。。
至于另外一个问题是应该摆几行?其实很简单,总人数除以 4,咱们就能够判断出来了。
下面就是具体的操做过程:
其中:
(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)
其中标红的部分即为按位置坐标取数。
(4)把新增的 D 列及 11 行设置为“隐藏”,仅用来辅助存放登记人序列串与生成行数,不须要显示。
4. 最后效果如我所愿,完美解决!