条件渲染
为单元格设置条件渲染规则:按数值改变颜色、隐藏行列、替换显示值、分页、缩进和加链接;条件的编写方式、规则执行顺序、预设规则和常见问题。
概述
条件渲染在报表计算完成后,逐个单元格判断条件,条件成立时改变该单元格(或所在行、列)的呈现方式:背景色、字体、边框、行高列宽、显示值、分页、缩进、链接等。它不改变数据集里的数据,只影响显示。
功能入口
- 在设计器里选中单元格。
- 打开右侧单元格设置面板的「渲染」标签页,找到「条件渲染」。
- 点「添加规则组」,从下拉菜单选一条预设,或新建空规则组;也可以点「粘贴」粘贴之前复制的规则组。
- 规则组打开「渲染条件」对话框:填写「条件标题」,配置分支与渲染内容。
一个单元格可以有多个规则组,规则组可以复制到其他单元格。

规则组结构
一个规则组由若干分支组成:
| 分支 | 添加方式 | 说明 |
|---|---|---|
| if | 默认第一个分支 | 条件成立时应用它的渲染内容 |
| else if | 「+ 添加 ELSE IF 分支」 | 前面的分支都不成立时才判断 |
| else | 「+ 添加 ELSE 分支」 | 前面都不成立时应用,没有条件 |
每个分支包含两部分:「条件配置」和「渲染内容」。
条件配置
点「添加条件」增加一行条件,点「添加条件组」增加一组括号内的条件。条件之间用连接符 AND 或 OR 连接。每行条件选择类型:
普通条件:选择比较运算符,再填右值。
| 运算符 | 说明 |
|---|---|
| 等于、不等于 | |
| 大于、大于等于、小于、小于等于 | |
| 包含、不包含 | 文本包含 |
| 在集合中、不在集合中 | 值是否属于给定集合 |
| 以...开始、以...结束 | |
| 不以...开始、不以...结束 | |
| 为空、不为空 | 不需要右值 |
右值有多种类型:字符串、数值、日期、日期时间、布尔、公式、参数、单元格、数据列、集合。选「公式」时右值是一段表达式,选「参数」时右值是报表参数,选「单元格」时右值是另一个单元格的值。
公式条件:直接写一段表达式,例如 $$value > 10000。规则:
- 表达式的结果必须是布尔
true(或文本"true")才算成立。其他任何值,包括1、非空文本、非空集合,都算不成立。这与 报表基本语法 中的真假判断不同。 $$value表示当前单元格的值。数字文本会自动转成数值,以 0 开头的编码(如001)保持文本。- 可以引用其他单元格、参数、函数,如
B2 > $threshold、row() % 2 == 1。
条件的判断顺序
- 一个单元格上的多个规则组彼此独立,都会判断。
- 一个规则组内,按 if、else if、else 的顺序判断,遇到第一个成立的分支就应用它,后面的分支不再判断。
- 分支内的多行条件从上到下判断:遇到 AND 连接的条件不成立就整体不成立;遇到 OR 连接的条件成立就整体成立。第一行条件的连接符不起作用。
- 分支没有渲染内容时被跳过。
需要「A 且 B,或 C」这样的组合时,用「添加条件组」表达括号,或直接写成一个公式条件。
作用范围
每项渲染内容都可以设置作用范围:
| 范围 | 含义 |
|---|---|
| 当前单元格 | 只改变本格 |
| 当前行 | 改变本格所在的整行(整行同格式,如隔行变色) |
| 当前列 | 改变本格所在的整列 |
渲染内容类型
| 类型 | 作用 | 说明 |
|---|---|---|
| 背景色 | 单元格背景 | 选择颜色 |
| 字体颜色 | 文字颜色 | 选择颜色 |
| 字体样式 | 加粗、斜体、下划线、删除线 | |
| 换行计算 | 文本自动换行 | |
| 分页 | 在行前或行后插入分页符 | 选「行前分页」或「行后分页」 |
| 新值 | 替换显示的值 | 填公式,结果作为新的值 |
| 边框 | 单元格边框 | |
| 行高 | 设置行高 | 填 0 隐藏整行 |
| 列宽 | 设置列宽 | 填 0 隐藏整列 |
| 缩进 | 文本缩进 | 填缩进的字符数 |
| 链接 | 附加超链接 | 见 单元格链接概述 |
| 内容渲染 | 改变内容的展示形式 |
新值
「新值」填写的是一段表达式,不是普通文本。想显示固定的文字,必须带引号:
| 写法 | 效果 |
|---|---|
"—" |
显示横杠 |
"是" |
显示「是」 |
— |
无引号,不是有效表达式 |
$$value * 100 |
显示原值的 100 倍 |
$$value::string + '%' |
原值后加百分号 |
设置新值后,单元格会按其原有的数据格式重新格式化。
操作示例
示例一:负数标红
- 选中金额单元格,进入「渲染」标签页,点「添加规则组」,选预设「负数标红」;也可以手动配置。
- 手动配置:if 分支,条件类型选「公式条件」,公式写
$$value < 0。 - 渲染内容选「字体颜色」,作用范围「当前单元格」,颜色选红色。
- 预览,金额为负数的单元格显示红色文字。
示例二:隔行变色
- 选中数据行任意一格。
- 添加规则组,选预设「隔行变色」,即公式条件
row() % 2 == 1,渲染内容为「背景色」,作用范围「当前行」。 - 预览时奇数行显示浅灰背景。
row() 是计算后的整张报表的行号,表头行也计入。要让第一条数据行不着色,把条件改成 row() % 2 == 0。
示例三:分级着色
一个规则组内使用 if、else if、else,为「达成率」三段着色:
| 分支 | 条件 | 渲染内容 |
|---|---|---|
| if | $$value < 0.3 |
字体颜色红 |
| else if | $$value < 0.7 |
字体颜色橙 |
| else | 无 | 字体颜色绿 |
这就是预设「百分比区间色」。
示例四:空值显示横杠
if 分支,公式条件 $$value == null || $$value == "",渲染内容选「新值」,填 "—"。
示例五:隐藏值为 0 的行
if 分支,公式条件 $$value == 0,渲染内容选「行高」,作用范围「当前行」,行高填 0。
示例六:与上一行相同则淡化
公式条件 $$value == cellOffset('B2', -1, 0),B2 换成本格自己的名称,渲染内容选「字体颜色」灰色。cellOffset 见 报表与数据集函数。
示例七:全表前三名高亮
公式条件 rank(G1[!0], G1) == 1,G1 换成本格自己的名称,渲染内容选「背景色」,作用范围「当前行」。用 else if 再加 == 2、== 3。排名规则见 聚合与集合函数:并列同名次,排名范围是整张报表,不分组。
示例八:手机号脱敏
if 分支,公式条件 $$value != null && length($$value::string) >= 7,渲染内容选「新值」:
left($$value::string, 3) + '****' + right($$value::string, 4)
$$value 会把数字文本转成数值,所以传给 left、right 前要 ::string 转回文本。
预设规则
「添加规则组」下拉菜单里的预设,按类别:
| 类别 | 预设 | 条件 | 效果 |
|---|---|---|---|
| 样式 | 隔行变色 | row() % 2 == 1 |
当前行浅灰背景 |
| 样式 | 负数标红 | $$value < 0 |
字体红 |
| 样式 | 阈值高亮 | $$value > 10000,else |
超过 10000 红底红字,否则绿底绿字 |
| 样式 | 正负值双色 | > 0、< 0、else |
正数绿、负数红、零灰 |
| 样式 | 合计行加粗 | $$value == "合计" || $$value == "小计" |
当前行加粗 |
| 样式 | 前N名高亮 | rank(本格[!0], 本格) == n,n 取 1、2、3 |
前三名整行金、银、铜色 |
| 样式 | 过期标红 | $$value != null && $$value < now() |
早于当前时间的日期标红 |
| 样式 | 三级状态色 | 完成、进行中、else | 绿、蓝、灰 |
| 样式 | 百分比区间色 | < 0.3、< 0.7、else |
红、黄、绿 |
| 布局 | 值为0隐藏行 | $$value == 0 |
行高 0 |
| 布局 | 空值隐藏行 | $$value == null || $$value == "" |
行高 0 |
| 布局 | 分组后分页 | true |
行后分页 |
| 布局 | 行前分页 | true |
行前分页 |
| 布局 | 按层级缩进 | true |
缩进 2 个字符 |
| 值 | 空值显示横杠 | $$value == null || $$value == "" |
新值 "—" |
| 值 | 布尔值转文本 | $$value == true、else |
新值 "是"、"否" |
| 值 | 敏感数据脱敏 | 见下 | 见下 |
预设生成的只是初始配置,可以在对话框里继续修改。使用注意:
- 「敏感数据脱敏」预设使用的
len、mid不是内置函数,预设生成后运行会报错。请改用示例八的写法。 - 「分组后分页」「行前分页」「按层级缩进」的条件是固定的
true,对每一行都成立;需要只对分组末尾分页时,自己改写条件。 - 「前N名高亮」的名次范围是整张报表,不分组。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 条件写了但一直不生效 | 公式的结果不是布尔 true,例如写成了 $$value、1 |
写成比较式:$$value > 0 |
公式写成 $$value = 0 |
= 是赋值,不是比较 |
用 == |
| 文本编码的比较不符预期 | $$value 把数字文本转为数值,'001' 因前导 0 保持文本 |
比较前统一用 ::string,或用数值比较 |
| 新值显示报错 | 固定文字没有加引号 | 写成 "—" |
| 行高设置 0 后整行消失 | 这是设计行为,用来隐藏行 | 不需要隐藏时不要设置为 0 |
row() 在「内容公式」里是 0 |
主内容计算阶段行还没有编号 | 只在条件渲染里用 row(),见 报表与数据集函数 |
| 多个规则组同时成立,效果叠加不符预期 | 规则组彼此独立,每个规则组都会判断 | 合并成一个规则组,用 else if 分支表达互斥 |