强制SSRS 2008使用SSRS 2005 CSV渲染

时间:2012-10-15 19:27:30

标签: reporting-services ssrs-2008 reportingservices-2005 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

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
根据{{​​3}},如果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。

1 个答案:

答案 0 :(得分:5)

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

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

前面有几点说明:

  • 所有kudo应该去“Broes”,他在他的博客上写了一篇关于PDF水印(part 1part 2)的类似案例的优秀教程,这在创建时非常宝贵扩展名。
  • Microsoft warns关于编写“编写自定义呈现扩展程序很难”的扩展程序,即使他们正在讨论实际所做的扩展一些事情(除了包装一个默认的扩展名),我发现让事情发挥作用也会非常痛苦。

以下是基本步骤:

  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. 将项目的属性编辑为sign it with a strong name
  6. 编译即可。
  7. 将DLL 复制到ReportServer bin。
  8. 修改rssrvpolicy.config文件以包含您的程序集in a CodeGroup element
  9. 修改rsreportserver.config文件to include the extension
  10. 重新启动 SSRS服务。
  11. (可选)祈祷,或点燃蜡烛。
  12. 在报告管理器中打开报告,并验证您的扩展程序在那里:
  13. Screenshot of the renderer

    以下是包装默认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);
            }
        }
    }
    

    这是添加到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尝试此操作:请告诉我们是否通过评论或编辑答案是否成功。