热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Web打印的实现方法

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

目前,在做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也能实现,有兴趣的读者可以自己实现一下):

代码说明:只要程序中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脚本写一个函数通过修改注册表键值来达到控制页面设置的目的,代码如下:

程序中可以再写一个函数(可用Vbscript或Javascript脚本写)先调用该函数,然后再调用window.print()实现打印,这里就不给出代码了。细心的读者一定发现了这样打印出来的页面会有打印按钮在上面,而且分页是IE打印控件根据纸张大小分出来的,下面我们介绍一种方法来控制分页和打印按钮的显示。该方法是利用CSS样式表来控制这些设置,因为在样式表中有一个“media=print”属性,该属性只有在打印的时候才会起作用,因此可以实现对打印按钮和分页的控制,具体做法如下:

只要在打印按钮中加入代码class="noprint",而在需要分页的地方加入代码

就可以了。到目前为止我们的打印功能已经比较完善了,但是还没有打印预览和直接打印的功能,一般用户在打印之前都会预览一下,如果没有问题就直接打印了。下面我们通过IEWebBrowser组件来实现这两个功能。

首先创建IEWebBrowser对象:

然后通过不同参数调用ExecWB方法实现打印预览和直接打印功能:

WebBrowser.ExecWB(6,1); //打印

WebBrowser.ExecWB(6,6); //直接打印

WebBrowser.ExecWB(7,1); //打印预览

ExecWB方法还有很多其他的参数,这里就不一一介绍了。 


推荐阅读
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
author-avatar
mobiledu2502913277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有