3

我们正在将报表服务器从 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 渲染器在 SSRS 2008 R2 中经历了重大变化,支持图表和仪表,更重要的是它提供了 2 种模式:默认Excel模式和Compliant模式。但是这两种模式都不能解决这个问题。Compliant 模式应该最接近 2005 年的模式,但显然它对我的情况来说还不够接近。

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

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

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

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

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

4

1 回答 1

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);
        }
    }
}

这是添加到的扩展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 进行此操作:请让我们知道它是否成功并通过评论或编辑答案。

于 2012-10-24T21:13:27.883 回答