1. 概述
1.1 应用场景
报表之间可以通过参数或超级链接等方式来传递数据,但是同一个模板中多个 sheet 之间是无法用参数和超级链接进行传值的。
那如何实现在一个 sheet 中取另外一个 sheet 中某个单元格的值呢?即如何实现跨 sheet 取数呢?下面将详细介绍。
如下图的例子,sheet1 中的订单成本是由 sheet2 中的单元格参与计算得来的,填报改变 sheet2 相关数据时,sheet1 订单成本也会跟着变化。
1.2 实现思路
可以使用公式=sheetname!cellname来实现跨 sheet 取值。例如在 sheet1 某个单元格中取 sheet2 中 A2 单元格的值,就可以添加公式:=sheet2!A2
如果 sheetname 中包含短线、下划线等特殊字符就需要给 sheetname 加上单引号,公式应写成:='sheetname'!cellname
1.3 注意事项
当前 sheet 计算逻辑:
1)sheet 内计算逻辑, 从左到右从上到下。
2)sheet 间计算逻辑, 从左到右, 如果有引用先计算引用。
问题描述:
循环跨sheet取数可能会出现无法取数的情况,例如:sheet1 进行加载,先计算C1,C1引用的 sheet2,那现在计算中断,计算 sheet2,sheet2 先计算 D1,引用到了 sheet1 的 C2 和 C3。sheet1 的 C2 有值,C3 是引用的 sheet3,但这个时候没有去触发 sheet3 的计算,也就是 sheet1 引用 sheet2 触发了 sheet2 的计算,但是后面 sheet1 引用 sheet3 没有触发 sheet3 的加载,引用别的 sheet 触发该 sheet 的计算只发生了一次。C3没有触发 sheet3 的计算,就返回了空。
解决思路:
把一些需要被依赖的单元格统一放到一个sheet中,其他sheet都来引用这个sheet里的格子
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. 模板下载
已完成模板请参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Form\MultiSheetReport\跨sheet联动.cpt
点击下载模板:跨sheet联动.cpt