SSRS报表:查找当前渲染的tablix并实现Word导出场景下动态页脚
可行实现思路
SSRS 导出 Word 时常规方案不生效的核心原因是 Word 采用软分页逻辑,原生依赖硬分页的页脚表达式(比如基于 Globals!PageNumber 跨页传值的方案)会失效,以下是三种实测有效的解决方案:
方案1:子报表拆分(兼容性最好,无额外操作)
- 将两个 Tablix 分别放到两个独立的子报表中,每个子报表单独配置对应需求的页脚提示
- 两个子报表的报表属性中均勾选「如果没有足够的空间放在一页,请调整宽度」,关闭不必要的硬分页设置
- 主报表中按顺序插入两个子报表,在两个子报表之间添加硬分页符(选中第二个子报表,属性中设置
PageBreak.Before = True) - 导出 Word 时,SSRS 会自动将子报表的页脚作用范围绑定到各自的内容页,无需用户后续操作即可正常显示
方案2:Word 域代码实现(不需要拆分报表结构)
- 在第一个 Tablix 开头插入隐藏文本框,设置书签名为
Tablix1_Start,在第一个 Tablix 末尾插入隐藏文本框,设置书签名为Tablix1_End - 页脚插入文本框,写入以下表达式生成 Word 域:
= "^d IF ^d PAGE ^d >= ^d PAGEREF Tablix1_Start ^d AND ^d PAGE ^d <= ^d PAGEREF Tablix1_End ^d ""第一个表格的提示内容"" ""第二个表格的提示内容"" ^d"
- 导出 Word 后按 F9 刷新所有域即可生效,自动化导出场景可搭配 Office VBA 批量触发域刷新,无需用户手动操作
方案3:自定义代码标记渲染范围(适合多 Tablix 复杂场景)
- 打开报表属性的「代码」面板,输入以下 VB 代码:
Dim CurrentTablix As String = "" ' 标记当前渲染的Tablix Function MarkTablix(name As String) As String CurrentTablix = name Return "" End Function ' 页脚调用获取当前Tablix Function GetActiveTablix() As String Return CurrentTablix End Function
- 在第一个 Tablix 的任意固定渲染单元格(比如左上角表头单元格)中插入隐藏文本框,值设为
=Code.MarkTablix("Tablix1") - 第二个 Tablix 对应位置插入隐藏文本框,值设为
=Code.MarkTablix("Tablix2") - 页脚文本框表达式写为:
=IIF(Code.GetActiveTablix() = "Tablix1", "第一个表格提示", "第二个表格提示") - 注意将两个 Tablix 的
KeepTogether属性设为True,避免单个 Tablix 跨页时标记值错乱,该方案兼容 SSRS 2016 及以上版本的新版 Word 渲染器
注意事项
- 必须关闭报表属性中的「使用旧版 Word 渲染器」选项,新版渲染器对页脚、分页的兼容性更好
- 不要使用跨页引用
ReportItems集合的表达式,Word 导出场景下这类表达式会出现取值错误
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

