1. 概述
1.1 问题描述
设计报表时,如果遇到「序号」是用汉字数字来表示的,那么要如何对它进行排序呢,如下:
1.2 解决思路
方案一:数据很少时,可以使用高级排序-自定义顺序。也可利用内置数据集实现,详情请参照文档:利用内置数据集实现自定义排序。
方案二:在「扩展后排序」中添加公式。因为 FineReport 中没有将汉字数字转化为阿拉伯数字的公式,所以我们可以反过来,用 numto() 公式将阿拉伯数字转化为汉字数字,再将汉字数字与对应的阿拉伯数字联系起来。
注:方案二只适用于汉字数字从「一」开始且数字连续的场景。
2. 示例
2.1 准备数据
新建内置数据集,添加两个字段「序号」、「项目」,均为字符串类型,设计表如下图所示:
2.2 报表设计
将数据列拖入单元格,输入对应的标题,表格样式设计如下:
2.3 方案一:高级排序
双击 A1 单元格,点击「高级」,设置排列顺序为「升序」,输入公式:SWITCH($$$,"一",1,"二",2,"三",3,"四",4)。如下图所示:
2.4 方案二:扩展后排序
选中 A2 单元格,点击「单元格属性>扩展」,设置「扩展后排序」为「升序」,输入公式: INARRAY($$$, MAPARRAY(RANGE(COUNT(A2[!0])), NUMTO(item)))。
公式说明如下表:
公式 | 说明 |
---|---|
MAPARRAY(array,fn) | 批量处理数组,通过 fn 对数组中的元素进行转换 array(Array):要转换的数组,即 RANGE(COUNT(A2[!0])) fn(Function):处理数组项目的函数,即 NUMTO(item) |
RANGE(COUNT(A2[!0])) | 返回数组: [1,2,3,4],COUNT(A2[!0]) 为计算 A2 单元格扩展出来的所有值的个数 |
NUMTO(item) | 返回数字的中文表示。 注:NUMTO()函数不支持小数 |
MAPARRAY(RANGE(COUNT(A2[!0])), NUMTO(item)) | 返回数组:[一,二,三,四] |
INARRAY($$$,array) | 返回单元格当前值在数组 array 中的位置,如果不在 array 中,则返回 0 |
步骤如下图所示:
2.5 效果预览
2.4.1 PC 端
保存报表,点击「分页预览」,效果如下图所示:
2.4.2 移动端
App 端和 HTML5 端均支持,效果如下图所示:
3. 模板下载
文档仅给出方案二模板。
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\OrderReport\汉字数字排序.cpt
点击下载模板:汉字数字排序.cpt