润乾报表实现层级编码转多列树形结构的技术实现方案

业务场景说明

在项目成本、清单编码等业务场景中,常以带连字符的层级编码(如 AB、AB-1、AB-1-1)表示树形结构,连字符数量代表层级深度,子级编码以父级编码为前缀。这类数据在报表中通常需要转为多列树形结构展示,方便按层级分组统计。本文将详细介绍实现此需求的两种技术方案。
· 报表单元格直接按规则取数
· 集算器脚本预处理后报表直接取数

1png

方案一:报表单元格直接按规则取数

在润乾报表的扩展单元格中,直接通过 group@r 函数按编码长度、前缀规则分组,实现不同层级的树形展示,无需额外预处理脚本,适合层级固定、编码规则简单的场景。

报表设计如下图所示:

单元格表达式
B2:=ds1.group@r (ID,len(ID)==2)
C3:=ds1.group@r (ID,len(ID)==4 && left(ID,2)==B2) 左主格设置为B2
D4:=ds1.group@r (ID,len(ID)==6 && left(ID,4)==C3) 左主格设置为C3
E5:=ds1.group@r (ID,(len(ID)==8 || len(ID)==9) && left(ID,6)==D4) 左主格设置为D4
F6:=ds1.group@r(ID,len(ID)>=10 && like(ID,E5+“*”)) 左主格设置为 E5

方案二:集算器脚本预处理 + 报表直接取数

通过集算器脚本先对数据进行预处理,将层级编码拆分为多列并生成映射关系,报表直接绑定处理后的数据集,按列取数即可,无需复杂扩展公式,适合层级不固定、数据量大的场景。
集算器脚本写法如下:

A B
1 =file(“D:/esProc20260306/report/web/webapps/demo/WEB-INF/reportFiles/cengji.xls”).xlsimport@t() // 读取 Excel 文件数据
2 =A1.group(ID).(~(1)) // 按 ID 去重,每个 ID 只保留第一条记录
3 =A2.derive(ID.split(“-”).(if(isdigit(), string(int(), “000”), ~)).concat(“-”) : SortKey).sort(SortKey) // 生成排序键,将 ID 按 "-" 分割,对纯数字段补零对齐,保证数字顺序正确
4 =A3.derive(ID.split(“-”):Parts,count(Parts) : Depth) // 将 ID 按 "-" 拆分为序列,并计算深度(层级数)
5 =A4.keys(ID) // 建立 ID 到 name 的映射表
6 =A4.max(Depth) // 获取最大深度,用于确定需要生成的列数
7 =A4.new(${A6.(“null:Level”/~).concat(“,”)})
8 // 动态生成 Level1~LevelN 列
9 =A7.run(~.field(A4(#).Depth,A4(#).ID)) // 将对应 ID 填入各层级列

集算器脚本的执行结果:

3png

报表设计如下:
报表数据集使用脚本数据集,找到对应的 spl 脚本文件。直接拖拽字段到单元格即可。

4png

最后,若编码层级固定、数据量不大,优先选择方案一,快速实现且无需额外依赖。若层级可能扩展、编码规则复杂,或数据量较大,可在集算器中提前过滤无效数据,减少报表端计算压力,优先选择方案二。