reporting-services - 强制 SSRS 2008 使用 SSRS 2005 CSV 渲染

标签 reporting-services ssrs-2008 reportingservices-2005 export-to-csv ssrs-2008-r2

我们正在将报表服务器从 SSRS 2005 升级到 SSRS 2008 R2。
我对 SSRS 2008 的 CSV 导出呈现有问题,其中列的总和出现在 2008 年详细值的右侧,而不是像 2005 年那样出现在左侧,如下面的 block 所示。
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 模式。但是这两种模式都无法解决这个问题。合规模式应该最接近 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 引擎对其进行处理,那就太好了。 请注意,很有可能,即使它使用“旧的育空处理引擎”,它也可能仍然使用新的 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关于编写一个“编写自定义呈现扩展很困难”的扩展,即使他们谈论的是一个实际上某事的扩展(除了包装默认扩展) ,我发现让这件事正常工作也很痛苦。

基本步骤如下:

  1. 创建一个包含新类的新类库(.NET 3.5,而不是 4.0+)(参见下面的代码)。
  2. 添加一个引用到:
    1. Microsoft.ReportingServices.DataRendering(用于默认 CSV 渲染器)
    2. Microsoft.ReportingServices.Interfaces
    3. Microsoft.ReportingServices.ProcessingCore
  3. 创建一个 CsvReport 渲染器的私有(private)实例,在构造函数中对其进行初始化。
  4. 在您的类中实现 IRenderingExtension 接口(interface)。将所有 方法调用路由到包装渲染器的私有(private)实例。
  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. 在报表管理器中打开一个报表,验证您的扩展程序在那里:

Screenshot of the renderer

这是包装默认 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/

相关文章:

sql - 在哪里执行? SSRS 或 SQL

reporting-services - SSRS 重复组标题?

ssrs-2008 - SSRS 2008 在子报表之前和内部添加分页符

reporting-services - SSRS 如何在打印预览中在每页上重复表头

c# - 如何将参数从 ASP.NET 传递到 SSRS 报告?

sql - RDLC 表达式导致#error

sql - 如何以当前 Windows 用户身份运行 SSRS 报告?

sql - 如何将多个值传递给存储过程中的单个参数

sql-server - SSRS css 搞砸了?

sql-server - 如何将 SSRS 报告参数设置为可选,即 SSRS 2005 中的非强制字段