【转】屏蔽Reporting Services的导出功能和增加Reporting Services的手动导出功能
1. Reporting Services自带的导出功能可以将查询结果导出到多种文件格式,但缺点是无法控制导出权限。
在某些应用中,有的报表需要控制导出功能,这就需要屏蔽Reporting Servies的自带导出功能,以手工的方式导出。例如将导出功能绑定到Button事件当中,这样控制导出权限就非常的方便了。
2. 屏蔽Reporting Servies的导出功能。
屏蔽导出功能非常简单,只要修改Reporting Services的CSS样式表即可实现。在SQL SERVER的安装目录下搜索HtmlViewer.css,将ToolbarExport节display: inline;改为display: none;
3. 如何手动导出Reporting Services生成的报表。
选择Reporting Services自带的导出功能,通过分析弹出的IE导出页面可以发现,导出的地址格式如下所示
http://①192.168.32.37:8888/②ReportServerHr/③Reserved.ReportViewerWebControl.axd?④ExecutionID=fwgqbo451wej1jjktf23nz55&⑤ControlID=e4ac740e-a26a-4e81-b345-08c791e58b56&Culture=2052&UICulture=4&ReportStack=1&OpType=Export&⑥FileName=%e5%ad%a6%e5%91%98%e7%99%bb%e8%ae%b0%e8%a1%a8(%e6%96%b0)&ContentDisposition=OnlyHtmlInline&⑦Format=XML
其中①为Reporting Services的服务器地址及端口。②为Reporting Services的服务名称。③为Reporting Services的导出控件。④和⑤是要取得的导出参数。⑥是生成的导出文件名。⑦是要导出的文件格式。通过上面的分析可以得知导出的url参数都是可以控制的,只要获取④ExecutionID和⑤ControlID两个参数,我们就可以导出查询的报表到指定格式的文件。
如何获取ExecutionID和ControlID。
通过分析Reporting Services查询结果的源文件我们可以找到ExecutionID和ControlID值。我们只需要将报表名称和参数发送到报表服务器,从返回的服务器信息中则可以提取出ExecutionID和ControlID
(A)string url=http://192.168.32.37:8888/ReportServerHr/
服务器的Reporting Service的报表页面地址。ReportServerHr为报表服务器的名称,8888为报表服务器端口
(B)string _serverPath = url+"Reserved.ReportViewerWebControl.axd?";
Reporting Service的导出控件地址。Reserved.ReportViewerWebControl.axd不用更改
(C)string _exportType = this.ddlExportFormat.SelectedValue;
导出类型。_exportType的值可以为:EXCEL、XML(具有报表数据XML文件)、CSV(CSV(逗号分隔))、PDF(Acrobat(PDF)文件)、MHTML(Web存档)
(D)string _reportName = this.ddlReprotName.SelectedValue;
需要导出的报表名称。注意这里的_reportName不是报表的中文名称,而是将服务器上的报表名称转换为URL编码。可以加入System.Web引用,调用HttpUtility.UrlEncode(_reportName)转换
(E)手工导出Reporting Service最主要的是获得excutionID和controlID。在这里调用InitExportParameter(string parm,string reportname)方法来向报表服务器发出查询请求,如果有多个参数的话parm可以放在数组当中.在报表服务器返回的字符串中提取excutionID和controlID。注意添加System.Net引用
(F)拼凑导出URL地址
string _exportFileName;//导出的文件名称.推荐英文名,中文的话要自动转成URL编码字符
string _excutionID= this.txtExcutionID.Text = excutionID;
string _controlID= this.txtControlID.Text = controlID;
_exportPath=_serverPath +"ExecutionID="+_excutionID+"&ControlID="+_controlID+"&Culture=2052&UICulture=4&ReportStack=1&OpType=Export&FileName="
+_exportFileName+"&ContentDisposition=OnlyHtmlInline&Format="+_exportType ;
Response.Write("<script>window.open('"+_exportPath+"')</script>");