我们正在将报表服务器从SSRS 2005升级到SSRS 2008 R2。
我有一个问题,CSV导出渲染的SSRS 2008,其中列的总和显示在2008年的细节值的右侧,而不是左侧,如2005年,如下图所示。
117和131分别是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,89SSRS 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模式。但这两种模式都没有帮助解决这个问题。依从模式被认为是最接近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并排部署。
发布于 2012-10-24 21:13:27
你的问题促使我终于出去尝试编写自定义RenderingExtension。这里的答案是创建一个扩展,“包装”旧的SSRS2005CSV呈现扩展,并在SSRS 2008中以新的名称提供它。
我当然认为这样做是可能的。不幸的是,我没有2005年的SSRS DLL,所以我通过创建一个封装2008年CSV呈现器的扩展来验证我的概念。经过一番努力,我终于把这件事办好了。也许这个答案将帮助您在2005年CSV渲染器中类似地实现这一功能。
前面的几个注释:
以下是基本步骤:
rssrvpolicy.config文件以包含程序集在CodeGroup元素中。rsreportserver.config文件若要包括扩展,请执行以下操作。

下面是包装默认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效用来执行它。
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 就是这样。至少,经过几个小时的尝试和错误之后,我仍然记得所有重要的事情。最后一句是:
如果有人尝试使用实际的2005年CSV呈现DLL:让我们知道它是成功的注释或编辑的答案。
https://stackoverflow.com/questions/12902640
复制相似问题