Skip to Content
Docs报表工具07 报表工具

版本: v1.0 修改日期: 2026-05-29

本手册介绍 viSCADA 报表工具从需求分析到报表发布的端到端流程,覆盖模板创建、数据源与数据集配置、模板上传与验证、业务系统集成。模板语法细节不在本手册展开,统一以 《viSCADA 报表语法 2.0》 为准。

1 整体流程

从收到需求到报表上线,标准流程如下:

图 1 viSCADA 报表制作整体流程

步骤对照表:

步骤操作目标对应章节
1.需求分析判断是否可用报表工具实现,明确数据来源3 需求分析与模板拆解
2.模板拆解分析父子关系、扩展方向、数据集划分3 需求分析与模板拆解
3.创建模板文件创建 .xpt.xlsx 文件与工作表4 模板创建
4.配置数据源创建 JDBC 数据库连接5 数据源创建
5.创建数据集编写 SQL 或配置 HTTP 接口6 数据集创建
6.模板上传上传模板文件并选择报表类型7 模板上传与验证
7.预览验证预览生成结果并下载报表7 模板上传与验证
8.业务系统集成接入业务系统预览或列表8 业务系统集成

图 2 需求到实现的决策路径

2 术语规范

本手册涉及的核心术语如下。代码标识保留原形式,业务概念首次出现括注。

术语代码标识定义权威源
「模板文件」.xpt.xlsxviSCADA 报表工具识别的模板扩展名,区别于 V1 语法本手册 4.1
「全局工作表」XptWorkbookModel整个工作簿的初始化工作表,引入跨表共享数据集本手册 4.2
「Sheet 初始化表」XptSheetModel与业务工作表成对出现的初始化工作表本手册 4.2
「数据集助手」datasetsHelper通过 inject 获取的数据集操作 Bean本手册 4.3
「EL 表达式」${...}单元格内取值表达式,用于引用数据集字段《报表语法 2.0》
「展开表达式」*=单元格扩展语法前缀,后接字段名与方向《报表语法 2.0》
「运行时对象」xptRt单元格表达式执行环境全局变量,定位单元格/行/表/工作簿本手册 4.6
「占位符」数据集 SQL 中留空的参数,生成报表时按键值对注入本手册 6.1

📌 V1 与 V2 语法差异较大,本手册仅覆盖 V2 语法。V1 语法相关项目(如雄安报表)请参考旧版文档。

3 需求分析与模板拆解

确定使用报表工具后,必须对样板进行结构化拆解,明确:

  • 数据划分(哪些数据属于同一数据集)
  • 父子关系(哪些单元格控制哪些单元格的扩展)
  • 扩展方向(向下 / 向右)

3.1 示例 1:供暖季统计报表

图 3 供暖季统计报表样板

拆解要点:

  • 数据分为两部分:供暖季汇总统计 + 每月明细
  • 每月明细结构一致,需按月向下扩展

3.2 示例 2:用户分类表码报表

图 4 用户分类表码报表样板

拆解要点:

  • 用户按类型分类
  • 同一类型下用户数量不固定,用户列表需向下扩展
  • 每个类型下,单站点挂载的表码数量不同
  • 每组数据按日期向右扩展

4 模板创建

模板操作基于 《viSCADA 报表语法 2.0》,本章仅说明工程实践,不重复语法细节。

4.1 创建模板文件

viSCADA 支持 .xlsx 类型文件作为模板。为与 V1 版本语法区分,模板文件名必须以 .xpt.xlsx 结尾,例如 heating-monthly-report.xpt.xlsx

⚠️ 使用 V1 语法时,模板文件必须用 Microsoft Office 创建,不得使用 WPS。WPS 会导致共享字符串不自动扩展,引起数据缺失(雄安报表历史故障原因)。V2 语法不受此限制,但仍推荐 Office。

4.2 工作表结构

模板中存在两类特殊工作表,用于承载初始化逻辑:

工作表类型命名规则作用范围典型用途
「全局工作表」XptWorkbookModel整个工作簿引入日期、天气等公共数据
「Sheet 初始化表」${SheetName}-XptSheetModel对应的 ${SheetName} 工作表该 Sheet 专属的数据集与变量

图 5 XptWorkbookModel 全局工作表示例

图 6 XptSheetModel 成对配置示例

📌 报表含多个业务工作表时,每个业务表都需要一个配对的 XptSheetModel,命名严格遵循 ${SheetName}-XptSheetModel

4.3 数据引入与二次处理

数据集操作通过 datasetsHelper Bean 完成。在初始化工作表中首先引入:

const datasetsHelper = inject("datasetsHelper");

数据集操作函数:

函数签名说明示例
loadDsvoid loadDs(String datasetName, Integer datasetId)获取数据集并载入单元格语法上下文loadDs("数据集名称", 12345)
getDsObject getDs(Integer datasetId)仅获取数据集对象,不载入上下文let dataset = getDs(12345)
getFieldListObject getFieldList(Integer datasetId, String field)获取数据集指定字段形成的子数据集let fieldDataset = getFieldList(12345, "key1")
assignvoid assign(String datasetName, varName)向单元格语法上下文载入已有数据集assign("数据集名称", dataset)

📌 使用 loadDs 后无需再次 assign。两者互斥:loadDs = getDs + assign

内置工具函数:

函数签名说明示例
nowTimestamp now()当前时间戳let now = now() 返回 2024-10-10 10:45:37.993
todayLocalDate today()今日日期let today = today() 返回 2024-10-10
currentDateTimeLocalDateTime currentDateTime()当前日期时间let dt = currentDateTime() 返回 2024-10-10T10:49:38.058062
parseFloatfloat parseFloat(String value)字符串转浮点let f = parseFloat("123.45")
parseIntint parseInt(String value)字符串转整数let i = parseInt("123")
parseBooleanboolean parseBoolean(String value)字符串转布尔let b = parseBoolean("true")

数据集二次处理函数:

现场需求往往需要在 SQL 之外对数据再加工,主要场景包括:

  • 按关键词合并多个数据集(中节能报表案例)
  • 平铺数据转父子结构(华星报表案例)
  • 通过工具函数直接处理(忻州项目案例)
函数签名说明示例
concatString concat(String... part)字符串拼接let s = concat("A","B","C")
mergeObject merge(List<String> primaryKeys, List<List<Map>> datasets)按关键词合并数据集let ds = merge(["pid","aligntime"], [dsA, dsB])

📌 merge 的主键相同时,后者覆盖前者(上例中 B 覆盖 A)。

4.4 单元格数据绑定

单元格取值支持两种表达式:

表达式语法示例说明
「EL 表达式」${数据集.字段}${userList.user_name}详见 《报表语法 2.0》2.3.2
「展开表达式」*=字段名*=fieldName前缀 *= 后直接跟字段

4.5 单元格扩展

对于同类数据的横向/纵向排列(如多站点、多日期),支持两种配置方式。

方式一:展开表达式

语法等价含义
*=^ds1!fieldName向下扩展,扩展对象 ds1,扩展字段 fieldName
*=>ds1!fieldName向右扩展,扩展对象 ds1,扩展字段 fieldName
*=^fieldName@entity.children向下扩展,沿 entity.children 父子路径展开

方式二:单元格批注

属性说明示例
「expandType」扩展方向。r = 沿行展开,c = 沿列展开expandType=r
「expandExpr」扩展对象(数据集或 list),出现在 = 左边expandExpr=shouzhansubstations

4.6 单元格属性

模板中单元格非独立存在,需要通过关系定位取值。工具在表达式执行环境注入全局变量 xptRt

xptRt 属性表:

属性说明典型用法
xptRt.cell等价 cell,定位当前单元格expandExpr=cell.rp.ev(当前格行父格的扩展值)
xptRt.row等价 row,定位当前行
xptRt.table等价 table,定位当前表格
xptRt.sheet等价 sheet,定位当前 Excel 表单
xptRt.workbook等价 workbook,定位当前工作簿
xptRt.field(name)从最近邻环境对象取字段值xptRt.field("user_name")

单元格批注可配置属性:

属性说明示例
rowParent / rp行父格。未指定时向左查找rowParent=C3
colParent / cp列父格。未指定时向上查找colParent=C3
expandType扩展方向,r 沿行,c 沿列expandType=r
expandExpr扩展对象,出现在 = 左边expandExpr=shouzhansubstations
expandValue / ev获取指定单元格的扩展对象,出现在 = 右边valueExpr=cell.rp.ev.name
expandIndex / ei单元格在父格中的下标,从 0 开始
ds当前数据源对象
field未指定 expandExpr 时,按该字段对当前数据集汇总并分组展开
keepExpandEmpty扩展集合为空时保留单元格(值置 null),而非删除
expandInplaceCount模板预留的展开单元格数量,小于此值不新增行列expandInplaceCount=12
exportFormula生成的报表单元格中保留公式exportFormula=true

4.7 单元格公式

基于 Excel 原生能力,支持大多数 Excel 函数。常用函数清单:

函数说明示例
SUM求和。对扩展单元格求和时必须有边界SUM(A7)
PRODUCT乘积(限制同 SUM)PRODUCT(A1:A5)
COUNT统计数字单元格数量COUNT(A1:A10)
COUNTA统计非空单元格数量COUNTA(A1:A10)
AVERAGE取平均AVERAGE(A1:A10)
MIN / MAX最小 / 最大值MIN(A1:A10)
NVL(value, defaultValue)空值判断,value 为 null 时返回 defaultValueNVL(A1, 0)
PROPORTION占比(如每月用量占全年比例)
RANK排名
ACCSUM累积汇总
CONCAT文本/单元格拼接
IF条件判断,必须用 ${} 引用${IF(A1>0, "正", "负")}

📌 单元格格式 + 数据类型必须匹配:单元格格式需为数值型,且实际数据也必须是数值,否则报错。

📌 扩展单元格的四则运算必须用 ${} 引用。正确:${C1+0.5};错误:=C1+0.5(会破坏扩展逻辑)。

5 数据源创建

确定使用 JDBC 作为数据来源时,需要在平台配置数据源。详细操作见 《viSCADA 数据源配置手册》。

图 7 数据源管理界面(列表 + 详情)

操作入口: 「后台管理」「数据源」

核心操作:

操作用途注意事项
「+ 新增数据源」创建新数据源填写完整必填项后 「保存」 才生效
「搜索框」按名称模糊搜索支持部分匹配
「数据源名称」点击查看详情进入 「数据源详情」 区域
「🗑 删除」删除数据源配置确认后不可恢复
「测试连接」校验连接配置仅校验,不保存
「保存」提交新增或修改真正落库的动作

⚠️ 「测试连接」 成功 ≠ 已保存。必须再次点击 「保存」 才会持久化配置。

6 数据集创建

viSCADA 报表工具支持三种数据集类型,详细操作见 《viSCADA 数据集配置手册》:

  • JDBC 类型(来自数据库)
  • HTTP 接口(来自外部 API)
  • CSV 文件(来自 CSV 格式文件)

现场最常用 JDBC 与 HTTP。通过 「+」 图标新增数据集。

图 8 数据集管理界面(列表 + 新增入口)

6.1 JDBC 类型

图 9 JDBC 类型数据集配置页

字段是否必填示例说明
「数据集名称」所有换热站最新数据识别用名称,语义明确
「数据集类型」JDBC 类型默认已选
「数据源」heating-prod-db选择已配置数据源,或点击 「⚙ 去创建」 跳转 数据源管理
「SQL 语句」SELECT * FROM station WHERE pid = :pid符合 SQL 语法
「占位符配置」pid1001键值对,为 SQL 挖空,生成报表时注入

6.2 HTTP 接口

图 10 HTTP 接口数据集配置页(含接口配置弹窗)

字段是否必填示例说明
「数据集名称」一片区换热站24小时平均供温识别用名称
「数据集类型」HTTP 接口切换到此项
「数据源」点击 「⚙ 接口配置」 打开配置对话框
「占位符配置」HTTP 接口场景无意义,无需填写

7 模板上传与验证

模板使用分为两种方式:

方式场景触发时机
「手动生成」非定时、按需生成用户点击预览时
「定时生成」周期性报表平台定时任务自动触发

上传入口: 「运行管理」「报表模板」「+ 新增模板」

图 11 报表模板列表与新增入口

⚠️ 上传的模板文件必须是已解密.xpt.xlsx 文件。

7.1 普通报表

触发条件:报表类型选择为 「普通报表」,点击 「确定」 保存。

图 12 普通报表配置界面(模板信息 + 数据集配置)

配置步骤:

步骤操作字段说明
1鼠标悬停在模板上,点击 「使用模板」跳转到数据集配置页
2选择 「数据集」任选一个非空数据集即可(为兼容 V1 语法强制要求,V2 模板内部已完成数据集引入)
3填写 「报表名称」默认为模板名称,每次生成前可修改
4配置 「临时全局占位符」键值对,匹配数据集所需参数
5点击 「预览报表」预览成功即为配置正确
6点击 「下载报表」导出生成的报表文件

验证通过的可观测标志:

  • 「预览报表」 页面正常加载,数据填充完整
  • 下载的文件可用 Excel 正常打开,扩展单元格按预期展开

7.2 定时报表

触发条件:报表类型选择为 「定时报表」,需额外配置定时参数。

图 13 定时报表参数配置界面

字段是否必填示例说明
「是否可重新生成」 / 是否允许对历史报表重新生成
「命名规则」月度供暖报表-{yyyyMM}{} 内写入占位符
「数据集」任选一个同普通报表,兼容用
「定时频率」 / / / / 自定义见下表

定时频率执行时间:

频率执行时间
日报表每日凌晨 00:00:15
周报表每周一凌晨 00:00:15
月报表每月 1 号凌晨 00:00:15
年报表每年 11 日凌晨 00:00:15
自定义按 Cron 表达式配置

图 14 自定义频率 Cron 配置界面

验证通过的可观测标志:

  • 到达配置时间点后,报表列表出现按命名规则生成的新报表
  • 点击对应条目可预览与下载

8 业务系统集成

物联提供了业务系统集成文档,详见 《viSCADA 报表业务集成手册》。当前支持两种形式:

集成形式适用场景
「指定报表直接预览」业务页面嵌入指定报表,用户打开页面即看报表
「历史报表列表」业务页面嵌入报表列表,用户自选历史报表查看

9 常见问题

现象原因建议
模板上传后预览报错 “共享字符串未扩展”使用了 WPS 创建 V1 语法模板改用 Microsoft Office 重新创建模板文件
扩展单元格四则运算结果异常直接写 =C1+0.5 破坏了扩展改为 ${C1+0.5} 形式
SUM 对扩展单元格求和为 0扩展单元格未设置边界明确指定求和范围或使用边界单元格
数据集参数不生效未在 「临时全局占位符」 中配置按数据集 SQL 中的占位符键值补全
定时报表未按时生成Cron 表达式错误或命名规则冲突核对 Cron 与占位符,确认 「是否可重新生成」 设置
「测试连接」 成功但保存后不可用点击测试连接后未再次点击 「保存」重新进入数据源详情,点击 「保存」
模板文件扩展名被识别失败文件名不是 .xpt.xlsx 结尾重命名文件,确保以 .xpt.xlsx 结尾

💡 本手册为工程实践文档,不覆盖语法细节。遇到语法类问题请优先查阅 《viSCADA 报表语法 2.0》;遇到数据源/数据集配置问题查阅对应的权威源文档。

Last updated on