我们正在将报表服务器从 SSRS 2005 升级到 SSRS 2008 R2。
我在 SSRS 2008 的 CSV 导出呈现方面遇到问题,其中列的总和出现在 2008 年细节值的右侧,而不是像 2005 年那样出现在左侧,如下面的块所示。117131 分别是 Column2 和 Column3 的总和。

SSRS 2005 CSV 输出

Column2_1,Column3_1,Column2,Column3
117,131,1,2
117,131,1,2
117,131,60,23
117,131,30,15
117,131,25,89

SSRS 2008 CSV 输出
Column2,Column3,Column2_1,Column3_1
1,2,117,131
1,2,117,131
60,23,117,131
30,15,117,131
25,89,117,131

我知道 CSV renderer has gone through major changes in SSRS 2008 R2 支持图表和仪表,更重要的是它提供了 2 种模式:默认的 Excel 模式和 Compliant 模式。但是这两种模式都有助于解决这个问题。 Compliant 模式应该最接近 2005 年的模式,但显然对于我的情况来说还不够接近。

我的问题:
有没有办法强制 SSRS 2008 将报告回退到向后兼容模式,以便它导出为 2005 CSV 格式?

尝试的解决方案:
a) 使用基于 2005 年的 CRI
基于 this article on ExecutionLog2 ,如果 SSRS 2008 R2 遇到无法自动升级的报告(例如,使用基于 2005 的 CustomReportItem 控件构建的报告),这些特定报告将使用旧的 Yukon 引擎以“透明的向后兼容性”进行处理模式”。

它似乎回退到以前的版本模式(2005)并尝试渲染它。
所以我尝试使用基于 2005 的条形码 CustomReportItem 并部署到 SSRS 2008 R2 报告服务器,但它显示与以前相同的结果,尽管它抑制了条形码。这是因为 SSRS 2008 R2 找到了一种方法来抑制部分报告输出并显示其余部分。
如果能找到一个基于 2005 年的 CRI,让 SSRS 2008 R2 使用其旧的 Yukon 引擎处理它,那就太好了。
请注意,即使它使用“旧的 Yukon 处理引擎”,它也很可能仍然使用新的 CSV 渲染器,因此它显示相同的输出。如果这是真的,那么这个选项就没有实际意义了。

b) 使用 XML 渲染器
我们可以使用自定义 XML 渲染器,然后使用 XSLT 将 xml 转换为适当的 CSV,但这意味着我们需要转换所有 200 个报告。因此这是不可行的。

请注意,我们无法选择同时部署 SSRS 2005 和 SSRS 2008 R2。

最佳答案

你的问题促使我终于出去尝试 write a custom RenderingExtension 。这里的答案是 创建一个“包装”旧的 SSRS 2005 CSV 渲染扩展 的扩展,并使其在 SSRS 2008 中以新名称可用。

我当然认为有可能做到这一点。不幸的是,我没有 2005 SSRS DLL,所以我通过创建一个包含 2008 CSV 渲染器的扩展来进行概念验证。经过一番挣扎,我终于得到了这个工作。也许这个答案将帮助您为 2005 CSV 渲染器实现类似的实现。

前面几点说明:

  • 所有的 kudo 都应该去“Broes”,他在他的博客上写了一篇关于 PDF 水印的类似案例的优秀教程( part 1part 2 ),这对创建扩展非常宝贵。
  • Microsoft warns 关于编写一个“编写自定义渲染扩展程序很困难”的扩展程序,即使他们谈论的是一个实际执行某些操作的扩展程序(除了包装默认扩展程序),我发现只要让它工作就可以了也是一种痛苦。

  • 所以这里是基本步骤:
  • 使用新类创建 新类库 (.NET 3.5,而不是 4.0+)(请参阅下面的代码)。
  • 引用 添加到:
  • Microsoft.ReportingServices.DataRendering(用于默认 CSV 渲染器)
  • Microsoft.ReportingServices.Interfaces
  • Microsoft.ReportingServices.ProcessingCore
  • 创建 CsvReport 渲染器 的 私有(private)实例,在构造函数中对其进行初始化。
  • 在您的类中实现 IRenderingExtension 接口(interface)。将所有方法调用路由到包装渲染器的私有(private)实例。
  • 将项目的属性编辑为 sign it with a strong name
  • 编译
  • 将 DLL 复制到 ReportServer bin。
  • 编辑 rssrvpolicy.config 文件以包含您的程序集 in a CodeGroup element
  • 编辑 rsreportserver.config 文件 to include the extension
  • 重新启动 SSRS 服务。
  • (可选) 祈祷 ,或点燃蜡烛。
  • 在报告管理器中打开报告,然后 验证 是否存在您的扩展名:


  • 以下是包装默认 CSV 渲染器的类的代码 list :

    using Microsoft.ReportingServices.Interfaces;
    using Microsoft.ReportingServices.OnDemandReportRendering;
    
    namespace Ssrs2005CsvRenderingExtension
    {
        public class Csv2005Renderer : IRenderingExtension
        {
            private IRenderingExtension oldskoolCsvRenderer;
    
            public Csv2005Renderer()
            {
                oldskoolCsvRenderer = new Microsoft.ReportingServices.Rendering.DataRenderer.CsvReport();
            }
    
            public void GetRenderingResource(CreateAndRegisterStream createAndRegisterStreamCallback,
                                             System.Collections.Specialized.NameValueCollection deviceInfo)
            {
                oldskoolCsvRenderer.GetRenderingResource(createAndRegisterStreamCallback, deviceInfo);
            }
    
            public bool Render(Microsoft.ReportingServices.OnDemandReportRendering.Report report,
                               System.Collections.Specialized.NameValueCollection reportServerParameters,
                               System.Collections.Specialized.NameValueCollection deviceInfo,
                               System.Collections.Specialized.NameValueCollection clientCapabilities,
                               ref System.Collections.Hashtable renderProperties,
                               CreateAndRegisterStream createAndRegisterStream)
            {
                return oldskoolCsvRenderer.Render(report,
                                                  reportServerParameters,
                                                  deviceInfo,
                                                  clientCapabilities,
                                                  ref renderProperties,
                                                  createAndRegisterStream);
            }
    
            public bool RenderStream(string streamName,
                                     Microsoft.ReportingServices.OnDemandReportRendering.Report report,
                                     System.Collections.Specialized.NameValueCollection reportServerParameters,
                                     System.Collections.Specialized.NameValueCollection deviceInfo,
                                     System.Collections.Specialized.NameValueCollection clientCapabilities,
                                     ref System.Collections.Hashtable renderProperties,
                                     CreateAndRegisterStream createAndRegisterStream)
            {
                return oldskoolCsvRenderer.RenderStream(streamName,
                                                        report,
                                                        reportServerParameters,
                                                        deviceInfo,
                                                        clientCapabilities,
                                                        ref renderProperties,
                                                        createAndRegisterStream);
            }
    
            public string LocalizedName
            {
                get { return "Oldskool CSV renderer"; }
            }
    
            public void SetConfiguration(string configuration)
            {
                oldskoolCsvRenderer.SetConfiguration(configuration);
            }
        }
    }
    

    这是添加到 rsreportserver.config 的扩展:

    <Extension Name="OLDSKOOLCSV" Type="Ssrs2005CsvRenderingExtension.Csv2005Renderer,Ssrs2005CsvRenderingExtension"/>
    

    这是我使用的 rssrvpolicy.config 的配置 xml:

    <CodeGroup
            class="UnionCodeGroup"
            version="1"
            PermissionSetName="FullTrust"
            Name="OldskoolCsvGroup"
            Description="Code group for oldskool csv extension">
        <IMembershipCondition
                class="UrlMembershipCondition"
                version="1"
                Url="C:\Program Files\Microsoft SQL Server\MSRS10.SQLSERVER\Reporting Services\ReportServer\bin\Ssrs2005CsvRenderingExtension.dll"
        />
    </CodeGroup>
    

    一个脚本对于快速测试是否有效(主要是因为它涉及大量反复试验)非常有用,我使用 RS Utility 执行:

    Public Sub Main()
        Dim items() As Extension
        items = rs.ListExtensions(1)
    
        For Each item As Extension In items
            Console.WriteLine(item.Name)
        Next item
    End Sub
    

    就是这样。至少这是经过几个小时的反复试验后我仍然记得的所有重要内容。以最后一个音符结束:
  • 应用程序事件日志有时包含 SSRS 错误。其中之一是“SSRS 无法加载...扩展”。这是我清除的最后一个障碍,我通过将目标框架从 .NET 4.0 更改为 3.5 来清除它。

  • 如果有人使用实际的 2005 CSV 渲染 DLL 尝试此操作:请通过评论或编辑答案让我们知道它是否成功。

    关于reporting-services - 强制 SSRS 2008 使用 SSRS 2005 CSV 呈现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12902640/

    10-13 05:15