Java根據word模板生成word文檔之後臺解析和實現及部分代碼(二)

       上一節貼出了web應用訪問生成報告的action和service層的關鍵2個方法。並提到了調用了httpclient方法去執行報告服務器上的方法,從而返回數據流。下面主要是看報告服務器上的方法是怎麼樣的?

        首先還是要說明一下,我們的web服務器都是linux環境,而之所以要用到httpclient和單獨的報告服務器就是解決jacob不支持linux服務器的問題,所以將生成word報告的工作交給了報告服務器去做,這樣無形也減輕了web應用服務器的壓力,下面從httpclient·反問開始:

如:httpclient·的url如下:

    

String url = "http://" + this.getRepIpUrl() + "/infoDisposal/creatdocrep.action?docType=" + docType + "&projectId=" + projectId + "&userId=" + userId + "&workgroupId=" + workgroupId + "&evtcaseInstId=" + evtcaseInstId;

注:這裏可以使用https也是可以的,看項目需要怎麼配置


然後我跟着這個地址找到了報告服務器上的類和方法:

找到了creatDocRep.action

其方法如下:

 /**
	  * 獲取文件流對象
	  * @param inputPath
	  * @return InputStream 文件流對象
	  * @throws Exception
	  */
	 public InputStream getInputStream(){
		InputStream inputStream = null;
		Map<String,String> paramMap = new HashMap<String,String>();
		//獲取模版類型
		String docType = Struts2Utils.getParameter("docType");
		Integer docType_i = 0;
		if(CommonUtils.isNotNull(docType)){
			docType_i = Integer.parseInt(docType);
		}
		//獲取用戶id
		String userId = Struts2Utils.getParameter("userId");
		//MAP對象參數
		String projectId = Struts2Utils.getParameter("projectId");
		//獲取參數MAP
		paramMap.put("project_id", projectId);
		//獲取組組編號參數
		String workgroupId = Struts2Utils.getParameter("workgroupId");
		if(CommonUtils.isNotNull(workgroupId) && !workgroupId.equals("null")){
			paramMap.put("workgroupId", workgroupId);
		}
		//獲取評估用例實例ID參數
		String evtcaseInstId = Struts2Utils.getParameter("evtcaseInstId");
		if(CommonUtils.isNotNull(evtcaseInstId)){
			paramMap.put("evtcase_inst_id", evtcaseInstId);
		}
		
		if(CommonUtils.isNotNull(userId)){
			paramMap.put("userId", userId);
		}
		//獲取模版路徑
		String xmlTempUrl = xmlPathDef.getXmlPath(docType);
		
		//設置打開word模版路徑
		String docPath = "";
		//取得對應的模版路徑
		TTemplIdx templIdx = templIdxService.findFileByType(Integer.parseInt(XmlPathDef.TEMPL_IDX_1),Integer.parseInt(docType));
		if(templIdx != null){
			docPath = xmlPathDef.getPath(XmlPathDef.getBasePath() + templIdx.getTemplFileName());
			try {
				String outPath = infoSystemDescService.showWordRp(xmlTempUrl, docType_i, paramMap, docPath);
				if(CommonUtils.isNotNull(outPath)){
					inputStream = ServletActionContext.getServletContext().getResourceAsStream(xmlPathDef.getRealRepPath(outPath,projectId,docType,workgroupId));
				}
			} catch (Exception e) {
				logger.error("沒有創建成功");
				e.printStackTrace();
			}
		}
		return inputStream;
	  }


主要是調用了service層的方法,這裏主要也是傳入了相關的參數和取得了word報告模板路徑,創建word文檔,然後返回流文件。


然後再看service層方法:

/**
	   * 生成報告(doc文檔)
	   * @param  xmlTempUrl 模版路徑
	   * @param  docType  要生成的報告類型
	   * @param  paramMap  報告參數
	   * @param  webName  要展示的報告名稱
	   * @param  filename   報告文件名稱
	   * @param  docId   報告文件主鍵
	   * @param  version  報告文件版本
	   * @param  docPath  報告路徑
	   * @param  outRepPath  報告生成的路徑
	   * @return
	   * @throws Exception
	 */
	public String showWordRp(String xmlTempUrl,Integer docType,Map<String,String> paramMap,String docPath) throws Exception {
		boolean boo= true;
		String outRepPath = "";
		try {
		    Long projectId = 0l;
		    Long workgroupId =0l;
		    String evtcaseInstId ="";
		    String userId ="";
		    Set<Entry<String, String>> sets = paramMap.entrySet();
		    Iterator<Entry<String, String>> it = sets.iterator();
	        while (it.hasNext()) {
	            Map.Entry<String,String> entry = (Map.Entry<String,String>) it.next();
	            String key = entry.getKey();
	            if(key.equals("project_id")){
	            	projectId =  Long.parseLong(entry.getValue().toString());
	            }else if(key.equals("workgroupId")){
	            	workgroupId =  Long.parseLong(entry.getValue().toString());
	            }else if(key.equals("evtcase_inst_id")){
	            	evtcaseInstId =  entry.getValue();
	            }else if(key.equals("userId")){
	            	userId =  entry.getValue();
	            }
		    }
	        
	                //獲取Web項目名稱
			//String webName = XmlPathDef.getWebName();
	                 //獲取文檔表的最大主鍵值
			String docId = this.getMaxDocId(docType, workgroupId.toString(),projectId.toString());
			//獲取最大版本
			String version = this.getMaxVersion(userId, docType, projectId, workgroupId.toString(), evtcaseInstId);
			//獲取生成後的文檔名稱
			String filename = this.getFileName(docType, projectId,docId,version);
		         //獲取生成後的文檔路徑
			outRepPath = xmlPathDef.getPath(xmlPathDef.getCreatWordPath(userId, docType.toString(), projectId.toString(),workgroupId.toString()) + filename);
	        
			//取得標籤所對應的所有Map值
			HashMap<String,Object> map = this.getAllData(xmlTempUrl, paramMap,docType.toString());
			//省去了相關的業務操作..............
		       
			try {
				System.out.println(" **************************報告類型爲 ---> docType: "+ docType);
				Export2WordService export2WordService = new Export2WordService();
				//System.out.println("***************  開始調用 export2Word 方法    ********** 執行到InfoSystemDescService類 ");
				boo = export2WordService.export2Word(docPath,outRepPath,map,docType.toString(),tbmap,tbvalue,testMap0,projectId,collect_feedback_auditValueMap,sccDatas,contentMap,sccContentMap,proEvtType);
				//System.out.println("***************  調用 export2Word 完畢方法   開始去向數據庫中添加數據   ********** 執行到InfoSystemDescService類 ");
				if(boo){//說明創建報告成功,然後保存到數據庫
					if(CommonUtils.isNotNull(docId)){
						//生成後的word文檔對象
						TProjDoc doc = new TProjDoc();
						//設置需要保存的參數
						doc.setDocId(docId);
						doc.setDispName(repName);
						doc.setFilename(filename);
						doc.setPath(xmlPathDef.getRealRepPath(outRepPath,projectId.toString(),docType.toString(),workgroupId.toString()));//對應數據庫中的相對路徑
						doc.setType(docType);
						doc.setVersion(Integer.parseInt(version));
						doc.setCreateTime(new Timestamp(System.currentTimeMillis()));
						doc.setSuffix(Short.parseShort("2"));
						TProject proj = new TProject();
						proj.setProjectId(projectId);
						doc.setTProject(proj);
						doc.setUserId(userId);
						doc.setWorkgroupId(workgroupId);
						doc.setEvtcaseInstId(evtcaseInstId);
						projDocDao.save(doc);
						
					   }
					}else{
						//如果沒有創建成功就刪除原來的文件
						File file = new File(outRepPath);
						file.delete();	
				}
			} catch (Exception e) {
				logger.error("創建 Word.Application 失敗!" + e.getMessage());  
			}
			
		} catch (Exception e) {
			logger.error("創建報告失敗!" + e.getMessage());  
			e.printStackTrace();   
		}
		return outRepPath;
	}


這裏主要:

1.調用工具類來解析XML定義文檔,並獲取到數據集Map

2.調用jacob的封裝類,根據相關的數據集生成word報告

3,一旦word穿件成功,就往數據庫中寫入一條記錄


未完待續



發佈了36 篇原創文章 · 獲贊 18 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章