我们正在将报表服务器从 SSRS 2005 升级到 SSRS 2008 R2。
我在 SSRS 2008 的 CSV 导出呈现方面遇到问题,其中列的总和出现在 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,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
基于 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 引擎处理它,那就太好了。
请注意,即使它使用“旧的 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 渲染器实现类似的实现。
前面几点说明:
所以这里是基本步骤:
rssrvpolicy.config
文件以包含您的程序集 in a CodeGroup element 。 rsreportserver.config
文件 to include the extension 。 以下是包装默认 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
就是这样。至少这是经过几个小时的反复试验后我仍然记得的所有重要内容。以最后一个音符结束:
如果有人使用实际的 2005 CSV 渲染 DLL 尝试此操作:请通过评论或编辑答案让我们知道它是否成功。
关于reporting-services - 强制 SSRS 2008 使用 SSRS 2005 CSV 呈现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12902640/