首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制SSRS 2008使用SSRS 2005 CSV渲染

强制SSRS 2008使用SSRS 2005 CSV渲染
EN

Stack Overflow用户
提问于 2012-10-15 19:27:30
回答 1查看 5K关注 0票数 3

我们正在将报表服务器从SSRS 2005升级到SSRS 2008 R2。

我有一个问题,CSV导出渲染的SSRS 2008,其中列的总和显示在2008年的细节值的右侧,而不是左侧,如2005年,如下图所示。

117131分别是Column2和Column3的和。

SSRS 2005 CSV输出

代码语言:javascript
复制
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输出

代码语言:javascript
复制
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模式。但这两种模式都没有帮助解决这个问题。依从模式被认为是最接近2005年的模式,但显然它还不够接近我的情况。

我的问题:

是否有办法迫使SSRS 2008将报告退回到向后兼容模式,以便将其导出为2005年CSV格式?

尝试解决方案:

( a)使用基于2005年的CRIs

基于本文是关于ExecutionLog2的,如果SSRS 2008 R2遇到一个无法自动升级的报告(例如,使用基于2005年的CustomReportItem控件构建的报告),这些特定的报告将以“透明的向后兼容模式”使用旧的育空引擎进行处理。

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

( b)使用XML呈现器

我们可以使用自定义XML呈现程序,然后使用XSLT将xml转换为适当的CSV,但这意味着我们需要转换所有200份报告。因此,这是不可行的。

请注意,我们没有选择让SSRS 2005和SSRS 2008 R2并排部署。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-24 21:13:27

你的问题促使我终于出去尝试编写自定义RenderingExtension。这里的答案是创建一个扩展,“包装”旧的SSRS2005CSV呈现扩展,并在SSRS 2008中以新的名称提供它。

我当然认为这样做是可能的。不幸的是,我没有2005年的SSRS DLL,所以我通过创建一个封装2008年CSV呈现器的扩展来验证我的概念。经过一番努力,我终于把这件事办好了。也许这个答案将帮助您在2005年CSV渲染器中类似地实现这一功能。

前面的几个注释:

  • 所有的功劳都应该归于"兄弟",他在博客上写了一篇关于PDF水印(第1部分第2部分)的优秀教程,这对于创建扩展非常有价值。
  • 微软警告关于编写一个“编写自定义呈现扩展很难”的扩展,尽管他们谈论的是一个实际上做了一些事情的扩展(除了包装一个默认的扩展),我发现仅仅让这个东西开始工作也会很痛苦。

以下是基本步骤:

  1. 使用新类创建新类库 (.NET 3.5,而不是4.0+) (请参阅下面的代码)。
  2. 引用添加到:
    1. Microsoft.ReportingServices.DataRendering (用于默认的CSV呈现程序)
    2. Microsoft.ReportingServices.Interfaces
    3. Microsoft.ReportingServices.ProcessingCore

  1. 创建一个 CsvReport呈现器的私有实例,在构造函数中初始化它。
  2. 在类中实现IRenderingExtension接口。将所有方法调用路由到包装呈现程序的私有实例。
  3. 将项目的属性编辑为用一个强名字签名
  4. 编译
  5. 将DLL复制到ReportServer bin。
  6. 编辑rssrvpolicy.config文件以包含程序集在CodeGroup元素中
  7. 编辑rsreportserver.config文件若要包括扩展,请执行以下操作
  8. 重新启动服务。
  9. (可选)祈祷,或点燃蜡烛。
  10. 在报表管理器中打开一个报表,然后验证是否有您的扩展:

下面是包装默认CSV呈现程序的类的代码清单:

代码语言:javascript
复制
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中的扩展

代码语言:javascript
复制
<Extension Name="OLDSKOOLCSV" Type="Ssrs2005CsvRenderingExtension.Csv2005Renderer,Ssrs2005CsvRenderingExtension"/>

正如我使用的那样,这是用于rssrvpolicy.config的配置xml:

代码语言:javascript
复制
<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效用来执行它。

代码语言:javascript
复制
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:让我们知道它是成功的注释或编辑的答案。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12902640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档