zoukankan      html  css  js  c++  java
  • 报表中如何实现不规则布局

    报表,我们习惯于认为主要用来呈现数据汇总、排序、分组对比的效果,一般都是“横平竖直”的效果,也就是我们常说的二维表格,最多也就是通过一些斜线、合并表示一些特殊的数据关系。事实上,报表还可以通过实行各种不规则的布局,来发挥更大的作用。

    首先,我们就拿我们每个人几乎都遇到过的大大小小的各种考试来举例。每逢考试就一定会有考场座位分布图,以便考生对号入座参加考试。这里看一个具体的案例,来自于某地的一次职业技能考试,总共涉及数十所所学校,数千名考生,每人参加 4 门学科,需要按照专业、场次、时间以及一定的随机规则进行座次安排,最终输出座位分布图,然后打印并在各个考场张贴。要求每名考生的座位标签如下图所示:

         整个教室的作为分布如下图所示:

    这种形式的报表就不再是简单的“横平竖直”了,而是我们所说的不规则布局。具体第说,这种布局有一个形象的名称“龙形布局”,也就是每个小的局部作为标签具有自己的布局,好像是龙的鳞片,而整体上又按照一定的宽度(这里是 2 列)进行纵向排布。

    那么,有什么方法可以简单、快捷地一下子制作出数千人的“龙形布局”座次分布图呢?——润乾报表就可以!

    话不多说,下面我们一起看一下润乾报表中如何轻松搞定这类不规则布局的吧!

         首先,根据效果图绘制报表样式和框架,如下:

    这里偷偷泄露一个小【技巧】,我们使用“to 函数 + 纵向扩展”控制每列放几张桌子,就是上图 C4 单元格的表达式。

         接下来,填入考生信息,如下

    其中:

    A4 单元格中表达式为:=ds1.group(ZYGZMC;ZYGZMC:1),合并单元格 A4-A8, 纵向扩展,分组取出职业名称并升序排列,后面的数据将默认以 A4 单元格为主格跟随扩展取数。

    B4 单元格中表达式为:=ds1.group(KCMC;KCMC:1),操作同上,KCMC 代表考场名称

    D5 单元格中表达式为:=valueat(ds1.select(LLKCZWH:-1,LLKCZWH<6),C4),给每个桌子贴上理论考场座位号

    E4 单元格中表达式为:= “理论:”+ds1.select(LLPD,LLKCZWH==D5),ds.select 函数根据理论考场座位号(LLKCZWH)取出理论评审(LLPD)成绩

    F4 单元格中表达式为:=ds1.select(ZHPD:-1,LLKCZWH==D5),操作同 E4,ZHPD 代表 综合评审成绩

    E5 单元格中表达式为:=”实践:”+ds1.select(SCPD,LLKCZWH==D5),操作同 E4,SCPD 代表实践评审成绩

    E6 单元格中表达式为:=”综合评审:”+ ds1.select(ZHPD,LLKCZWH==D5),操作同 E4,ZHPD 代表综合评审成绩

    E7 单元格中表达式为:=ds1.select(XM,LLKCZWH==D5),操作同 E4,XM 代表考生姓名

    E8 单元格中表达式为:=ds1.select(ZKZH,LLKCZWH==D5) ,操作同 E4,ZKZH 代表考生准考证号

    到这里,我们已经将左边 1 列的 5 位同学安排妥当了,接下来的操作相对就简单一些了,主要是把 D、E、F 列的内容复制到 H、I、J 列,然后做一些小的修改:

    H5 单元格中表达式为:=valueat(ds1.select@r(LLKCZWH:1,LLKCZWH>5),C4),复制粘贴得时候别忘记修改取数的范围奥。

    I4 单元格中表达式为:= “理论:”+ds1.select@r(LLPD,LLKCZWH==H5),注意注意,这里有一丢丢变化奥, ds.select 函数使用 @r 选项是为了保证数据从根数据集中取数不受前面那列的影响奥。

    J4 单元格中表达式为:=ds1.select@r(ZHPD:-1,LLKCZWH==H5)

    I5 单元格中表达式为:=”实践:”+ds1.select@r(SCPD,LLKCZWH==H5)

    I6 单元格中表达式为:=”综合评审:”+ds1.select@r(ZHPD,LLKCZWH==H5)

    I7 单元格中表达式为:=ds1.select@r(XM,LLKCZWH==H5)

    I8 单元格中表达式为:=ds1.select@r(ZKZH,LLKCZWH==H5)

         Bingo!有木有很意外,做到这里就已经轻松搞定考场分布报表了,是不是赶脚很简单,时间也节省了不少?多出来的时间您一定不介意(坏笑)我再多说些什么吧…..

    上面我们所完成的布局属于平面规划的直观展示,接下来,我们再看一种非常实用的业务场景:

    以仓储行业为例,在实现了条码管理的仓库,出入库单据可以通过简单的扫码完成货品的归位或取出,这时,出入库单据上就需要印制多个条目,每一项都会有相应的条目,如果按照常规布局的话,如下

    但是这种布局有一个问题,就是很有可能会出现错行扫描的情况!为此,润乾报表又偷偷给关注的我们程序猿哥哥发福利了——制作打印以下这种“错位”形式的“入场券”:

         是不是已经迫不及待想要进场了解下这种条码不规则“错位“布局是怎么被搞定的了? 别着急,我们这就开始说道说道:

    将左右错位的 2 个条形码看做一组,先弄出个样子,然后填写相应的数据表达式,如下:

    其中:

    A4 单元格中表达式为:

    =if(ds1.count()%2==0,to(1,ds1.count()/2),to(1,ds1.count()/2+1)),根据条码总数是奇数还是偶数,确定总共需要纵向扩展几组。

    B4 单元格中表达式为:=ds1.select(field1)(A4[-1]+A4),意从结果集 ds1.select(field1) 中根据行号取出条形码

    C4 单元格右键 选择“条形码”,内容表达式为:=B4,同时勾选“显示文字”, 指定条形码按照指定单元格数据呈现

    B5 单元格右键 选择“条形码”,内容表达式为:=C5

    C5 单元格中表达式为:=ds1.select(field1)(A4[-1]+A4+1)

    然后……就没有然后了……“噹噹噹”,是不是吓一跳,到这里又一个看似复杂的布局“错位条码清单”就这么轻松搞定了,忍不住想要动手试试了,那就别犹豫了“撸起袖子,做起来吧 !!!”。

         最最后,划重点圈知识点啦,不看的话,明天用到可别怪我没告诉您奥。

    如何控制布局:

    【知识点】使用 to() 函数来做一些特殊报表格式的控制,根据条件限定行列数;

    如何从一个集合中取出指定的成员

    【知识点】valueat() 常用于从数组或者集合表达式中取出的某一个元素;

    如何排除前面列的影响直接从总结果集拿数据

    【知识点】比如考场座位图中 @r 选项的使用

    小提示:

    【操作技巧】制作此类报表如果不能一眼找出数据呈现的规律以及取数方式不妨拿出纸笔,在纸上写出一部分数据,或许一下就明白了。

    说到这里,关于“报表布局技巧与应用”的简单介绍真的真的告一段落了,实现上面的效果我们仅仅是在常规展现的报表基础上使用了 1-2 个函数(比如:to()、valueat()、if())就做出了考场座位图、错位条码清单的效果,有木有感觉 So easy,几个函数轻松搞定。从此以后,做表再也不用害怕遇到神马仓库货位管理展示图、学生宿舍的分布….. 的情况了, 总之一句话,有了润乾报表,那都不是事儿!!!

    号外号外:报表制作过程中设计到所有的函数都可从“用户手册—第 5 章  表达式及函数 ”中查阅详解奥,这个秘密一般人我不告诉的奥。

    作者:IBelieve

    链接:http://c.raqsoft.com.cn/article/1533026639184?r=IBelieve

    来源:乾学院

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    PHP atanh() 函数
    PHP atan2() 函数
    PHP atan() 函数
    #检查磁盘使用率超过90%,并且后台进程没有rman在跑,就运行 /data/script/del_dg_arch.sh 脚本清理归档
    [学习笔记]自适应辛普森积分
    C# 如何写 DEBUG 输出
    C# 如何写出一个不能被其他程序集继承的抽象类
    C# 如何写出一个不能被其他程序集继承的抽象类
    C# 如何引用 WshShell 类
    C# 如何引用 WshShell 类
  • 原文地址:https://www.cnblogs.com/IBelieve002/p/9674303.html
Copyright © 2011-2022 走看看