Kas*_*ash 3 reportingservices-2005 reporting-services ssrs-2008 export-to-csv ssrs-2008-r2
我们正在将报表服务器从SSRS 2005升级到SSRS 2008 R2。
我对SSRS 2008的CSV导出渲染有一个问题,其中列的SUM出现在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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我知道CSV渲染器在SSRS 2008 R2中进行了重大更改,并支持图表和仪表,更重要的是它提供了2种模式:默认Excel模式和Compliant模式。但是两种模式都无法解决此问题。合规模式本来应该与2005年最接近,但是显然对于我的情况来说还不够。
我的问题:
是否有一种方法可以强制SSRS 2008将报告回退到向后兼容模式,以便将其导出为2005 CSV格式?
尝试过的解决方案:
a)使用基于2005的CRI
基于本文在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。
您的问题促使我终于出去尝试编写自定义的RenderingExtension。答案是创建一个扩展,将旧的SSRS 2005 CSV呈现扩展“包装”起来,并在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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是添加到的扩展名rsreportserver.config:
<Extension Name="OLDSKOOLCSV" Type="Ssrs2005CsvRenderingExtension.Csv2005Renderer,Ssrs2005CsvRenderingExtension"/>
Run Code Online (Sandbox Code Playgroud)
这是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>
Run Code Online (Sandbox Code Playgroud)
一个脚本对于快速测试是否有效(主要是因为它涉及大量的试验和错误)非常有用,该脚本由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
Run Code Online (Sandbox Code Playgroud)
就是这样。经过数小时的反复试验,至少这是我仍然记得的所有重要内容。最后一点:
如果有人尝试使用实际的2005 CSV呈现DLL进行此操作:请让我们知道它是否成功通过注释或对答案的编辑。
| 归档时间: |
|
| 查看次数: |
4176 次 |
| 最近记录: |