一、WebBrowser控件
<object ID='WebBrowser' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>
二、WebBrowder控件的方法
//打印
WebBrowser1.ExecWB(6,1);
//打印设置
WebBrowser1.ExecWB(8,1);
//打印预览
WebBrowser1.ExecWB(7,1);
关于这个组件还有其他的用法,列举如下:
WebBrowser.ExecWB(1,1) 打开
Web.ExecWB(2,1) 关闭现在所有的IE窗口,并打开一个新窗口
Web.ExecWB(4,1) 保存网页
Web.ExecWB(6,1) 打印
Web.ExecWB(7,1) 打印预览
Web.ExecWB(8,1) 打印页面设置
Web.ExecWB(10,1) 查看页面属性
Web.ExecWB(15,1) 好像是撤销,有待确认
Web.ExecWB(17,1) 全选
Web.ExecWB(22,1) 刷新
Web.ExecWB(45,1) 关闭窗体无提示
但是打印是会把整个页面都打印出来的,页面里面有什么东西就打印出来,我们有时候只需要打印数据表格,这时我们就要写一个样式了:把不想打印的部份隐藏起来:
样式内容:
<style type="text/css" media=print>
.noprint{display : none }
</style>
然后使用样式就可以:
<p class="noprint">不需要打印的地方</p>
代码如下:
<script language="javascript">
function printsetup(){
// 打印页面设置
wb.execwb(8,1);
}
function printpreview(){
// 打印页面预览
wb.execwb(7,1);
}
function printit()
{
if (confirm('确定打印吗?')) {
wb.execwb(6,6)
}
}
</script>
<OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height=0 id=wb name=wb width=0></OBJECT>
<input type=button name=button_print value="打印" class="noprint" onclick="javascript:printit()">
<input type=button name=button_setup value="打印页面设置" class="noprint" onclick="javascript:printsetup();">
<input type=button name=button_show value="打印预览" class="noprint" onclick="javascript:printpreview();">
----------------------------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<script type="text/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 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){}
}
function printsetup(){
// 打印页面设置
wb.execwb(8,1);
}
function printpreview(){
// 打印页面预览
PageSetup_Null();
wb.execwb(7,1);
}
function printit()
{
if (confirm('确定打印吗?')) {
PageSetup_Null();
wb.execwb(6,6)
}
}
</script>
<style type="text/css" media=print>
.noprint{display : none }
</style>
</HEAD>
<BODY>
<OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height=0 id=wb name=wb width=0></OBJECT>
<input type=button name=button_print value="打印" class="noprint" onclick="javascript:printit()">
<input type=button name=button_setup value="打印页面设置" class="noprint" onclick="javascript:printsetup();">
<input type=button name=button_show value="打印预览" class="noprint" onclick="javascript:printpreview();">
</BODY>
</HTML>
----------------------------------------------------------------------
注意有可能执行时,会出现没有效果的错误,这时原因是可能你的浏览器限制了active对象的创建,只要取消限制就好了,取消方法如下:
打开你的ie浏览器internet选项—— 安全—— 自定义级别—— 把对没有标记为安全的activex控件进行初始化和脚本运行 设置为启用
一、WebBrowser控件
<object ID='WebBrowser' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>
二、WebBrowder控件的方法
//打印
WebBrowser1.ExecWB(6,1);
//打印设置
WebBrowser1.ExecWB(8,1);
//打印预览
WebBrowser1.ExecWB(7,1);
三、实现打印的设置,打印数据的生成,打印的预览,和打印。
实现打印的设置,打印数据的生成,打印的预览,和打印我一般这样做,假如查询结果在a.asp中,那么在a.asp中放置打印设置、打印预览、打印三个按钮。
单击打印设置按钮则在js中执行WebBrowser1.ExecWB(8,1),以打开打印设置窗口。
单击打印预览按钮则打开一个b.asp,在b.asp中重新生成打印数据,然后在b.asp中自动执行WebBrowser1.ExecWB(7,1),以打开用户预览界面。
单击打印按钮则也打开b.asp,在b.asp中重新生成打印数据,然后在b.asp中自动执行WebBrowser1.ExecWB(6,1),以自动打印数据。
四、代码
a.asp调用数据的程序就不给出了。只给出几个按钮的代码:
<input type=“button“ name=“mPrint“ value=“打印“ onclick=“exePrint();“>
<input type=“button“ name=“mPreview“ value=“打印预览“ onclick=“exePreview();“>
<input type=“button“ name=“mSetting“ value=“打印设置“ onclick=“exeSetting();“>
<object ID='WebBrowser' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>
<script language='javascript'>
function exePrint()
{
liu= window.open('b.asp?do=1','_blank','left=2000,top=2000,fullscreen=3');
}
function exePreview()
{
window.open('b.asp?do=2','_blank','left=2000,top=2000,fullscreen=3');
}
function exeSetting()
{
WebBrowser.ExecWB(8,1);
}
</script>
代码中打印设置的代码很简单,大家很容易理解。打印预览和打印的按钮需要告诉b.asp我们将要执行的是打印还是打印预览。另外,还要将查询字符串传递过去。当然web高手可以尝试其他方法,以避免反复重服务器调数据,当然初学者只能通过多次查询,以牺牲性能来解决打印了。
假设本例中a.asp通过传递一个查询串打开了b.asp,则在b.asp中将重新载入数据。在这里载入数据后将数据显示在网页上需要知道每个页要显示多少条(PageSize)。显示的时候每显示PageSize条后,就要显示一个<p style='page-break-before:always;'> 这个语句相当于分页符,也就是当打印或者预览时遇到了这个分页符后会强制分页。一般我们可以这样:
<table>
???
</table>
<p style='page-break-before:always;'>
<table>
???
</table>
<p style='page-break-before:always;'>
……
<table>
???
</table>
<p style='page-break-before:always;'>
显示完数据后根据用户的的指令(判断参数do的值),来分别执行预览或者打印。
如果是预览则执行下面代码:
WebBrowser.ExecWB(7,1);
window.opener=null;
window.close();
如果是打印则执行:
WebBrowser.ExecWB(6,1);
window.opener=null;
window.close();
代码如下所示:

// preview:是否显示预览。null/false:不显示,true:显示
function printPage(preview)
{
try
{
var content = window.document.body.innerHTML;
var oricontent = content;
while (content.indexOf( " {$printhide} " ) >= 0 ) content = content.replace( " {$printhide} " , " style='display:none' " );
if (content.indexOf( " ID=/ " PrintControl/ "" ) < 0 ) content = content + " <OBJECT ID=/ " PrintControl/ " WIDTH=0 HEIGHT=0 CLASSID=/ " CLSID:8856F961 - 340A - 11D0 - A96B - 00C04FD705A2/ " ></OBJECT> " ;
window.document.body.innerHTML = content;
// PrintControl.ExecWB(7,1)打印预览,(1,1)打开,(4,1)另存为,(17,1)全选,(10,1)属性,(6,1)打印,(6,6)直接打印,(8,1)页面设置
if (preview == null || preview == false ) PrintControl.ExecWB( 6 , 1 );
else PrintControl.ExecWB( 7 , 1 ); // OLECMDID_PRINT=7; OLECMDEXECOPT_DONTPROMPTUSER=6/OLECMDEXECOPT_PROMPTUSER=1
window.document.body.innerHTML = oricontent;
}
catch (ex){ alert( " 执行Javascript脚本出错。 " ); }
}
function printConten(preview, html)
{
try
{
var content = html;
var oricontent = window.document.body.innerHTML;
while (content.indexOf( " {$printhide} " ) >= 0 ) content = content.replace( " {$printhide} " , " style='display:none' " );
if (content.indexOf( " ID=/ " PrintControl/ "" ) < 0 ) content = content + " <OBJECT ID=/ " PrintControl/ " WIDTH=0 HEIGHT=0 CLASSID=/ " CLSID:8856F961 - 340A - 11D0 - A96B - 00C04FD705A2/ " ></OBJECT> " ;
window.document.body.innerHTML = content;
// PrintControl.ExecWB(7,1)打印预览,(1,1)打开,(4,1)另存为,(17,1)全选,(10,1)属性,(6,1)打印,(6,6)直接打印,(8,1)页面设置
if (preview == null || preview == false ) PrintControl.ExecWB( 6 , 1 );
else PrintControl.ExecWB( 7 , 1 ); // OLECMDID_PRINT=7; OLECMDEXECOPT_DONTPROMPTUSER=6/OLECMDEXECOPT_PROMPTUSER=1
window.document.body.innerHTML = oricontent;
}
catch (ex){ alert( " 执行Javascript脚本出错。 " ); }
}
上面两个函数放在一个Js文件中,在页面内容中通过应用该脚本文件并调用进一步封装的函数即可打印指定部分的内容:
< script language = " javascript " >function Print(preview) {
var text = document.getElementById( " content " ).innerHTML;
printConten(preview, text);
}
打印的效果大致如下图所示,如果打印的页面在框架页面中,那么需要选定“仅打印选定框架”的选项。
采用此种方法,不需要安装任何控件,具有很好的兼容优势,不过出来的报表内容,好像控制起来会比较麻烦一些,特别对于一些报表方面的打印,需要输出复杂的内容是,也有一定的缺陷,但总体来说,也是一个较好的选择。
后来在需要做一些证件套打方面的工作,这个控件就做不到了,因此需要一种方法或者控件,能够较好处理套打方面的事情。
无意间,发现一个比较好的打印控件,支持各种格式的打印,还有我关心的证件套打功能,功能强大,使用也很简单的,非常值得推荐。
控件的相关地址:
控件下载主页:http://mt.runon.cn/index.html
控件博客介绍:http://blog.sina.com.cn/s/articlelist_1340389911_0_1.html
应用这个控件,普通报表的打印效果如下所示:
上面两个报表的打印其实都差不多,都是打印部分的HTML内容,不过后者看起来要好一点,而且提供很完善的报表功能设置。
代码大致如下所示。

function Print(preview) {
var text = document.getElementById( " content " ).innerHTML;
printConten(preview, text);
}
</ script >
< script language ="javascript" src ="http://www.cnblogs.com/Scripts/CheckActivX.js" ></ script >
< object id ="LODOP" classid ="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" width =0 height =0 > </ object >
< script language ="javascript" >
var LODOP = document.getElementById( " LODOP " ); // 这行语句是为了符合DTD规范
CheckLodop();
</ script >
< script language ="javascript" type ="text/javascript" >
function Preview() { // 打印预览
CreateLicenseData();
LODOP.SET_SHOW_MODE( " PREVIEW_IN_BROWSE " , 1 );
LODOP.PREVIEW();
};
function Setup() { // 打印维护 给用户调整位置
CreateLicenseData();
LODOP.PRINT_SETUP();
};
function Design() { // 打印设计 开发人员设置内容和位置
CreateLicenseData();
LODOP.PRINT_DESIGN();
};
function CreateLicenseData() {
LODOP.PRINT_INIT( " 查询报表 " );
LODOP.ADD_PRINT_HTM( 20 , 40 , 610 , 900 , document.all( " content " ).innerHTML);
LODOP.PREVIEW();
}
</ script >
很多时候,我们也没的内容,都是通过CSS来控制美观的,所以有时候,我们打印部分HTML,没有这些样式的话,那么出来的Table格式和字体,可能都会发生变化,不太好看。那么就需要进行HTML的样式设置。
如果给打印内容设置了样式,那么出来的界面效果就好很多了。
设置样式的代码如下所示。

function Preview() { // 打印预览
CreateLicenseData();
LODOP.SET_SHOW_MODE( " PREVIEW_IN_BROWSE " , 1 );
LODOP.PREVIEW();
};
function CreateLicenseData() {
LODOP.PRINT_INIT( " 申请处理单 " );
var strBodyStyle = " <link type='text/css' rel='stylesheet' href='http://www.cnblogs.com/Themes/Default/style.css' /><style><!--table { border:1;background-color: #CBCBCC } td {background-color:#FFFFFE;border: 1; } th { background-color:#F1F1F3;padding-left:5px;border:1}--></style> " ;
var strFormHtml = strBodyStyle + " <body> " + document.getElementById( " content " ).innerHTML + " </body> " ;
LODOP.ADD_PRINT_HTM( 20 , 40 , 610 , 900 , strFormHtml);
LODOP.PREVIEW();
}
</ script >
private void DBind(string pid)
{
DataTable dt;
string strsql = "select * from " + Session["outTable"].ToString() + " where " + Session["filed_id"].ToString() + "=" + pid;
dt = new cc.DBHepler().RunSql(strsql, CommandType.Text, null, null).Tables[0];
if (dt.Rows.Count > 0)
{
// strsql = "insert into " + Session["inTable"].ToString() + " (name,parent_id)values('" + dt.Rows[0]["name"].ToString() + "'," + Session["pNode"].ToString() + ")";
string sqlfield = "";
string sqlvalues = "";
strsql = "insert into " + Session["inTable"].ToString() + " (";
for (int i = 0; i < dt.Columns.Count; i++)
{
if (dt.Rows[0][i].ToString() != "" && dt.Columns[i].ColumnName.ToLower() != Session["filed_id"].ToString() && dt.Columns[i].ColumnName.ToLower() != Session["filed_pid"].ToString())
{
sqlfield += dt.Columns[i].ColumnName + ",";
sqlvalues += "'" + dt.Rows[0][i].ToString() + "',";
}
}
sqlfield += Session["filed_pid"].ToString();
sqlvalues += Session["pNode"].ToString();
strsql += sqlfield + ") values(" + sqlvalues + ")";
new cc.DBHepler().RunSqlRetNull(strsql, CommandType.Text, null, null);//插入第一条数据
strsql = "select max(" + Session["filed_id"].ToString() + ") from " + Session["inTable"].ToString();
Session["num"] = null;
Session["num"] = new cc.DBHepler().RunSqlRetObj(strsql, CommandType.Text, null, null).ToString();//得到被插入表最大ID
strsql = "select * from " + Session["outTable"].ToString() + " where " + Session["filed_pid"].ToString() + "=" + pid;
dt = new cc.DBHepler().RunSql(strsql, CommandType.Text, null, null).Tables[0];
for (int i = 0; i < dt.Rows.Count; i++)
{
// strsql = "insert into " + Session["inTable"].ToString() + " (name," + Session["filed_pid"].ToString() + ")values('" + dt.Rows[i]["name"].ToString() + "'," + Session["num"].ToString() + ")";
sqlfield = "";
sqlvalues = "";
strsql = "insert into " + Session["inTable"].ToString() + " (";
for (int num = 0; num < dt.Columns.Count; num++)
{
if (dt.Rows[i][num].ToString() != "" && dt.Columns[num].ColumnName.ToLower() != Session["filed_id"].ToString() && dt.Columns[num].ColumnName.ToLower() != Session["filed_pid"].ToString())
{
sqlfield += dt.Columns[num].ColumnName + ",";
}
}
sqlfield += Session["filed_pid"].ToString();
for (int num1 = 0; num1 < dt.Columns.Count; num1++)
{
if (dt.Rows[i][num1].ToString() != "" && dt.Columns[num1].ColumnName.ToLower() != Session["filed_id"].ToString() && dt.Columns[num1].ColumnName.ToLower() != Session["filed_pid"].ToString())
{
sqlvalues += "'" + dt.Rows[i][num1].ToString() + "',";
}
}
sqlvalues += Session["num"].ToString();
strsql += sqlfield + ") values(" + sqlvalues + ")";
new cc.DBHepler().RunSqlRetNull(strsql, CommandType.Text, null, null);//插入下级数据
}
}
}