SSRS报表导出Excel时自定义代码ProjectIds数组固定返回首元素问题
SSRS导出Excel时自定义代码数组索引取值异常问题分析
故障根因
- Excel渲染管线和PDF/Word渲染管线的实现逻辑存在差异:SSRS导出PDF、Word时使用软分页渲染引擎,对自定义代码中传入的
LookupSet返回数组的索引访问逻辑是严格按数组顺序执行的;但导出Excel时使用的OpenXML格式渲染引擎存在两处兼容性缺陷:- 对同一匹配键多次调用
LookupSet返回的多组数组,没有严格保障数组顺序的一致性,会对相同匹配条件的查询结果做缓存复用,导致第二次调用返回的ProjectIds数组索引映射错乱,所有位置的元素都指向第一个元素的值 - 对Object类型数组的数值元素拆箱逻辑存在漏洞,当
ProjectId为数值类型时,Excel渲染器访问数组元素时不会根据传入的索引参数偏移地址,始终读取数组首地址的第一个元素
- 对同一匹配键多次调用
- HTML嵌入链接的解析逻辑差异:你将超链接写在返回的HTML字符串中,并将文本框设置为HTML渲染模式,PDF/Word会直接读取生成完成的完整HTML字符串解析链接;但Excel会在HTML渲染前提前提取所有href属性值,提取操作早于循环的索引遍历过程,所以只会读取第一次循环的
ProjectId值
修复方案
方案1(最稳定,推荐)
合并两次LookupSet调用为单次,避免多组数组的顺序匹配问题:
- 在
SystemPointDetails数据集中新增计算字段ProjectInfo,值表达式为:=CStr(Fields!ProjectId.Value) & "|" & Fields!ProjectName.Value - 调整自定义代码,拆分拼接的字段值获取id和名称:
Function MakeProjectstHyperLinks(ByVal ProjectInfos As Object()) As String If ProjectInfos Is Nothing Then Return Nothing End If Dim builder As New System.Text.StringBuilder() builder.Append("<ul>") For Each info As String In ProjectInfos Dim parts = info.Split("|") builder.Append("<li><a href=""" & Report.Parameters!Trending_URL.Value & "?projectid=" & parts(0) & """ target=""_blank"">" & parts(1) & "</a></li>") Next builder.Append("</ul>") Return builder.ToString() End Function - 调整文本框表达式:
=Code.MakeProjectstHyperLinks(LookupSet(Fields!PointName.Value, Fields!PointName.Value, Fields!ProjectInfo.Value, "SystemPointDetails"))
方案2(快速验证)
强制按索引读取数组元素并显式转字符串,避免拆箱异常:
将代码中ProjectIds(number)替换为CStr(ProjectIds.GetValue(number))
方案3(需要保留Excel原生链接)
不使用HTML嵌入超链接,将超链接绑定到文本框的原生操作属性,Excel渲染器对SSRS原生URL操作的兼容性远高于嵌入HTML的链接
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

