2.3 如何实现打印
ReportViewer控件可以应用于WinForm 以及 WebForm中。对于客户端,当应用于WinForm的时候可以直接实现打印功能,而当使用在WebForm中的时候无法直接实现打印功能,如图所示:(参考文章:http://www.cnblogs.com/oscsoft/archive/2007/07/08/810231.html)
ReportViewer 具有两个属性,一个是LocalReport,另一个则是ServerReport,如图所示当设置为LocalReport的时候没有打印按钮,而设置成ServerReport的时候就会出现相应的打印按钮,但此时实现的打印并不能应用于客户端打印。因此利用其自带的控件来实现客户端报表的打印功能在当前看来是不能的(VS 2008已经弥补了此控件客户端不能打印的缺陷),只能改变实现方法。
1) 利用JavaScript来实现客户端报表的打印
1.包含ReportViewer报表的网页的最终形式HTML DOM结构中,报表被放到一个<iframe>中,其ID命名方式为:"ReportFrame"+报表控件id;
2.报表内容被放到包含在1中的另一个<iframe>中,其id固定为:"report";
3.为了实现打印,我们只要先获取内容<iframe>对象,设置焦点,然后调用print方法打印即可。
添加一个js文件,写如下代码
//JS 文件
//定义打印函数
// objWindow——包含ReportView控件的window对象
// strReportViewerId——需要被打印的ReportViewer控件的ID
function PrintReportView(objWindow,strReportViewerId)
{
var frmContent=GetReportViewContentFrame(objWindow,strReportViewerId);
if(frmContent!=null && frmContent!=undefined)
{
frmContent.focus();//设置焦点
frmContent.print();//打印
}
else
{
alert("在获取报表内容时失败,无法通过程序打印。如果要手工打印,请鼠标右键点击报表内容区域,然后选择菜单中的打印项。");
}
}
//获取要打印的内容
function GetReportViewContentFrame(objWindow,strReportViewerId)
{
var frmContent=null;
//报表内容区对象的FRAME对象
var strFrameId="ReportFrame" + strReportViewerId ;
//获得自动生成的iframe 的id为(ReportFrame+报表控件id)
try
{
frmContent=window.frames[strFrameId].frames["report"];
//报表内容框架的id为report
}
catch(e)
{
}
return frmContent;
}
在页面中添加一个控件作为打印按钮:
<asp:Button ID="Button1" runat="server" Text="打印" OnClientClick="return PrintReport();" />
并在JavaScript中调用打印方法:
<script language="javascript" type="text/javascript">
//打印报表report
function PrintReport()
{
PrintReportView(window,"ReportViewer1");
//包含ReportView控件的window对象和报表控件的ID
}
</script>
2) 去掉系统自动生成的页眉页脚
按照以上操作,将实现WEB页面客户端的打印,运行页面将会看到在ReportViewer中生成一些数据,点击打印按钮便可以实现打印。
在打印预览中我们将看到纸张的最上面出现了“page 1 of
打开注册表:
HKEY_CURRENT_USER/Software/Microsoft/ Internet Explorer/ PageSetup.
找到
将其中的footer和header设置为空即可。
也可以采用代码的方式来进行对注册表信息的修改,如下在JavaScript中写一个函数,用于清除注册表中的相关参数的值。
// JScript 文件
var HKEY_Root,HKEY_Path,HKEY_Key;
HKEY_Root="HKEY_CURRENT_USER";
HKEY_Path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\";
//设置网页打印的页眉页脚为空
function PageSetup_Null()
{
try
{
var Wsh=new ActiveXObject("WScript.Shell");
HKEY_Key="header";
Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"");
HKEY_Key="footer";
Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"");
}
catch(e)
{}
}
//设置网页打印的页眉页脚为默认值
function PageSetup_Default()
{
try
{
var Wsh=new ActiveXObject("WScript.Shell");
HKEY_Key="header";
Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&w&b页码,&p/&P");
HKEY_Key="footer";
Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&u&b&d");
}
catch(e)
{}
}
在打印之前调用PageSetup_Null() 方法即可以实现对注册表的修改,再点击打印即可去掉页面上生成的页眉页脚。
3 总结
以上操作则是一个简单的基于WEB的客户端打印报表的方法,其中还可以进行一定的扩展,可以自定义Datatable的内容,只要之前设置了Dataset数据集中的字段名与之对应即可。可以加入更多的参数传递来实现更好的报表效果。