强制SSRS 2008使用SSRS 2005 CSV呈现

Kas*_*ash 3 reportingservices-2005 reporting-services ssrs-2008 export-to-csv ssrs-2008-r2

我们正在将报表服务器从SSRS 2005升级到SSRS 2008 R2。
我对SSRS 2008的CSV导出渲染有一个问题,其中列的SUM出现在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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我知道CSV渲染器在SSRS 2008 R2中进行了重大更改,并支持图表和仪表,更重要的是它提供了2种模式:默认Excel模式和Compliant模式。但是两种模式都无法解决此问题。合规模式本来应该与2005年最接近,但是显然对于我的情况来说还不够。

我的问题:
是否有一种方法可以强制SSRS 2008将报告回退到向后兼容模式,以便将其导出为2005 CSV格式?

尝试过的解决方案:
a)使用基于2005的CRI
基于本文在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。

Jer*_*oen 5

您的问题促使我终于出去尝试编写自定义的RenderingExtension。答案是创建一个扩展,将旧的SSRS 2005 CSV呈现扩展“包装”起来,并在SSRS 2008中以新名称使用。

我当然认为可以这样做。不幸的是,我没有2005 SSRS DLL,因此我通过创建一个包装2008 CSV渲染器的扩展名来进行了概念验证。经过一番努力,我终于使它起作用。也许这个答案将帮助您类似地为2005 CSV渲染器实现此功能。

前面的一些注意事项:

  • 所有的荣誉都应该归功于“ Broes ”,他在自己的博客上写了一篇出色的教程,介绍了有关PDF水印的类似案例(第1 部分第2部分),这对于创建扩展很有价值。
  • 微软警告说要编写一个扩展程序,“编写自定义渲染扩展程序很困难”,尽管他们谈论的是实际上可以做某事的扩展程序(除了包装默认扩展程序外),但我发现让事情正常工作是相当不错的也是痛苦的。

因此,这是基本步骤:

  1. 用一个新类创建一个新的类库(.NET 3.5,不是4.0 +)(请参见下面的代码)。
  2. 添加对以下内容的引用
    1. Microsoft.ReportingServices.DataRendering(用于默认的CSV渲染器)
    2. Microsoft.ReportingServices.Interfaces
    3. Microsoft.ReportingServices.ProcessingCore
  3. 创建CsvReport渲染器私有实例,然后在构造函数中对其进行初始化。
  4. 在您的课程中实现IRenderingExtension接口。将所有方法调用路由到包装的渲染器的私有实例。
  5. 编辑项目的属性以使用强名称对其进行签名
  6. 编译
  7. 将DLL复制到ReportServer bin。
  8. 编辑rssrvpolicy.config文件以将程序集包含在CodeGroup元素中
  9. 编辑rsreportserver.config文件以包括扩展名
  10. 重新启动 SSRS服务。
  11. (可选)祈祷或点燃蜡烛。
  12. 在报告管理器中打开一个报告,并验证您的扩展名是否存在:

渲染器的屏幕截图

这是包装默认CSV渲染器的类的代码清单:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<Extension Name="OLDSKOOLCSV" Type="Ssrs2005CsvRenderingExtension.Csv2005Renderer,Ssrs2005CsvRenderingExtension"/>
Run Code Online (Sandbox Code Playgroud)

这是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>
Run Code Online (Sandbox Code Playgroud)

一个脚本对于快速测试是否有效(主要是因为它涉及大量的试验和错误)非常有用,该脚本由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 
Run Code Online (Sandbox Code Playgroud)

就是这样。经过数小时的反复试验,至少这是我仍然记得的所有重要内容。最后一点:

  • 应用程序事件日志有时包含SSRS错误。其中之一是“ SSRS无法加载...扩展名”。这是我清除的最后一个障碍,我通过将目标框架从.NET 4.0降低到3.5来清除了它。

如果有人尝试使用实际的2005 CSV呈现DLL进行此操作:请让我们知道它是否成功通过注释或对答案的编辑。

  • 非常有前途!当我输入内容时,请注意这一点。 (2认同)