【转】屏蔽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最主要的是获得excutionIDcontrolID。在这里调用InitExportParameter(string parm,string reportname)方法来向报表服务器发出查询请求,如果有多个参数的话parm可以放在数组当中.在报表服务器返回的字符串中提取excutionIDcontrolID。注意添加System.Net引用

/// <summary>
/// InitExportParameter
/// </summary>
/// <param name="ClassID">ID参数(根据需要更改)</param>
/// <param name="reportname"></param>
 /// <param name="e"></param>
private bool InitExportParameter(string ClassID,string reportname)
{
     bool tag = false;
try
{
WebClient   client   =   new   WebClient();  
client.Credentials = CredentialCache.DefaultCredentials;
client.Headers.Set("User-Agent","Microsoft Internet Explorer");
string _exportPath = "";
//报表导出路径
string _parameter = reportname;
//导出参数,为报表名称              
_exportPath = url +_parameter + "&rs:Command=Render&course_id=" + ClassID;
Byte[]   pageData   =   client.DownloadData(_exportPath);
//将完整的查询路径提交给报表服务器,获取返回信息,从中提取excutionID和controlID
string strWebData = Encoding.GetEncoding("gb2312").GetString(pageData);
//格式化返回信息
//提取excutionID和controlID
//提取 excutionID
int beginPosion = strWebData.LastIndexOf("&Culture");
//提取ExecutionID的起始位置
int endPosion = strWebData.LastIndexOf("ExecutionID");
//提取ExecutionID的终止位置
string tempStr = strWebData.Substring(endPosion,(beginPosion-endPosion));
beginPosion = tempStr.IndexOf("=")+1;
endPosion = tempStr.IndexOf("&");
string excutionID = tempStr.Substring(beginPosion,(endPosion-beginPosion));
//获取controlID
beginPosion = tempStr.LastIndexOf("=")+1;
endPosion = tempStr.Length - beginPosion;
string controlID = tempStr.Substring(beginPosion,endPosion);
//获取controlID
this.txtExcutionID.Text = excutionID;
this.txtControlID.Text = controlID;
tag = true;//如果请求未抛出异常则说明获取excutionID和controlID成功
}
catch (System.Exception e)
     {
return false;//获取excutionID和controlID失败
}
return tag;
}

(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>");

posted on 2011-02-12 12:47  blair0807  阅读(857)  评论(0编辑  收藏  举报