天天看點

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也能實作,有興趣的讀者可以自己實作一下):

< 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提供給我們設定列印頁面的,下面給出它們的具體含義,如表所示。

Web列印的實作方法

通過上面的表格,讀者應該明白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方法還有很多其他的參數,這裡就不一一介紹了。

繼續閱讀