JS-打印word的模板程序

來源:文萃谷 2.55W

我們在做項目中經常遇到“打印表格”的功能,在此介紹一下我所用過的打印方法。

JS-打印word的模板程序

  一、比較簡單的做法,word另存轉化為html文件的方式。分析如下:

1、首先我們需要在office中用wrod畫好文件的模板,然後將其另存為thm網頁形式。

2、將其改為jsp頁面,這樣我們就可以文件中使用後來傳過來的變量值。此時就是我們傳統的jsp方式,後台定義參數,然後前台獲取,將變量值寫在我們需要顯示的地方。

3、對於表格,我們可以用循環來控制。

4、這樣做打比較簡單,缺點word模板不能修改,一旦表格做個微小的變化,那我們的工作量也不小,因為word轉化後的代碼很難讀懂,要在代碼上控制其樣式,是相當的困難,所以不推薦這種做法。

(注:1、 在做模板時,我們可以先在需要顯示變量值的地方首先定義好值,然後在jsp中直接替換就行。

2、在jsp頁面中,在首先加入“<%@ page contentType="application/msword;charset=UTF-8"%>”, 以標識此頁面為word文件。

3、如果需要點擊時直接打開word文件,而非彈出“保存、打開”對話框,則需要刪除“xmlns:w="urn:schemas-microsoft-com:office:office"”代碼即可。

下面我們介紹另一種更常用的方法,此方法的有點是:修改word模板文件,不會影響程序。

  二、用JS控制的打印方式,具體如下:

1、首先畫word模板,在需要動態顯示內容的地方插入“標籤”。方法如下:在word中,選中需要被替換的內容-->插入-->書籤,為其定義好名字即可,其它類似。

2、將做好的模板文件另存為模板dot文件。

做到這基本就差不多了,接下來就是後台代碼發揮的時候了。

3、在後台封裝參數值。

4、調用JS函數打印。

為了更為直觀的介紹,下面用一完整的例子介紹。

先把代碼貼出來:

1、JS模板文件,適用範圍:

a. 根據文檔文件,所有要顯示的內容都定義為書籤。

b. 純表格文件。如果為多個表格或表格中嵌套表格,則需要稍加修改。

c. 文檔、表格混搭型。

代碼如下:

/** * 得到 文件模板的目錄 * @param {} fileName * @return {} */ function getFileTemplatePath(fileName){ var path = "/page/printTemplate/" + fileName + ""; var url="http://"+name + ":" + + ontextPath() + path; return url; } /** * 調出word模板,併為標籤賦值 * @param {} jsonObj json對象 * @param {} fileName 所要打開的word文件名 */ function printWord(jsonObj,fileName){ var word=new ActiveXObject("ication"); ble=true; var url= ileTemplatePath(fileName); (url) for(i=0;i<th;i++){ if ((jsonObj[i])!="list"){ range=marks(jsonObj[i])e; =jsonObj[i]e; }else{ var myTable=es(1); var rowsCount = t; var iRow=2; for(j=0;j<jsonObj[i]th;j++){ if (iRow > rowsCount){ (); } var length = jsonObj[i]e[j]th; for(var k=0; k<length; k++){ (iRow)s(k + 1)=jsonObj[i]e[j][k]e; } iRow ++; } } } ble=true; }

2、看到代碼就會明白,這段代碼需要一個JSON類型的參數。

下一步我們所做的工作就是要在JSON上做文章了。 附後台代碼(封裝JSON,java)

類:PrintJSONObjectSet

import Array; import Object; public class PrintJSONObjectSet { private JSONArray ja; public PrintJSONObjectSet(){ ja = new JSONArray(); } public JSONArray getJSONArray(){ return ja; } public JSONObject json(Object key, Object value) throws Exception{ JSONObject jo = new JSONObject(); value = ""ls(value) || value == null "" : value; ("text", key); ("value", value); return jo; } public void put(Object key, Object value) throws Exception{ (json(key,value)); } public void put(Object obj){ (obj); } }

打印封裝的方法:

/** * 打印出國(境)證明 * @return * @throws Exception */ public String printChuGuoJingZhengMing() throws Exception{ JSONArray ja = new JSONArray(); GroupInfo group = roupInfo(); String[] countrys = ountrys(); if(countrys != null){ for(int c=0; c<th; c++){ PrintJSONObjectSet js = new PrintJSONObjectSet(); SeedGroupRef seed = zcz(getGroupInfoId(),countrys[c]); ("year", ileYear()); ("fileNum", ileNum()); ("leader",eader()); ("groupCount", roupCount()); ("country",countrys[c]); ("dispCode",getDispCode()); ("printYear", rintYear()); ("printMonth", rintMonth()); ("printDay", rintDay()); PrintJSONObjectSet js2 = new PrintJSONObjectSet(); List<MemberInfo> memberList = sSefMembers(); MemberInfo member; for(int i=0; i<(); i++){ PrintJSONObjectSet js3 = new PrintJSONObjectSet(); member = (i); ("name1",ame()); ("passportNum1",assportNum()); if(++i < ()){ member = (i); ("name2",ame()); ("passportNum2",assportNum()); } (SONArray()); } ("list", SONArray()); (SONArray()); } } PrintWriter out; tln(ring()); try{ out = riter(); t(ring()); e(); }catch(Exception e){ tStackTrace(); } return null; }

對於JSON的説明:

1、最外層為一個JSONArray,這個JSON中包含多個JSONArra,其控制文檔的數量。

2、在第二層JSONArray中,包含多個JSONObject。其中每個JSONObject包含一個JSONObject對象。

每個JSONObject對象以{"text":"name","value":"張三"}的形式存儲。

3、遇到表格時,則在第二個JSONArray中,封裝類型{"text":"list","value":[[{"text":"","value:""}]]}形式。

也就是説此時的Object的值必須為list,只有這樣,JS中才能將其作為表格來輸入。

其中在名為 list 的JSONObject對象中,包含多個JSONArray,用來控制行數。

每個JSONArray中包含多個類型第2條中形式的JSONObject對象,用來控制列數。

調用方法:(採用aJax)

est({ url : href, success : function(response, options) { var responseText = onseText; var jsonObj=eval('(' + responseText + ')'); for(var i=0; i<th; i++){ printWord(jsonObj[i],'chuGuoJingZhengMing'); } }, failure : function(response, options) { alert("fail!"); } });

例子中的word文件:

如果國家為多個時,則會打印出多個文件。

對於代碼的説明:

在後台代碼封裝中,我們將 書籤名 和 值 封裝為一個JSON對象,這樣JS處理中,我們就方便了,不用再逐個寫出每個書籤的名字,供其查找、然後賦值。

在後台代碼中,我這裏在打印時需要根據國家來確定所要打印的文檔數量,如果為多個國家則要打印出多個文檔,所以在後台封裝,最外層又加了一個JSONArray,JS中也多了一道循環,這個可以根據需要自己調整。

特殊情況下,需要我們單獨處理,如多個表格的情況下,或者表格嵌套表格。

這裏説一下表格嵌套的情況下,如果獲得被嵌套的表格對象。

如:var myTable=es(1)(1)s(1)es(1);

這裏得到的是文檔中第一個表格的第一行的每一列中的每一個表格對象,其它類似。

range=marks("name")e 的意思是 得到文檔中 書籤名為“name”的對象。

=“張三” 為其賦值為 張三。

這裏採用的是dot文件,因為dot文件存在於服務器上,如果使用doc文件作為模板文件的話,在多人訪問時,會出現線程鎖死的情況,故採用dot文件。

附加一段生成好的JSON串:

[ [ {"text":"year","value":2011}, {"text":"fileNum","value":5}, {"text":"leader","value":"彭瓚"}, {"text":"groupCount","value":5}, {"text":"country","value":"俄羅斯"}, {"text":"dispCode","value":"dispCode"}, {"text":"printYear","value":"2011"}, {"text":"printMonth","value":"04"}, {"text":"printDay","value":"07"}, {"text":"list","value":[[ {"text":"name1","value":"彭瓚"}, {"text":"passportNum1","value":""}, {"text":"name2","value":"郭沁明"}, {"text":"passportNum2","value":""} ], [ {"text":"name1","value":"張三五"}, {"text":"passportNum1","value":""}, {"text":"name2","value":"彭瓚"}, {"text":"passportNum2","value":""} ], [ {"text":"name1","value":"郭沁明"}, {"text":"passportNum1","value":""}, {"text":"name2","value":"張三五"}, {"text":"passportNum2","value":""} ] ] } ], [ {"text":"year","value":2011}, {"text":"fileNum","value":7}, {"text":"leader","value":"彭瓚"}, {"text":"groupCount","value":5}, {"text":"country","value":"韓國"}, {"text":"dispCode","value":"dispCode"}, {"text":"printYear","value":"2011"}, {"text":"printMonth","value":"04"}, {"text":"printDay","value":"07"}, {"text":"list","value":[ [ {"text":"name1","value":"彭瓚"}, {"text":"passportNum1","value":""}, {"text":"name2","value":"郭沁明"}, {"text":"passportNum2","value":""} ], [ {"text":"name1","value":"張三五"}, {"text":"passportNum1","value":""}, {"text":"name2","value":"彭瓚"}, {"text":"passportNum2","value":""} ], [ {"text":"name1","value":"郭沁明"}, {"text":"passportNum1","value":""}, {"text":"name2","value":"張三五"}, {"text":"passportNum2","value":""} ] ] } ] ]

熱門標籤