屏蔽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引用

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

转载于:https://www.cnblogs.com/ericcools/archive/2009/03/02/1401602.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值