- 相關(guān)推薦
JS-打印word的模板程序
我們?cè)谧鲰?xiàng)目中經(jīng)常遇到“打印表格”的功能,在此介紹一下我所用過(guò)的打印方法。
一、比較簡(jiǎn)單的做法,word另存轉(zhuǎn)化為html文件的方式。分析如下:
1、首先我們需要在office中用wrod畫(huà)好文件的模板,然后將其另存為thm網(wǎng)頁(yè)形式。
2、將其改為jsp頁(yè)面,這樣我們就可以文件中使用后來(lái)傳過(guò)來(lái)的變量值。此時(shí)就是我們傳統(tǒng)的jsp方式,后臺(tái)定義參數(shù),然后前臺(tái)獲取,將變量值寫(xiě)在我們需要顯示的地方。
3、對(duì)于表格,我們可以用循環(huán)來(lái)控制。
4、這樣做打比較簡(jiǎn)單,缺點(diǎn)word模板不能修改,一旦表格做個(gè)微小的變化,那我們的工作量也不小,因?yàn)閣ord轉(zhuǎn)化后的代碼很難讀懂,要在代碼上控制其樣式,是相當(dāng)?shù)睦щy,所以不推薦這種做法。
(注:1、 在做模板時(shí),我們可以先在需要顯示變量值的地方首先定義好值,然后在jsp中直接替換就行。
2、在jsp頁(yè)面中,在首先加入“<%@ page contentType="application/msword;charset=UTF-8"%>”, 以標(biāo)識(shí)此頁(yè)面為word文件。
3、如果需要點(diǎn)擊時(shí)直接打開(kāi)word文件,而非彈出“保存、打開(kāi)”對(duì)話框,則需要?jiǎng)h除“xmlns:w="urn:schemas-microsoft-com:office:office"”代碼即可。
下面我們介紹另一種更常用的方法,此方法的有點(diǎn)是:修改word模板文件,不會(huì)影響程序。
二、用JS控制的打印方式,具體如下:
1、首先畫(huà)word模板,在需要?jiǎng)討B(tài)顯示內(nèi)容的地方插入“標(biāo)簽”。方法如下:在word中,選中需要被替換的內(nèi)容-->插入-->書(shū)簽,為其定義好名字即可,其它類(lèi)似。
2、將做好的模板文件另存為模板dot文件。
做到這基本就差不多了,接下來(lái)就是后臺(tái)代碼發(fā)揮的時(shí)候了。
3、在后臺(tái)封裝參數(shù)值。
4、調(diào)用JS函數(shù)打印。
為了更為直觀的介紹,下面用一完整的例子介紹。
先把代碼貼出來(lái):
1、JS模板文件,適用范圍:
a. 根據(jù)文檔文件,所有要顯示的內(nèi)容都定義為書(shū)簽。
b. 純表格文件。如果為多個(gè)表格或表格中嵌套表格,則需要稍加修改。
c. 文檔、表格混搭型。
代碼如下:
/** * 得到 文件模板的目錄 * @param {} fileName * @return {} */ function getFileTemplatePath(fileName){ var path = "/page/printTemplate/" + fileName + ".dot"; var url="http://"+window.location.hostname + ":" + window.location.port+ this.getContextPath() + path; return url; } /** * 調(diào)出word模板,并為標(biāo)簽賦值 * @param {} jsonObj json對(duì)象 * @param {} fileName 所要打開(kāi)的word文件名 */ function printWord(jsonObj,fileName){ var word=new ActiveXObject("Word.Application"); word.Visible=true; var url= this.getFileTemplatePath(fileName); word.Documents.add(url) for(i=0;i<jsonObj.length;i++){ if ((jsonObj[i].text)!="list"){ range=word.ActiveDocument.Bookmarks(jsonObj[i].text).Range; range.text=jsonObj[i].value; }else{ var myTable=word.ActiveDocument.Tables(1); var rowsCount = myTable.Rows.Count; var iRow=2; for(j=0;j<jsonObj[i].value.length;j++){ if (iRow > rowsCount){ myTable.Rows.Add(); } var length = jsonObj[i].value[j].length; for(var k=0; k<length; k++){ myTable.Rows(iRow).Cells(k + 1).Range.Text=jsonObj[i].value[j][k].value; } iRow ++; } } } word.Visible=true; }
2、看到代碼就會(huì)明白,這段代碼需要一個(gè)JSON類(lèi)型的參數(shù)。
下一步我們所做的工作就是要在JSON上做文章了。 附后臺(tái)代碼(封裝JSON,java)
類(lèi):PrintJSONObjectSet
import org.json.JSONArray; import org.json.JSONObject; 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 = "".equals(value) || value == null "" : value; jo.put("text", key); jo.put("value", value); return jo; } public void put(Object key, Object value) throws Exception{ ja.put(json(key,value)); } public void put(Object obj){ ja.put(obj); } }
打印封裝的方法:
/** * 打印出國(guó)(境)證明 * @return * @throws Exception */ public String printChuGuoJingZhengMing() throws Exception{ JSONArray ja = new JSONArray(); GroupInfo group = this.getGroupInfo(); String[] countrys = this.getCountrys(); if(countrys != null){ for(int c=0; c<countrys.length; c++){ PrintJSONObjectSet js = new PrintJSONObjectSet(); SeedGroupRef seed = seedImpl.getCzcz(getGroupInfoId(),countrys[c]); js.put("year", seed.getFileYear()); js.put("fileNum", seed.getFileNum()); js.put("leader",group.getLeader()); js.put("groupCount", group.getGroupCount()); js.put("country",countrys[c]); js.put("dispCode",getDispCode()); js.put("printYear", DateFunc.getPrintYear()); js.put("printMonth", DateFunc.getPrintMonth()); js.put("printDay", DateFunc.getPrintDay()); PrintJSONObjectSet js2 = new PrintJSONObjectSet(); List<MemberInfo> memberList = this.getIsSefMembers(); MemberInfo member; for(int i=0; i<memberList.size(); i++){ PrintJSONObjectSet js3 = new PrintJSONObjectSet(); member = memberList.get(i); js3.put("name1",member.getName()); js3.put("passportNum1",member.getPassportNum()); if(++i < memberList.size()){ member = memberList.get(i); js3.put("name2",member.getName()); js3.put("passportNum2",member.getPassportNum()); } js2.put(js3.getJSONArray()); } js.put("list", js2.getJSONArray()); ja.put(js.getJSONArray()); } } PrintWriter out; System.out.println(ja.toString()); try{ out = response.getWriter(); out.print(ja.toString()); out.close(); }catch(Exception e){ e.printStackTrace(); } return null; }
對(duì)于JSON的說(shuō)明:
1、最外層為一個(gè)JSONArray,這個(gè)JSON中包含多個(gè)JSONArra,其控制文檔的數(shù)量。
2、在第二層JSONArray中,包含多個(gè)JSONObject。其中每個(gè)JSONObject包含一個(gè)JSONObject對(duì)象。
每個(gè)JSONObject對(duì)象以{"text":"name","value":"張三"}的形式存儲(chǔ)。
3、遇到表格時(shí),則在第二個(gè)JSONArray中,封裝類(lèi)型{"text":"list","value":[[{"text":"","value:""}]]}形式。
也就是說(shuō)此時(shí)的JSONObject的值必須為list,只有這樣,JS中才能將其作為表格來(lái)輸入。
其中在名為 list 的JSONObject對(duì)象中,包含多個(gè)JSONArray,用來(lái)控制行數(shù)。
每個(gè)JSONArray中包含多個(gè)類(lèi)型第2條中形式的JSONObject對(duì)象,用來(lái)控制列數(shù)。
調(diào)用方法:(采用aJax)
Ext.Ajax.request({ url : href, success : function(response, options) { var responseText = response.responseText; var jsonObj=eval('(' + responseText + ')'); for(var i=0; i<jsonObj.length; i++){ printWord(jsonObj[i],'chuGuoJingZhengMing'); } }, failure : function(response, options) { alert("fail!"); } });
例子中的word文件:
如果國(guó)家為多個(gè)時(shí),則會(huì)打印出多個(gè)文件。
對(duì)于代碼的說(shuō)明:
在后臺(tái)代碼封裝中,我們將 書(shū)簽名 和 值 封裝為一個(gè)JSON對(duì)象,這樣JS處理中,我們就方便了,不用再逐個(gè)寫(xiě)出每個(gè)書(shū)簽的名字,供其查找、然后賦值。
在后臺(tái)代碼中,我這里在打印時(shí)需要根據(jù)國(guó)家來(lái)確定所要打印的文檔數(shù)量,如果為多個(gè)國(guó)家則要打印出多個(gè)文檔,所以在后臺(tái)封裝,最外層又加了一個(gè)JSONArray,JS中也多了一道循環(huán),這個(gè)可以根據(jù)需要自己調(diào)整。
特殊情況下,需要我們單獨(dú)處理,如多個(gè)表格的情況下,或者表格嵌套表格。
這里說(shuō)一下表格嵌套的情況下,如果獲得被嵌套的表格對(duì)象。
如:var myTable=word.ActiveDocument.Tables(1).Rows(1).Cells(1).Tables(1);
這里得到的是文檔中第一個(gè)表格的第一行的每一列中的每一個(gè)表格對(duì)象,其它類(lèi)似。
range=word.ActiveDocument.Bookmarks("name").Range 的意思是 得到文檔中 書(shū)簽名為“name”的對(duì)象。
range.text=“張三” 為其賦值為 張三。
這里采用的是dot文件,因?yàn)閐ot文件存在于服務(wù)器上,如果使用doc文件作為模板文件的話,在多人訪問(wèn)時(shí),會(huì)出現(xiàn)線程鎖死的情況,故采用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":"韓國(guó)"}, {"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":""} ] ] } ] ]
【JS-打印word的程序】相關(guān)文章:
office辦公軟件Word文檔打印技巧08-17
關(guān)于解決word插入公式后行距不等打印顯示亂碼的方法08-01
關(guān)于如何將Word2003的文檔打印成小冊(cè)子的教程09-11
Word技巧05-04
常用的Word技巧05-08
word出題題庫(kù)08-13
AutoCAD布局怎么打印01-12
如何給word文檔加密08-02
word怎么設(shè)置頁(yè)碼08-08