数据库中存储的数据通常会有一些代码值字段,如员工编号、部门代码、类别 ID 等等,报表展示时如果直接展示代码值形式,使用人员无法理解该值的具体含义,所以要求将编码值转换成对应的使用人员能够理解的中文形式,又或者数据库中存储的出生日期是 date 形式,展现时要将其转换成标准的 2018 年 12 月 12 日这种形式。下面通过一个例子的实际操作来介绍下这种需求的实现方法。
首先连接润乾自带的 demo 数据源,从“员工”表中取数制作一个员工信息表,报表模板如下图:
此时点击预览,报表结果如下:
要求:
1、 将出生日期转换成标准的 yyyy 年 MM 月 dd 日格式
2、 将性别、学历转换成对应的中文形式
3、 将工资加上货币符号
日期格式设置
报表单元格中支持显示格式设置,直接对数据进行格式化操作,选中 C3 单元格,双击右侧的显示格式的值属性,会弹出显示格式设置对话框:
里边有各类型格式设置,找到日期分类中的 yyyy 年 MM 月 dd 日,点击确定,这样,出生日期列就能按照想要的格式效果展示。
数值转中文
接下来看下性别和学历设置,性别比较固定,一般就是“男”或者“女”,针对此种比较固定的,可以在显示值表达式中的 if 函数进行控制,在 D4 单元格的显示值表达式中写入:if(value()==1,“男”,“女”),value() 函数是报表自带的一个函数,用于获取当前单元格的真实值,通过判断当前单元格为 1 时,返回显示值“男”,否则显示“女”,注意:value()==1,性别字段在数据库中是整数,所以此处直接写 1,如果是字符串,需要写成”1”,要注意数据类型,如果有多种类型,可以做 if 嵌套,具体可以参考报表函数说明。针对此种数据比较固定的,还有一个函数可以实现:map 函数,也可以在 D4 单元格的显示值表达式中写入:map(list(1,2),list(“男”,“女”)),第一个 list 中列出的是单元格内真实值的列表,第二个 list 会进行显示值的映射。
学历单元格设置和性别有些类似,都要通过显示值表达式进行设置,可以使用 if 或 map 函数,但是学历数据会较多,需要写入大量的表达式,并且学历在数据库中可能是会变化的,比如过段时间会增加个新学历,还要再次修改报表,针对此种形式,数据库中通常会有中文字典表。在报表中新增数据集,从“DEGREE”表中取数,该表中数据如下:
可以看到,ID 中的数据就是员工表中学历列的值,NAME 字段存储的是对应的中文,这样可以根据 ID 和 DEGREE 字段的关联,取出需要的中文进行显示,在 E3 单元格的显示值表达式中写入:ds2.select(NAME,ID==value(),1),该表达式含义为从 ds2 数据集中取出 ID 等于当前单元格值的 NAME 字段的值放到显示值中显示,注意后边的 1 为取出满足条件的第一条记录,如果有满足直接进行返回不再向后判断,所以为提高报表计算效率,需要增加“1”的设置。这里用到了从另外一个数据集中取出对应的中文的写法,实际使用中,如果字典表和数据表在同一个库中,建议通过一个 sql 通过 where 关联方式直接取出中文,这样当数据量大时效率更高,如果数据来自不同库,数据量大时导致计算较慢,可以通过集算器将两个数据集 join 在一起返回到报表是一个数据集,这样效率更高,具体看实际需求。
货币格式
最后工资列设置显示格式“¥#0.00”就行了,如图:
最终报表展示效果如下:
本例中通过显示格式和显示值表达式的使用能够控制单元格的显示样式,此时更改的只是单元格显示效果,如果在其他单元格引用这些单元格的话,引用的还是报表单元格的原值,如果要引用显示值,可以使用 disp() 函数。
显示格式表达式控制
显示格式目前用到最多的是直接在显示格式中选择,实际上显示格式支持表达式对其进行控制,比如某个单元格表达式为:=list(11,12.5345,14,15.66),这个单元格展示时既有浮点数,又有整数,好多客户希望如果是整数则直接显示整数, 如果是浮点数,则保留两位小数显示,这样就用到了显示格式表达式,如在该单元格的显示格式表达式中写入:if(value()==int(value()),“#”,“#0.00”),判断该单元格的数值是否是整数,如果是则显示格式为”#”, 否则显示格式为”#0.00”, 该单元格预览后效果如下:
可以看到报表属性可以通过表达式进行动态控制,达到动态的显示效果。
显示值实现特殊格式
润乾自带了显示格式,但有些格式可能无法满足客户的特殊需要,比如 2018-11-30 这种日期格式需要显示成:30 Nov. 2018,此时可以使用显示值表达式进行特殊设置,比如 B2 单元格为日期,则在 B2 单元格显示值表达式中写入:string(day(value()))+" “+case(string(month(value())),“1”:“Jan.”;“2”:“Feb.”;“3”:“Mar.”;“4”:“Apr.”;“5”:” May.“;“6”:“Jun.”;“7”:“Jul.”;“8”:“Aug.”;“9”:“Sept.”;“10”:“Oct.”;“11”:“Nov.”;“12”:“Dec.”)+” "+string(year(value()))
该表达式先通过润乾函数分别截取日期中的日、月、年,然后通过 case 函数将月转换成想要的格式再拼接在一起,这样就能够实现特殊显示格式的控制。
总结
通过显示格式能将数据进行格式话操作,通过显示值能够将单元格内的值换成其他值进行显示而不影响原单元格的真实值,并且两个属性都可以通过表达式灵活设置,使得数据显示设置真的灵活运用于各种需求之中。
作者:gxy
链接:http://c.raqsoft.com.cn/article/1543563271737?r=IBelieve
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。