润乾报表中 JSON 数据的单元格直读与展示

一、背景与需求

在日常报表开发中,经常会遇到这样一种场景:业务系统通过 API 接口返回 JSON 格式的数据,报表需要直接读取这些数据并进行展示。
润乾报表提供了多种方式来读取和处理 JSON 数据,包括脚本数据集、集算器数据集以及单元格中的 SPL 函数等。本文重点介绍如何直接在单元格中读取 JSON 数据并提取字段进行展示,这是最轻量、最灵活的方式之一。

二、核心方法:单元格中使用 spl() 函数

润乾报表的 spl() 函数允许在单元格中直接执行 SPL(结构化过程语言)表达式,对 JSON 数据进行解析和提取,等同于在集算器中执行 eval 函数。
其语法为:spl(StringExp ,{argExp})

2.1 基础用法:提取单个字段

假设 A1 单元格存放着如下 JSON 数据:
{“code”: 0, “msg”: “ok”, “data”: [ { “construction_dt”: 879, “after_change_money”: 0, “control_mode”: “司签直管”, “owner_unit”: "", “project_code”: “01-01-2021-10-079”, “actual_commencement_dt”: “2020-02-02”, “actual_completion_dt”: null, “jt_code”:"", “name”: “测试总进度计划”, “month_owner_confirmed_revenue”: 0, “vat_rates”: 0, “proj_status”: “中标未签”}, {“construction_dt”: 1, “after_change_money”: 0, “control_mode”: “司签托管”, “owner_unit”:"", “project_code”: “02-03-2023-09-225”, “actual_commencement_dt”: “2023-02-28”, “actual_completion_dt”: null, “jt_code”:"", “name”: “test”, “month_owner_confirmed_revenue”: 0, “vat_rates”: 0, “proj_status”: “中标未签”} ]}

要在 A3 单元格提取所有项目的 construction_dt 字段值
则 A3 表达式为:=spl(‘json(?).data.field(“construction_dt”)’, A1),并设置单元格为纵向扩展。
解析:
json(?) —— 将 A1 的 JSON 字符串解析为 SPL 序表结构
.data —— 取 data 字段,即项目列表数组
.field(“construction_dt”) —— 提取所有记录的指定字段,返回序列

1png

预览结果为:

2png

2.2 带条件过滤的提取

根据 A3 中 construction_dt 的数据,获取 control_mode 的值
则 B3 的表达式为: =spl(‘json(?).data.select(construction_dt==?).field(“control_mode”)’,A1,A3)

3png

预览结果为:

4png

注意事项

1、A1 必须是纯 JSON 字符串,不能包含多余的格式字符
2、如果 JSON 中某个字段在部分记录中缺失,field() 会返回对应位置的 null 值
3、spl() 返回的是 SPL 序列对象,直接在单元格显示时可能呈现为数组格式,如需逐行展示需设置扩展方式。

总结

润乾报表的 spl() 函数为 JSON 数据的读取和展示提供了高度灵活的方案。通过在单元格中直接嵌入 SPL 表达式,可以轻松实现对 JSON 数据的解析、过滤、字段提取等操作,无需编写复杂的 Java 代码或额外的数据源配置文件。这种方式尤其适合 API 接口返回数据的即时展示场景,大大提升了报表开发的效率。