首先在网页中添加:
<OBJECT id="WebBrowser" height="0" width="0" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"
VIEWASTEXT>
</OBJECT>
然后就可以依次加入功能按钮了:
<input οnclick="document.all.WebBrowser.ExecWB(6,1)" type="button" value="打印"> <input οnclick="document.all.WebBrowser.ExecWB(6,6)" type="button" value="直接打印">
<input οnclick="document.all.WebBrowser.ExecWB(8,1)" type="button" value="页面设置">
<input οnclick="document.all.WebBrowser.ExecWB(7,1)" type="button" value="打印预览"> <INPUT type="button" value="关闭窗口" οnclick="javascript:window.close()">
将这两块东西放到<center class=noprint></center>就不会打印这些按钮了。当然要定义noprint了:
<style media="print">.Noprint { DISPLAY: none }</style>只要把不想打印的东西的css设置成noprint就可以了。
现在就实现了基本的web打印,需要注意的情况如下:
- 必须将ie的internet选项的安全设置中对于没有标记为安全的ActiveX控件进行...设置成提示或者启用,否则会报错,导致不可用。
- 如果在vs.net编辑环境下编辑该页面,它经常自动的给object添加多余的参数,有了这些东西,打印就会出错,所以要记得最后保存的时候删除它们。
为了简便并且达到最好的效果,我们可以在一个页面实现编辑和打印,这时候会需要很多的textbox,我们把它的css设置成.edittext
{
overflow-y:visible;
width: 100%;
border-top: none;
border-right: none;
border-bottom: none;
border-left: none;
}就可以实现在打印的时候不显示边框和multiline的textbox不显示滚动条了。
还有一些小经验就是在设置标格宽度的时候,对于A4纸张,横打用920,竖打用640,效果最好。
以上的方法实现了将数据从网页的单元格到Excel单元格的导入,下面笔者介绍一种将整个表格导入Excel的方法。该方法的主要思路是利用剪切板,先将网页中要打印的内容复制到剪切板中,然后再调用xlSheet.Paste()命令将剪切板中的内容复制到Excel中。下面来看一下它的关键代码:
var selectArea=document.body.createTextRange(); //创建文本区域
selectArea.moveToElementText(printData);//将文本区域聚焦到printData
selectArea.select();//选中printData
selectArea.execCommand("Copy");//将printData复制到剪切板中
xlSheet.Paste();//将剪切板中的数据复制到Excel中
利用IE浏览器实现
前面我们以Excel为例讲述了利用Office打印工具来完成Web打印,现在我们来看看怎样利用IE浏览器自带的打印控件来完成Web打印。大家都知道IE本身就具有强大的打印功能,那么我们为什么不利用这一点来实现Web打印功能呢。原因是如果我们直接使用IE的打印功能或是在程序中调用window.print()来打印网页,那么在页眉部分会出现网页标题和页码信息,而在页脚部分则会出现网址和日期信息。其实这些信息并不是我们想要打印的,那么怎样才能去掉这些信息呢?做法其实很简单,我们只要在IE的文件菜单中打开页面设置对话框,然后去掉页眉和页脚的代码(页眉:&w&b页码,&p/&P 页脚:&u&b&d)就可以了,现在我们再打印的话这些信息就不会出现了。现在我们来看看这些代码是什么意思呢?其实这些代码是IE提供给我们设置打印页面的,下面给出它们的具体含义,如表所示。
&w 网页标题
&u 网页网址(url)
&d 短日期格式
&D 长日期格式
&t 当前时间格式
&T 24小时时间格式
&p 当前页码
&P 总页码
通过上面的表格,读者应该明白IE打印设置中默认的页眉和页脚的含义,而且读者可以对上述代码进行组合使用来设置自己喜欢的打印设置。这里我们所要说的并不单单是这些,大家设想一下我们开发了一个基于B/S结构的系统,其中有报表的部分,我们不能让每个客户端都自己去设置IE的打印设置,因此我们需要在程序中控制这些设置。下面我们用VBScript脚本写一个函数通过修改注册表键值来达到控制页面设置的目的,代码如下:
< script language="VBScript">
dim path, reg
'path存放IE打印设置的注册表地址, reg存放WScript.Shell组件的对象
path = "HKEY_CURRENT_USER/Software/Micro-soft/Internet Explorer/PageSetup"
'通过注册表修改打印设置,只修改页眉、页脚和各边界的值
'参数说明:header--页眉,footer--页脚,margin_left--左边界
'margin_top--上边界,margin_right--右边界,margin_bottom--下边界
'页边距的设置中 1对应25.4mm,即margin_left=1表示实际值的25.4mm
function pagesetup(header, footer, margin_left, margin_top, margin_right, margin_bottom)
On Error Resume Next
Set reg = CreateObject("WScript.Shell")
if err.Number>0 then
MsgBox "不能创建WScript.Shell对象!"
exit function
end if
reg.RegWrite path+"/header", header'设置页眉
reg.RegWrite path+"/footer", footer '设置页脚
reg.RegWrite path+"/margin_left", margin_left'设置左边界
reg.RegWrite path+"/margin_top", margin_top'设置上边界
reg.RegWrite path+"/margin_right", margin_right'设置右边界
reg.RegWrite path+"/margin_bottom", margin_bottom'设置下边界
end function
< /script>
程序中可以再写一个函数(可用VBscript或javascript脚本写)先调用该函数,然后再调用window.print()实现打印,这里就不给出代码了。细心的读者一定发现了这样打印出来的页面会有打印按钮在上面,而且分页是IE打印控件根据纸张大小分出来的,下面我们介绍一种方法来控制分页和打印按钮的显示。该方法是利用CSS样式表来控制这些设置,因为在样式表中有一个“media=print”属性,该属性只有在打印的时候才会起作用,因此可以实现对打印按钮和分页的控制,具体做法如下:
< style media=print>
.noprint{display:none;}
.pagenext{page-break-after: always;}
< /style>
只要在打印按钮中加入代码class="noprint",而在需要分页的地方加入代码< div class="pagenext">< /div>就可以了。到目前为止我们的打印功能已经比较完善了,但是还没有打印预览和直接打印的功能,一般用户在打印之前都会预览一下,如果没有问题就直接打印了。下面我们通过IEWebBrowser组件来实现这两个功能。
首先创建IEWebBrowser对象:
< object id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 width=0 height=0>< /object >
然后通过不同参数调用ExecWB方法实现打印预览和直接打印功能:
WebBrowser.ExecWB(6,1); //打印
WebBrowser.ExecWB(6,6); //直接打印
WebBrowser.ExecWB(7,1); //打印预览
ExecWB方法还有很多其他的参数,这里就不一一介绍了
页面打印时如何去掉页面底部的路径和顶端的页码编号
ie的文件-〉页面设置-〉讲里面的页眉和页脚里面的东西都去掉,打印就不出来了。
(三)打印去掉/添加页眉页脚
引用:
<script language="JavaScript">
var hkey_root,hkey_path,hkey_key
hkey_root="HKEY_CURRENT_USER"
hkey_path="//Software//Microsoft//Internet Explorer//PageSetup//"
//设置网页打印的页眉页脚为空
function pagesetup_null(){
try{
var RegWsh = new ActiveXObject("WScript.Shell")
hkey_key="header"
RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"")
hkey_key="footer"
RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"")
}catch(e){}
}
//设置网页打印的页眉页脚为默认值
function pagesetup_default(){
try{
var RegWsh = new ActiveXObject("WScript.Shell")
hkey_key="header"
RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"&w&b页码,&p/&P")hkey_key="footer"
RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"&u&b&d")
}catch(e){}
}
</script>
<input type="button" value="清空页码" οnclick=pagesetup_null()>
<input type="button" value="恢复页码" οnclick=pagesetup_default()>
复制出去,看下效果就可以了
分页
<style media="print">
.PageNext{page-break-after: always;}
</style>
<div class="PageNext"></div>
在要分页的地方加上这句 。