1. 概述
报表之间可以通过参数或超级链接等方式来传递数据,但是同一个模板中多个 sheet 之间是无法用参数和超级链接进行传值的。
那如何实现在一个 sheet 中取另外一个 sheet 中某个单元格的值呢?即如何实现跨 sheet 取数呢?下面将详细介绍。
如下图的例子,sheet1 中的订单成本是由 sheet2 中的单元格参与计算得来的,填报改变 sheet2 相关数据时,sheet1 订单成本也会跟着变化。
1.2 实现思路
可以使用公式=sheetname!cellname来实现跨 sheet 取值。例如在 sheet1 某个单元格中取 sheet2 中 A2 单元格的值,就可以添加公式:=sheet2!A2
如果 sheetname 中包含短线、下划线等特殊字符就需要给 sheetname 加上单引号,公式应写成:='sheetname'!cellname
2. 示例
2.1 准备数据
1)首先新建 2 个数据集,ds1 用于 sheet1 中,ds2 用于 sheet2 中,SQL 语句如下:
ds1:SELECT * FROM 订单
ds2:SELECT * FROM 订单明细
2)添加一个模板参数,设置默认值为 10001,如下图所示:
3)在参数面板给这个参数绑定控件,控件设置为下拉框,数据字典设置为订单表中的订单ID字段。
2.2 准备sheet2
1)新建一个 sheet2,如下图设计 sheet2 表格,将 ds2 中的字段拖拽到对应单元格中,A2 单元格添加过滤与模板参数完成绑定。
E2 单元格添加公式SUM(C2*D2),A2 单元格添加下拉框控件,B2~D2 添加文本控件,如下图所示:
2)给 sheet2 设置填报属性,如下图所示:
2.3 实现跨sheet联动
1)如下图设计 sheet1 表格,将 ds1 中的字段拖拽到对应单元格中,A2 单元格添加过滤与模板参数完成绑定。
C2 单元格添加公式sheet2!E2+B2,即取 sheet2 中 E2 单元格跟 sheet1 中 B2 单元格相加。
2)给 sheet1 添加填报属性,如下图所示:
2.4 效果预览
保存模板点击填报预览,修改 sheet2 中相关单元格,sheet1 中订单成本也会随之改变,效果见 1.1应用场景 中所示。
注:不支持移动端。
3. 注意事项
sheet 内与 sheet 间计算逻辑:
1)sheet 内计算逻辑,从左到右从上到下。
2)sheet 间计算逻辑,从左到右,如果有引用先计算引用。
3.1 问题描述
循环跨 sheet 取数可能会出现无法取数的情况。例如:
1)sheeet1的 C1 单元格为公式:sheet2!D1,C2 单元格为数字 3 ,C3 单元格为公式:sheet3!E1,如下图所示:
2)sheet2 的 D1 单元格为公式:sheet1!C2-sheet1!C3,如下图所示:
3)sheet3 的 E1 单元格为数字 2 ,如下图所示:
4)预览效果如下图所示:
3.2 原因说明
首先,sheet1 进行加载,先计算 C1 单元格,C1 单元格的公式引用了 sheet2,则 sheet1 计算中断,计算 sheet2,sheet2 计算 D1 单元格,D1 单元格的公式引用了 sheet1 的 C2 单元格和 C3 单元格。sheet1 的 C2 单元格有值,为数字 3 ,C3 单元格的公式引用了 sheet3,但此时无法触发 sheet3 的计算,则返回空。因为一个 sheet 只能触发一个其引用的 sheet ,无法触发第二个其引用的 sheet 。
3.3 解决思路
把一些需要被依赖的单元格统一放到一个sheet中,其他 sheet 都来引用此 sheet 里的单元格。
1)sheeet1的 C1 单元格为公式:sheet2!D1,C2 单元格为数字 3 ,C3 单元格为公式:sheet2!E1,如下图所示:
2)sheet2 的 D1 单元格为公式:sheet1!C2-sheet1!C3, E1 单元格为数字 2 ,如下图所示:
3)效果如下图所示:
4. 模板下载
点击下载模板:跨sheet联动.cpt