Web打印的实现方法

news/2024/7/21 3:57:56 标签: web, excel, vbscript, path, button, 报表

最近发现这东西有点忘了。。网上整理下

目前,在做B/S结构程序开发的时候,最棘手和最令人头疼的问题之一就是Web打印。往往打印出来的效果和自己预期的效果相差甚远,那么怎样才能打印出自己想要的效果呢?本文阐述的方法将解决这一问题,从而使得Web打印变得简单易用。 

我们知道要实现Web方式的打印不外乎三种方法:第一就是利用大家都熟悉的Office工具来实现Web打印,如利用Word或Excel的打印工具来实现Web打印,该方法的难点是怎样把数据从网页中导入Word或Excel中;第二就是利用IE浏览器自带的打印控件来实现Web打印,该方法的难点是怎样在程序中控制浏览器打印控件中的各项设置;第三就是利用第三方的控件或报表软件来实现Web打印,该方法的难点在于大多数的报表软件都是有偿使用的,因此不得不从经济的角度来考虑了。对于第三种方法,这一类的控件有FileSystemObject组件、ScriptX.cab控件等,这一类的报表软件有如意报表、用友公司的Cell插件、《靓妹》全动态Web报表等。这里对它们的用法就不作说明了,只要参照其提供的说明书就能够驾驭它们。以下笔者将重点讲述前两种方法。 

利用Office工具实现打印 

首先介绍第一种方法,即利用Office打印工具实现Web打印。前面我们提到了该方法的难点在于把数据导入Word或Excel中,下面笔者以Excel为例介绍一下把数据导入Excel的方法。其实将网页中的数据导入Excel中的方法有很多种,这里只介绍其中的一种,即利用ActiveX控件——Excel.Application。Excel.Application是微软为Excel提供的编程接口,在其他的编程语言中可以通过该接口程序来操作Excel表格。以下介绍一下在程序中操作EXCEL表的常用命令(以脚本语言VBScript为例,其他语言类似): 

1.Set xlApp = CreateObject("Excel.Application") '创建EXCEL对象 

2.Set xlBook = xlApp.Workbooks.Open("文件名") '打开已经存在的Excel工件簿 

3.Set xlBook = xlApp.Workbooks.Add() '创建新的Excel工件簿 

4.xlApp.Visible = True '设置EXCEL对象可见(或不可见) 

5.Set xlSheet = xlBook.Worksheets("表名") '设置活动工作表 

6.Set xlSheet = xlBook.ActiveSheet '设置活动工作表(默认表名) 

7.xlSheet.Cells(row, col) =值 '给单元格(row,col)赋值 

8.xlSheet.PrintOut '打印工作表 

9.xlBook.Close(True) '关闭工作簿 

10.xlApp.Quit '结束EXCEL对象 

11.Set xlApp = Nothing '释放xlApp对象 

这里通过一个简单的例子来说明这些命令的用法。下面给出它关键的实现代码(用javascript脚本实现,用VBScript也能实现,有兴趣的读者可以自己实现一下): 

< script language="javascript"> 

function xlPrint(){ 

var xlApp;//存放Excel对象 

var xlBook;//存放Excel工件簿文件 

var xlSheet;//存放Excel活动工作表 

try{ 

xlApp = new ActiveXObject("Excel. Application");//创建Excel对象} 

catch(e){ 

alert("请启用ActiveX控件设置!"); 

return;} 

xlBook = xlApp.Workbooks.Add();//创建Excel工作簿文件 

xlSheet = xlBook.ActiveSheet;//激活Excel工作表 

var rowLen = printData.rows.length;//table对象的行数 

for (var i=0;i< rowLen;i++){ 

var colLen = printData.rows(i).cells.length;//table对象的列数 

for (var j=0;j< colLen;j++)//为Excel表的单元格赋值 

xlSheet.Cells(i+1,j+1).value = printData.rows(i).cells(j).innerText;} 

xlApp.Visible = true;//设置Excel对象可见} 

< /script> 

代码说明:只要程序中table的ID设置为:printData,然后再把打印按钮的onclick事件响应函数设置为xlPrint()就可以了;但是运行该程序的前提就是IE要允许对没有标记为安全的ActiveX控件进行初始化和脚本运行。具体的设置方法如下:打开控制面板→Internet选项→安全性→自定义级别→对没有标记为安全的ActiveX控件进行初始化和脚本运行→选中启用,这样我们的程序就可以运行了。如果没有启用该ActiveX控件设置,那么程序在执行创建Excel对象时会抛出一个异常,这时可以通过catch()语句来捕获这个异常,并且做出相应的处理。如果想直接打印可以调用命令:xlSheet.PrintOut。 

以上的方法实现了将数据从网页的单元格到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提供给我们设置打印页面的,下面给出它们的具体含义,如表所示。 


通过上面的表格,读者应该明白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方法还有很多其他的参数,这里就不一一介绍了。

 

==================================================================

<object   id="Factory"   style="display:none"   viewastext   
  codeBase=http://www.meadroid.com/scriptx/ScriptX.cab#Version=5,60,0,360   
  classid=clsid:1663ed61-23eb-11d2-b92f-008048fdd814   viewastext>   
  </object>   
  <input   type="button"   value="打         印"   οnclick="Factory.printing.Print(true)">   
  <input   type="button"   value="页面设置"   οnclick="Factory.printing.PageSetup()">   
  <input   type="button"   value="打印预览"   οnclick="Factory.printing.Preview()">   
  <input   type="button"   value="横向设置"   οnclick="SetPrintSettings()">   
  <script>   
  function   SetPrintSettings()   
  {     
  try   
  {   
  Factory.printing.SetMarginMeasure(2);   
  Factory.SetPageRange(false,1,3);   
  Factory.printing.printer="HP   DeskJet   870C";   
  Factory.printing.copies=2;   
  Factory.printing.collate=true;   
  Factory.printing.paperSize="A4";   
  Factory.printing.paperSource="Manual   feed";   
    
  Factory.printing.header="This   is   MeadCo";   
  Factory.printing.footer="Advanced   Printing   by   ScriptX";   
  Factory.printing.portrait=false;   
  Factory.printing.leftMargin=1.0;   
  Factory.printing.topMargin=1.0;   
  Factory.printing.rightMargin=1.0;   
  Factory.printing.bottomMargin=1.0;   
  }   
  catch(e)   
  {}   
  }     
  </script>

更多信息:http://www.cnblogs.com/Athrun/archive/2008/11/26/134128.html

http://www.niftyadmin.cn/n/1049694.html

相关文章

Centos 6.5上Apache + PAM + SVN服务安装配置(使用本地系统用户认证)

类别&#xff1a;原创 服务器 本文参考 svn 基础搭建 参考 http://jedy82.blog.51cto.com/425872/1395834 http://blog.csdn.net/sxhong/article/details/9176881 svn 操作命令 参考 http://blog.csdn.net/gexiaobaohelloworld/article/details/7752862 本地用户访问权限配…

DB2 Express-C V9.5和V9.1的许可协议的对比

V9.1的许可协议的限制约束部分 --------------------------------------- 以下是来自IBM的信息&#xff1a; 2.1&#xff09;资源 您可以在遵守以下所有资源限制条款的服务器上安装和使用本程序&#xff1a; - 处理器&#xff1a;每台服务器最多具有两个本程序可用的处理器。…

pv、uv、PR

1&#xff0e;PV PV(page view)&#xff0c;即页面浏览量&#xff0c;或点击量&#xff1b;用户每次对网站的访问均被记录1次。用户对同一页面的多次访问&#xff0c;访问量累计 2&#xff0e;pv 在 机械密封 制造行业中&#xff0c;用PV值来表示机械密封的工作能力&#xff08…

2014.4.17—openflow代码流程

分享最近改openflow的一些经验。欢迎学习openflow的同学大家一起讨论。转载于:https://www.cnblogs.com/jevylee/p/3734324.html

HibernateShards-数据库水平分区解决方案

HibernateShard多数据库水平分区解决方案。 1. 简介Hibernate 的一个扩展&#xff0c;用于处理多数据库水平分区架构。 由google工程师 2007年 捐献给 Hibernate社区。 http://www.hibernate.org/414.html目前版本&#xff1a; 3.0.0 beta2&#xff0c; 未发GA版。 条件&…

解决多个jquery并存冲突问题

jQuery自诞生以来&#xff0c;版本越来越多&#xff0c;而且jQuery官网的新版本还在不断的更新和发布中&#xff0c;现已经达到了1.6.4版本&#xff0c;但是我们在以前的项目中就已经使用了旧版本的jQuery&#xff0c;比如已经出现的&#xff1a;1.3.X、1.4.X、1.5.X、1.6.2等等…

ACM-ICPC如何起步

刚刚绝定投身ACM-ICPC的同学先要过两关。 第一关&#xff1a;程序设计语言 如果学校有开设相关课程&#xff0c;则省去了很多麻烦。如果没有则可以选择《程序设计导引及在线实践》作为教材。现在的比赛中允许使用的语言相对局限&#xff0c;建议c和c至少掌握一种。java可以在后…

HTML 5是不是解决跨平台问题的终极密钥?

不同平台的生态圈、技术障碍等壁垒阻碍了开发者快速发展&#xff0c;而HTML5虽被寄予厚望&#xff0c;但目前还缺乏有说服力的产品&#xff0c;HTML5的潜能仍需在探索中被继续挖掘。 Beau Hindman在解析自己理想的游戏状态时&#xff0c;认为好的游戏除了在创意环节&#xff08…