ssrs报告导出到excel - 损坏的超链接

时间:2017-02-01 07:47:29

标签: excel reporting-services hyperlink export

我有大型报告,每行都包含超链接。

包含50k或更多行的报告将导出到excel。

导出后我尝试打开xlsx文件并收到消息,告诉我该文件包含错误。它还建议进行文件恢复

恢复后消息显示已删除超链接。我可以打开文件,但链接不再有效。

我尝试用c#openxml sdk库打开导出的文件,并收到错误消息,告诉该文件包含不完整的元素,但我无法找到它是哪个元素

但是,当报告的行少于49k时,导出的文件会成功打开,并且所有超链接都在起作用。 将报告导出为pdf或doc时,超链接也可以正常工作 我使用报告服务器vesion 12.0.2269.0

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

通常,当我在从SSRS导出Excel文件后遇到此类问题时,我发现Excel中存在一些问题。也许是一个隐藏的角色。导出工作,打开文件是问题开始时。

为了解决这种情况,我在SQL Server中创建了一个用户定义函数(UDF)来删除我知道Excel会阻塞的任何字符。以下是我使用的示例。

CREATE FUNCTION [dbo].[udf_CleanData]
(
    @data text
)

RETURNS varchar(max)

AS

BEGIN
    DECLARE @cdata varchar(max) = @data

    SELECT @cdata = REPLACE(@cdata, char(20), '') -- double quote 
    SELECT @cdata = REPLACE(@cdata, char(21), '') -- bullet
    SELECT @cdata = REPLACE(@cdata, char(13), '') -- carriage return
    SELECT @cdata = REPLACE(@cdata, char(10), '') -- line feed
    SELECT @cdata = REPLACE(@cdata, char(18), '') -- single quote right
    SELECT @cdata = REPLACE(@cdata, char(17), '') -- single quote left
    SELECT @cdata = REPLACE(@cdata, char(22), '') -- dash

    RETURN @cdata
END

您可以根据自己的需要进行调整。这适用于我需要的东西,那就是删除文本字段中的所有奇怪的字符,开发团队认为这些字符可以用于前端应用程序的格式化。

用法:

SELECT dbo.udf_CleanData(Field1) AS CleanField1 FROM Table1

如果您报告的超链接中有任何异常,则可能会删除该超链接。如果要从各种数据构建超链接,则可能需要擦除部分或全部字段。这是你必须经历一些试验和错误的事情。

其他时候,当我遇到此问题时,RDL中有一个表达式,最终计算为 NaN Infinity 。导出后的Excel文件在导出到旧版本的Excel(例如2003)时似乎与此除外)有问题。

处理这种情况的最佳方法是调整表达式以检查最终值是否可能失败,并将值默认为其他值,或将值四舍五入到合理的值。这类似于在进行除法之前检查分母不为零。

=IIf(Fields!Total.Value > 0, Fields!Count.Value/Fields!Total.Value, 0)

关于此类问题,有很多关于SO的好解决方案的问题,所以我不会在这里列出一堆与数据检查相关的表达式。

处理此问题的另一种方法是始终导出到早期版本的Excel,但这可能不是任何简单的选项,或者根本不是选项。通常,我只将其视为报表订阅的选项,而不是开发工具中的选项。

祝你好运!

答案 1 :(得分:0)

将SSRS报告导出到Excel时,我也遇到了此问题。我的理由是Excel只能处理66530个超链接 -

https://support.office.com/en-us/article/Excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3#ID0EBABAAA=2016,_2013

如果你在超过50k时遇到这个问题再次确认(在这种情况下原因可能是R Richards建议的那样),或者如果是66530链接会导致电子表格中断。

我还没有找到解决这个Excel限制的方法,所以我能想到解决这个问题的唯一方法就是在导出的excel文件中根本没有超链接。

如果您可以在导出的文件中没有超链接,则可以使用SSRS报告的Globals!RenderFormat属性在报告中禁用它们。如果请求的格式是EXCEL,则单元格上用于没有超链接的表达式将是 -

=IIF(Globals!RenderFormat.Name="EXCELOPENXML" ,True,False)