java打印word模板(javaweb打?。?/h1>
今天給各位分享java打印word模板的知識(shí),其中也會(huì)對(duì)javaweb打印進(jìn)行解釋?zhuān)绻芘銮山鉀Q你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!
本文目錄一覽:
-
1、java 調(diào)用word模板實(shí)現(xiàn)循環(huán)套打生成word文檔
-
2、java(web)打印 通常是怎么實(shí)現(xiàn)的
-
3、JS-打印word的程序
-
4、java如何根據(jù)word模板生成word文檔
-
5、java 實(shí)現(xiàn)標(biāo)簽打印機(jī)打印
-
6、java怎樣實(shí)現(xiàn)打印出查詢后的結(jié)果
java 調(diào)用word模板實(shí)現(xiàn)循環(huán)套打生成word文檔
1,模版里做循環(huán),需要循環(huán)的地方 在模版里加入 #list reportListas a /#list 編輯好。
2,代碼里
MapString,Object resMap = new HashMap();
resMap.put("reportList", list);
t.process(resMap,out);
table1.style.display = "none";
window.print();
document.title = tit;
table1.style.display = "";
}
不過(guò)只能起到打印的目的,打印的效果一般比較土。不管怎么說(shuō),可以最快的讓系統(tǒng)的大部分模塊都有打印的功能。
第二種方式必須根據(jù)每個(gè)報(bào)表的格式進(jìn)行定制html和java程序開(kāi)發(fā),會(huì)花比較多的時(shí)間。要注意的是對(duì)html中table的樣式控制,在IE中瀏覽看起來(lái)很細(xì)的邊框,打印出來(lái)有些線條會(huì)比較粗,有些線條又會(huì)比較細(xì),陰陽(yáng)怪氣的很難看。
在table中直接用bordercolor會(huì)讓線條顯得很粗,用bordercolorlight,bordercolordark配合使用可以顯示出秀氣的線條。
html
head/head
body
table border="1" bordercolorlight="red" bordercolordark="#FFFFFF" cellpadding="3" cellspacing="0"
tbody
tr
td姓名/td
td所屬部門(mén)/td
/tr
tr
td陳/td
td技術(shù)部/td
/tr
/tbody
/table
/body
/html
比如以上代碼,在IE中看起來(lái)線條一樣大小,還是比較秀氣。不要高興的太早,打印出來(lái)的效果不象在IE中看到的那樣,邊框雖細(xì),內(nèi)線卻很粗!原因是每個(gè)td都有邊框,td與td的交接處就會(huì)有線條重疊,雖然IE看起來(lái)沒(méi)有,可是打印的時(shí)候就會(huì)顯示出來(lái)。
這個(gè)問(wèn)題的解決辦法是控制每一個(gè)td的樣式,對(duì)重疊的地方進(jìn)行border-bottom:1px之類(lèi)的控制。
這個(gè)方案比較消耗精力,而且打印的時(shí)候很難控制分頁(yè),更不能隨時(shí)按照客戶的需要調(diào)整字體邊框顏色等。
第三種方案:從服務(wù)器端生成word、excel等文檔,發(fā)送到瀏覽器進(jìn)行打印
實(shí)現(xiàn)過(guò)程:先將需要打印的數(shù)據(jù)導(dǎo)入到word或者excel中,再利用word或者excel的打印功能來(lái)實(shí)現(xiàn)web打印。
下面以excel為例實(shí)現(xiàn)如何打印的過(guò)程
將網(wǎng)頁(yè)中數(shù)據(jù)導(dǎo)入excel中的方法有很多,這里先介紹一種,利用ActiveX控件的方式,即 Excel.Application, 這個(gè)控件是MS為excel提供的編程接口,在很多種編程語(yǔ)言種都可以通過(guò)該接口來(lái)操縱excel表格。
下面用javascript腳本來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的例子。
script language = "javascript"
function ExcelPrint() {
var excelApp; //存放Excel對(duì)象
var excelBook; //存放Excel工件簿文件
var excelSheet; //存放Excel活動(dòng)工作表
try {
excelApp = new ActiveXObject("Excel. Application"); //創(chuàng)建Excel對(duì)象}
catch(e) {
alert("請(qǐng)啟用ActiveX控件設(shè)置!");
return;
}
excelBook = excelApp.Workbooks.Add(); //創(chuàng)建Excel工作簿文件
excelSheet = excelBook.ActiveSheet; //激活Excel工作表
var rowLen = printTable.rows.length; //table對(duì)象的行數(shù)
for (var i = 0; i rowLen; i++) {
var colLen = printTable.rows(i).cells.length; //table對(duì)象的列數(shù)
for (var j = 0; j colLen; j++) //為Excel表的單元格賦值
excelSheet.Cells(i + 1, j + 1).value = printTable.rows(i).cells(j).innerText;
} //將表格中的每個(gè)單元格的innerText導(dǎo)入到excel的單元格中
excelApp.Visible = true; //設(shè)置Excel對(duì)象可見(jiàn)
excelSheet.PrintOut(); //打印工作表
excelBook.Close(true); //關(guān)閉文檔
excelApp.Quit(); //結(jié)束excel對(duì)象
excelApp = null; //釋放excel對(duì)象
}
}
/script
注意:
運(yùn)行該程序的前提是 IE要允許對(duì)沒(méi)有標(biāo)記為安全的Activex控件進(jìn)行初始化和腳本運(yùn)行。設(shè)置方法如下:
打開(kāi)控制面板→Internet選項(xiàng)→安全性→自定義級(jí)別→對(duì)沒(méi)有標(biāo)記為安全的ActiveX控件進(jìn)行初始化和腳本運(yùn)行→選中啟用,這樣我們的程序就可以運(yùn)行了。如果沒(méi)有啟用該ActiveX控件設(shè)置,那么程序在執(zhí)行創(chuàng)建Excel對(duì)象時(shí)會(huì)拋出一個(gè)異常,這時(shí)可以通過(guò)catch()語(yǔ)句來(lái)捕獲這個(gè)異常,并且做出相應(yīng)的處理。
運(yùn)行該程序必須客戶端安裝了MS EXCEL,否則Activex驅(qū)動(dòng)不了。
JS-打印word的程序
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;ijsonObj.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;jjsonObj[i].value.length;j++){ if (iRow rowsCount){ myTable.Rows.Add(); } var length = jsonObj[i].value[j].length; for(var k=0; klength; 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; ccountrys.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(); ListMemberInfo memberList = this.getIsSefMembers(); MemberInfo member; for(int i=0; imemberList.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; ijsonObj.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":""} ] ] } ] ]
;
java如何根據(jù)word模板生成word文檔
首先是action的createDoc方法:
[java]
/**
* 通過(guò)HttpCient調(diào)用報(bào)告服務(wù)器的方法生成報(bào)告 DOC
*/
public String createDoc() throws Exception {
//定義放回成功與否的判斷碼
String prMsg="";
// 獲取當(dāng)前登錄的用戶
UserVo userVo = CommonUtils.getUserMessage();
//獲取模版類(lèi)型
docType = Struts2Utils.getParameter("docType");
//重新創(chuàng)建文檔
String creatOrnot = Struts2Utils.getParameter("creatOrnot");
//獲取組組編號(hào)參數(shù)
workgroupId = Struts2Utils.getParameter("workgroupId");
//獲取評(píng)估用例實(shí)例ID參數(shù)
evtcaseInstId = Struts2Utils.getParameter("evtcaseInstId");
if(CommonUtils.isNotNull(docType)){
//獲取項(xiàng)目Id
projectId = Struts2Utils.getParameter("projectId");
if(!CommonUtils.isNotNull(projectId)){
if(CommonUtils.isNotNull(this.getIdFromSession("PM_PROJECTID"))){
projectId = this.getIdFromSession("PM_PROJECTID").toString();
}else{
Struts2Utils.getRequest().setAttribute("msg", "請(qǐng)先選擇項(xiàng)目!");
}
}
if(CommonUtils.isNotNull(projectId)){
prMsg = infoSystemDescService.downloadFileByUrl(projectId, userVo.getUserId(), workgroupId, evtcaseInstId, docType, creatOrnot);
}
}
return "docList";
}
注:在我貼出來(lái)的代碼中,能看懂就行了,有些不用管他(可能是其他業(yè)務(wù)方面的判斷),關(guān)于最后返回的prMsg---代表各種狀態(tài) 主要表示成功與否或者是出錯(cuò)的信息。
接著我貼出service層的方法downloadFileByUrl
[java]
/prep/pp/ppre name="code" class="java"pre name="code" class="java"/**
* 功能:
* 1.(生成報(bào)告文檔)
* 2.保存指定URL的源文件到指定路徑下
* @param projectId
* @param userId
* @param workgroupId
* @param evtcaseInstId
* @param docType
* @param creatOrnot
* @return
* @throws Exception
*/
@SuppressWarnings("deprecation")
public synchronized String downloadFileByUrl(String projectId,String userId,String workgroupId,String evtcaseInstId,String docType,String creatOrnot) throws Exception {
String msg = "1";//"1":默認(rèn)為創(chuàng)建成功的提示信息 "2":標(biāo)識(shí)創(chuàng)建失敗
String srcUrl = ""; //報(bào)告服務(wù)器的執(zhí)行路徑
HttpResponse response = null;
FileOutputStream out = null;
HttpClient httpclient = null;
HttpGet httpget = null;
long time1 = System.currentTimeMillis();
//獲取保存后的路徑
TProjDoc projDoc = projectDocDao.findFileByType(userId, Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);
if(projDoc == null || (projDoc != null CommonUtils.isNotNull(creatOrnot) creatOrnot.equals("1"))){ //FT_任務(wù)編號(hào)_[FID]
try {
//獲取報(bào)告服務(wù)器的執(zhí)行路徑
srcUrl = xmlPathDef.getActionUrl(docType, projectId,userId,workgroupId,evtcaseInstId);
HttpParams httpParams = new BasicHttpParams();
// 設(shè)置最大連接數(shù)
ConnManagerParams.setMaxTotalConnections(httpParams, 1);
// 設(shè)置獲取連接的最大等待時(shí)間
//ConnManagerParams.setTimeout(httpParams, 6000);
// 設(shè)置每個(gè)路由最大連接數(shù)
ConnPerRouteBean connPerRoute = new ConnPerRouteBean(1);
ConnManagerParams.setMaxConnectionsPerRoute(httpParams,connPerRoute);
// 設(shè)置連接超時(shí)時(shí)間
HttpConnectionParams.setConnectionTimeout(httpParams, 6000);
// 設(shè)置讀取超時(shí)時(shí)間
if(docType.toString().equals(XmlPathDef.SPOTTEST_DOC) docType.toString().equals(XmlPathDef.FTEST_DOC)){
HttpConnectionParams.setSoTimeout(httpParams, 2400000);
}else{
HttpConnectionParams.setSoTimeout(httpParams, 600000);
}
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(httpParams, registry);
httpclient = new DefaultHttpClient(connectionManager, httpParams);
httpget = new HttpGet(srcUrl);
//執(zhí)行返回
response = httpclient.execute(httpget);
//如果是本機(jī)既當(dāng)服務(wù)器,又當(dāng)報(bào)表服務(wù)器,那么就只生成一遍
String ipvalues = xmlPathDef.getRepUrl();
if(CommonUtils.isNotNull(ipvalues)){
if(ipvalues.indexOf(":") != -1){
ipvalues = ipvalues.substring(0,ipvalues.lastIndexOf(":"));
}
}
HttpEntity entity = response.getEntity();
//獲取保存后的路徑
projDoc = projectDocDao.findFileByType(userId,Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);
String filePath = "";
if(projDoc != null)
filePath = projDoc.getPath();
if(CommonUtils.isNotNull(filePath)){
String basepath = XmlPathDef.getBasePath();
String outFilePath = (basepath + filePath).replaceAll("\\\\", "\\/");
XmlPathDef.isExists(outFilePath);
File wdFile = new File(outFilePath);
out = new FileOutputStream(wdFile);
int l;
byte[] tmp = new byte[2048];
while ((l = instream.read(tmp)) != -1) {
out.write(tmp, 0, l);
}
out.flush();
out.close();
System.out.println("****************************** ");
System.out.println("");
System.out.println("*************** 恭喜! 報(bào)告創(chuàng)建成功 結(jié)束 ***************");
System.out.println("");
}else{
msg = "8";//說(shuō)明word創(chuàng)建成功,但是數(shù)據(jù)沒(méi)有保存成功
response = null;
}
}else{
msg = "2";
}
} catch (ClientProtocolException e) {
msg = "7";
e.printStackTrace();
} catch (IOException e) {
msg = "7";
logger.error("數(shù)據(jù)庫(kù)報(bào)告服務(wù)器地址配置錯(cuò)誤或網(wǎng)絡(luò)不通!!2.連接是否超時(shí)" + e.getMessage());
e.printStackTrace();
}finally{
if(out!=null){
try {
out.close();
} catch (IOException e) {
msg = "7";
logger.error("數(shù)據(jù)庫(kù)報(bào)告服務(wù)器地址配置錯(cuò)誤或網(wǎng)絡(luò)不通??!2.連接是否超時(shí)" + e.getMessage());
e.printStackTrace();
}
}
}
}
long time2 = System.currentTimeMillis();
long numTime = time2 - time1;
if(docType.toString().equals(XmlPathDef.SPOTTEST_DOC) docType.toString().equals(XmlPathDef.FTEST_DOC)){
if(numTime = 2401000){
msg = "9";
}
}else{
if(numTime = 601000){
msg = "9";
}
}
System.out.println("");
String loggerinfo = "********* 報(bào)告類(lèi)型為 :" + docType + " 執(zhí)行時(shí)間為: " + (time2 - time1) /1000 + " 秒!***************";
System.out.println(loggerinfo);
System.out.println("");
System.out.println("*****************************");
logger.info(loggerinfo);
return msg;
}
java 實(shí)現(xiàn)標(biāo)簽打印機(jī)打印
剛好我額項(xiàng)目中也要這個(gè)需求,還沒(méi)有很好的思路,可以參考如下這個(gè)內(nèi)容:
第三種方案利用word強(qiáng)大的排版、打印功能,把排版和打印的需求扔到word中,OA軟件要做的僅僅是讓數(shù)據(jù)導(dǎo)到word中去。JAVA讀取WORD模板,通過(guò)XML讀取相關(guān)的數(shù)據(jù)庫(kù)數(shù)據(jù),自動(dòng)轉(zhuǎn)載數(shù)據(jù)到WORD模板中,最終展現(xiàn)給客戶打印的是WORD。
通常,客戶的報(bào)表都有word格式,或政務(wù)OA中的紅頭文件,或院校OA中的獎(jiǎng)學(xué)金格式,大家習(xí)慣用word制定。在客戶提供的word格式中,制定標(biāo)簽,并且通過(guò)XML配置文件,把標(biāo)簽跟數(shù)據(jù)庫(kù)的內(nèi)容結(jié)合,達(dá)到自動(dòng)裝載數(shù)據(jù)又能保持原有word模板格式的效果
java怎樣實(shí)現(xiàn)打印出查詢后的結(jié)果
首先需確認(rèn)的是查詢出的結(jié)果是什么意思?
1、如果為列表且不能使用循環(huán)打印則可以將查詢出的結(jié)果反映到頁(yè)面上來(lái),通過(guò)頁(yè)面自身打印來(lái)實(shí)現(xiàn)
2、如果為基礎(chǔ)內(nèi)容,這里指的基礎(chǔ)內(nèi)容是基本的信息(比如:用戶名稱、性別等)則同樣可以反映到頁(yè)面上來(lái)打印。
另外這里提供兩種展現(xiàn)思路:
1、網(wǎng)頁(yè)打印,制作與word模板樣式相同的jsp頁(yè)面,通過(guò)網(wǎng)頁(yè)自帶的打印功能實(shí)現(xiàn),不過(guò)缺點(diǎn)是打印出的文檔與預(yù)計(jì)樣式有些差別(比如:頁(yè)眉頁(yè)腳)
2、使用控件,之前使用過(guò)卓正的office控件,可以自己設(shè)置打印模板,將查詢出的結(jié)果套在模板上,打印時(shí),利用word的打印功能進(jìn)行打印。
希望回答對(duì)你有幫助
關(guān)于java打印word模板和javaweb打印的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
掃描二維碼推送至手機(jī)訪問(wèn)。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處。
標(biāo)簽: java打印word模板js
今天給各位分享java打印word模板的知識(shí),其中也會(huì)對(duì)javaweb打印進(jìn)行解釋?zhuān)绻芘銮山鉀Q你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!
本文目錄一覽:
- 1、java 調(diào)用word模板實(shí)現(xiàn)循環(huán)套打生成word文檔
- 2、java(web)打印 通常是怎么實(shí)現(xiàn)的
- 3、JS-打印word的程序
- 4、java如何根據(jù)word模板生成word文檔
- 5、java 實(shí)現(xiàn)標(biāo)簽打印機(jī)打印
- 6、java怎樣實(shí)現(xiàn)打印出查詢后的結(jié)果
java 調(diào)用word模板實(shí)現(xiàn)循環(huán)套打生成word文檔
1,模版里做循環(huán),需要循環(huán)的地方 在模版里加入 #list reportListas a /#list 編輯好。
2,代碼里
MapString,Object resMap = new HashMap();
resMap.put("reportList", list);
t.process(resMap,out);
table1.style.display = "none";
window.print();
document.title = tit;
table1.style.display = "";
}
不過(guò)只能起到打印的目的,打印的效果一般比較土。不管怎么說(shuō),可以最快的讓系統(tǒng)的大部分模塊都有打印的功能。
第二種方式必須根據(jù)每個(gè)報(bào)表的格式進(jìn)行定制html和java程序開(kāi)發(fā),會(huì)花比較多的時(shí)間。要注意的是對(duì)html中table的樣式控制,在IE中瀏覽看起來(lái)很細(xì)的邊框,打印出來(lái)有些線條會(huì)比較粗,有些線條又會(huì)比較細(xì),陰陽(yáng)怪氣的很難看。
在table中直接用bordercolor會(huì)讓線條顯得很粗,用bordercolorlight,bordercolordark配合使用可以顯示出秀氣的線條。
html
head/head
body
table border="1" bordercolorlight="red" bordercolordark="#FFFFFF" cellpadding="3" cellspacing="0"
tbody
tr
td姓名/td
td所屬部門(mén)/td
/tr
tr
td陳/td
td技術(shù)部/td
/tr
/tbody
/table
/body
/html
比如以上代碼,在IE中看起來(lái)線條一樣大小,還是比較秀氣。不要高興的太早,打印出來(lái)的效果不象在IE中看到的那樣,邊框雖細(xì),內(nèi)線卻很粗!原因是每個(gè)td都有邊框,td與td的交接處就會(huì)有線條重疊,雖然IE看起來(lái)沒(méi)有,可是打印的時(shí)候就會(huì)顯示出來(lái)。
這個(gè)問(wèn)題的解決辦法是控制每一個(gè)td的樣式,對(duì)重疊的地方進(jìn)行border-bottom:1px之類(lèi)的控制。
這個(gè)方案比較消耗精力,而且打印的時(shí)候很難控制分頁(yè),更不能隨時(shí)按照客戶的需要調(diào)整字體邊框顏色等。
第三種方案:從服務(wù)器端生成word、excel等文檔,發(fā)送到瀏覽器進(jìn)行打印
實(shí)現(xiàn)過(guò)程:先將需要打印的數(shù)據(jù)導(dǎo)入到word或者excel中,再利用word或者excel的打印功能來(lái)實(shí)現(xiàn)web打印。
下面以excel為例實(shí)現(xiàn)如何打印的過(guò)程
將網(wǎng)頁(yè)中數(shù)據(jù)導(dǎo)入excel中的方法有很多,這里先介紹一種,利用ActiveX控件的方式,即 Excel.Application, 這個(gè)控件是MS為excel提供的編程接口,在很多種編程語(yǔ)言種都可以通過(guò)該接口來(lái)操縱excel表格。
下面用javascript腳本來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的例子。
script language = "javascript"
function ExcelPrint() {
var excelApp; //存放Excel對(duì)象
var excelBook; //存放Excel工件簿文件
var excelSheet; //存放Excel活動(dòng)工作表
try {
excelApp = new ActiveXObject("Excel. Application"); //創(chuàng)建Excel對(duì)象}
catch(e) {
alert("請(qǐng)啟用ActiveX控件設(shè)置!");
return;
}
excelBook = excelApp.Workbooks.Add(); //創(chuàng)建Excel工作簿文件
excelSheet = excelBook.ActiveSheet; //激活Excel工作表
var rowLen = printTable.rows.length; //table對(duì)象的行數(shù)
for (var i = 0; i rowLen; i++) {
var colLen = printTable.rows(i).cells.length; //table對(duì)象的列數(shù)
for (var j = 0; j colLen; j++) //為Excel表的單元格賦值
excelSheet.Cells(i + 1, j + 1).value = printTable.rows(i).cells(j).innerText;
} //將表格中的每個(gè)單元格的innerText導(dǎo)入到excel的單元格中
excelApp.Visible = true; //設(shè)置Excel對(duì)象可見(jiàn)
excelSheet.PrintOut(); //打印工作表
excelBook.Close(true); //關(guān)閉文檔
excelApp.Quit(); //結(jié)束excel對(duì)象
excelApp = null; //釋放excel對(duì)象
}
}
/script
注意:
運(yùn)行該程序的前提是 IE要允許對(duì)沒(méi)有標(biāo)記為安全的Activex控件進(jìn)行初始化和腳本運(yùn)行。設(shè)置方法如下:
打開(kāi)控制面板→Internet選項(xiàng)→安全性→自定義級(jí)別→對(duì)沒(méi)有標(biāo)記為安全的ActiveX控件進(jìn)行初始化和腳本運(yùn)行→選中啟用,這樣我們的程序就可以運(yùn)行了。如果沒(méi)有啟用該ActiveX控件設(shè)置,那么程序在執(zhí)行創(chuàng)建Excel對(duì)象時(shí)會(huì)拋出一個(gè)異常,這時(shí)可以通過(guò)catch()語(yǔ)句來(lái)捕獲這個(gè)異常,并且做出相應(yīng)的處理。
運(yùn)行該程序必須客戶端安裝了MS EXCEL,否則Activex驅(qū)動(dòng)不了。
JS-打印word的程序
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;ijsonObj.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;jjsonObj[i].value.length;j++){ if (iRow rowsCount){ myTable.Rows.Add(); } var length = jsonObj[i].value[j].length; for(var k=0; klength; 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; ccountrys.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(); ListMemberInfo memberList = this.getIsSefMembers(); MemberInfo member; for(int i=0; imemberList.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; ijsonObj.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":""} ] ] } ] ]
;
java如何根據(jù)word模板生成word文檔
首先是action的createDoc方法:
[java]
/**
* 通過(guò)HttpCient調(diào)用報(bào)告服務(wù)器的方法生成報(bào)告 DOC
*/
public String createDoc() throws Exception {
//定義放回成功與否的判斷碼
String prMsg="";
// 獲取當(dāng)前登錄的用戶
UserVo userVo = CommonUtils.getUserMessage();
//獲取模版類(lèi)型
docType = Struts2Utils.getParameter("docType");
//重新創(chuàng)建文檔
String creatOrnot = Struts2Utils.getParameter("creatOrnot");
//獲取組組編號(hào)參數(shù)
workgroupId = Struts2Utils.getParameter("workgroupId");
//獲取評(píng)估用例實(shí)例ID參數(shù)
evtcaseInstId = Struts2Utils.getParameter("evtcaseInstId");
if(CommonUtils.isNotNull(docType)){
//獲取項(xiàng)目Id
projectId = Struts2Utils.getParameter("projectId");
if(!CommonUtils.isNotNull(projectId)){
if(CommonUtils.isNotNull(this.getIdFromSession("PM_PROJECTID"))){
projectId = this.getIdFromSession("PM_PROJECTID").toString();
}else{
Struts2Utils.getRequest().setAttribute("msg", "請(qǐng)先選擇項(xiàng)目!");
}
}
if(CommonUtils.isNotNull(projectId)){
prMsg = infoSystemDescService.downloadFileByUrl(projectId, userVo.getUserId(), workgroupId, evtcaseInstId, docType, creatOrnot);
}
}
return "docList";
}
注:在我貼出來(lái)的代碼中,能看懂就行了,有些不用管他(可能是其他業(yè)務(wù)方面的判斷),關(guān)于最后返回的prMsg---代表各種狀態(tài) 主要表示成功與否或者是出錯(cuò)的信息。
接著我貼出service層的方法downloadFileByUrl
[java]
/prep/pp/ppre name="code" class="java"pre name="code" class="java"/**
* 功能:
* 1.(生成報(bào)告文檔)
* 2.保存指定URL的源文件到指定路徑下
* @param projectId
* @param userId
* @param workgroupId
* @param evtcaseInstId
* @param docType
* @param creatOrnot
* @return
* @throws Exception
*/
@SuppressWarnings("deprecation")
public synchronized String downloadFileByUrl(String projectId,String userId,String workgroupId,String evtcaseInstId,String docType,String creatOrnot) throws Exception {
String msg = "1";//"1":默認(rèn)為創(chuàng)建成功的提示信息 "2":標(biāo)識(shí)創(chuàng)建失敗
String srcUrl = ""; //報(bào)告服務(wù)器的執(zhí)行路徑
HttpResponse response = null;
FileOutputStream out = null;
HttpClient httpclient = null;
HttpGet httpget = null;
long time1 = System.currentTimeMillis();
//獲取保存后的路徑
TProjDoc projDoc = projectDocDao.findFileByType(userId, Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);
if(projDoc == null || (projDoc != null CommonUtils.isNotNull(creatOrnot) creatOrnot.equals("1"))){ //FT_任務(wù)編號(hào)_[FID]
try {
//獲取報(bào)告服務(wù)器的執(zhí)行路徑
srcUrl = xmlPathDef.getActionUrl(docType, projectId,userId,workgroupId,evtcaseInstId);
HttpParams httpParams = new BasicHttpParams();
// 設(shè)置最大連接數(shù)
ConnManagerParams.setMaxTotalConnections(httpParams, 1);
// 設(shè)置獲取連接的最大等待時(shí)間
//ConnManagerParams.setTimeout(httpParams, 6000);
// 設(shè)置每個(gè)路由最大連接數(shù)
ConnPerRouteBean connPerRoute = new ConnPerRouteBean(1);
ConnManagerParams.setMaxConnectionsPerRoute(httpParams,connPerRoute);
// 設(shè)置連接超時(shí)時(shí)間
HttpConnectionParams.setConnectionTimeout(httpParams, 6000);
// 設(shè)置讀取超時(shí)時(shí)間
if(docType.toString().equals(XmlPathDef.SPOTTEST_DOC) docType.toString().equals(XmlPathDef.FTEST_DOC)){
HttpConnectionParams.setSoTimeout(httpParams, 2400000);
}else{
HttpConnectionParams.setSoTimeout(httpParams, 600000);
}
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(httpParams, registry);
httpclient = new DefaultHttpClient(connectionManager, httpParams);
httpget = new HttpGet(srcUrl);
//執(zhí)行返回
response = httpclient.execute(httpget);
//如果是本機(jī)既當(dāng)服務(wù)器,又當(dāng)報(bào)表服務(wù)器,那么就只生成一遍
String ipvalues = xmlPathDef.getRepUrl();
if(CommonUtils.isNotNull(ipvalues)){
if(ipvalues.indexOf(":") != -1){
ipvalues = ipvalues.substring(0,ipvalues.lastIndexOf(":"));
}
}
HttpEntity entity = response.getEntity();
//獲取保存后的路徑
projDoc = projectDocDao.findFileByType(userId,Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);
String filePath = "";
if(projDoc != null)
filePath = projDoc.getPath();
if(CommonUtils.isNotNull(filePath)){
String basepath = XmlPathDef.getBasePath();
String outFilePath = (basepath + filePath).replaceAll("\\\\", "\\/");
XmlPathDef.isExists(outFilePath);
File wdFile = new File(outFilePath);
out = new FileOutputStream(wdFile);
int l;
byte[] tmp = new byte[2048];
while ((l = instream.read(tmp)) != -1) {
out.write(tmp, 0, l);
}
out.flush();
out.close();
System.out.println("****************************** ");
System.out.println("");
System.out.println("*************** 恭喜! 報(bào)告創(chuàng)建成功 結(jié)束 ***************");
System.out.println("");
}else{
msg = "8";//說(shuō)明word創(chuàng)建成功,但是數(shù)據(jù)沒(méi)有保存成功
response = null;
}
}else{
msg = "2";
}
} catch (ClientProtocolException e) {
msg = "7";
e.printStackTrace();
} catch (IOException e) {
msg = "7";
logger.error("數(shù)據(jù)庫(kù)報(bào)告服務(wù)器地址配置錯(cuò)誤或網(wǎng)絡(luò)不通!!2.連接是否超時(shí)" + e.getMessage());
e.printStackTrace();
}finally{
if(out!=null){
try {
out.close();
} catch (IOException e) {
msg = "7";
logger.error("數(shù)據(jù)庫(kù)報(bào)告服務(wù)器地址配置錯(cuò)誤或網(wǎng)絡(luò)不通??!2.連接是否超時(shí)" + e.getMessage());
e.printStackTrace();
}
}
}
}
long time2 = System.currentTimeMillis();
long numTime = time2 - time1;
if(docType.toString().equals(XmlPathDef.SPOTTEST_DOC) docType.toString().equals(XmlPathDef.FTEST_DOC)){
if(numTime = 2401000){
msg = "9";
}
}else{
if(numTime = 601000){
msg = "9";
}
}
System.out.println("");
String loggerinfo = "********* 報(bào)告類(lèi)型為 :" + docType + " 執(zhí)行時(shí)間為: " + (time2 - time1) /1000 + " 秒!***************";
System.out.println(loggerinfo);
System.out.println("");
System.out.println("*****************************");
logger.info(loggerinfo);
return msg;
}
java 實(shí)現(xiàn)標(biāo)簽打印機(jī)打印
剛好我額項(xiàng)目中也要這個(gè)需求,還沒(méi)有很好的思路,可以參考如下這個(gè)內(nèi)容:
第三種方案利用word強(qiáng)大的排版、打印功能,把排版和打印的需求扔到word中,OA軟件要做的僅僅是讓數(shù)據(jù)導(dǎo)到word中去。JAVA讀取WORD模板,通過(guò)XML讀取相關(guān)的數(shù)據(jù)庫(kù)數(shù)據(jù),自動(dòng)轉(zhuǎn)載數(shù)據(jù)到WORD模板中,最終展現(xiàn)給客戶打印的是WORD。
通常,客戶的報(bào)表都有word格式,或政務(wù)OA中的紅頭文件,或院校OA中的獎(jiǎng)學(xué)金格式,大家習(xí)慣用word制定。在客戶提供的word格式中,制定標(biāo)簽,并且通過(guò)XML配置文件,把標(biāo)簽跟數(shù)據(jù)庫(kù)的內(nèi)容結(jié)合,達(dá)到自動(dòng)裝載數(shù)據(jù)又能保持原有word模板格式的效果
java怎樣實(shí)現(xiàn)打印出查詢后的結(jié)果
首先需確認(rèn)的是查詢出的結(jié)果是什么意思?
1、如果為列表且不能使用循環(huán)打印則可以將查詢出的結(jié)果反映到頁(yè)面上來(lái),通過(guò)頁(yè)面自身打印來(lái)實(shí)現(xiàn)
2、如果為基礎(chǔ)內(nèi)容,這里指的基礎(chǔ)內(nèi)容是基本的信息(比如:用戶名稱、性別等)則同樣可以反映到頁(yè)面上來(lái)打印。
另外這里提供兩種展現(xiàn)思路:
1、網(wǎng)頁(yè)打印,制作與word模板樣式相同的jsp頁(yè)面,通過(guò)網(wǎng)頁(yè)自帶的打印功能實(shí)現(xiàn),不過(guò)缺點(diǎn)是打印出的文檔與預(yù)計(jì)樣式有些差別(比如:頁(yè)眉頁(yè)腳)
2、使用控件,之前使用過(guò)卓正的office控件,可以自己設(shè)置打印模板,將查詢出的結(jié)果套在模板上,打印時(shí),利用word的打印功能進(jìn)行打印。
希望回答對(duì)你有幫助
關(guān)于java打印word模板和javaweb打印的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
掃描二維碼推送至手機(jī)訪問(wèn)。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處。