Java依据word模板生成word文档之后台解析和实现及部分代码(二)
Java根据word模板生成word文档之后台解析和实现及部分代码(二)? ? ? ?上一节贴出了web应用访问生成报告的a
Java根据word模板生成word文档之后台解析和实现及部分代码(二)
? ? ? ?上一节贴出了web应用访问生成报告的action和service层的关键2个方法。并提到了调用了httpclient方法去执行报告服务器上的方法,从而返回数据流。下面主要是看报告服务器上的方法是怎么样的?
? ? ? ? 首先还是要说明一下,我们的web服务器都是linux环境,而之所以要用到httpclient和单独的报告服务器就是解决jacob不支持linux服务器的问题,所以将生成word报告的工作交给了报告服务器去做,这样无形也减轻了web应用服务器的压力,下面从httpclient·反问开始:
如:httpclient·的url如下:
? ??
[java] view plaincopy
- String?url?=?"http://"?+?this.getRepIpUrl()?+?"/infoDisposal/<span?style="color:?rgb(51,?51,?51);?font-family:?Arial;?font-size:?14px;?line-height:?26px;?">creatdocrep</span>.action?docType="?+?docType?+?"&projectId="?+?projectId?+?"&userId="?+?userId?+?"&workgroupId="?+?workgroupId?+?"&evtcaseInstId="?+?evtcaseInstId;??
?
注:这里可以使用https也是可以的,看项目需要怎么配置
然后我跟着这个地址找到了报告服务器上的类和方法:
找到了creatDocRep.action
其方法如下:
[java] view plaincopy
- /**???*?获取文件流对象?
- ??*?@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层方法:
[java] view plaincopy
- /**????????*?生成报告(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穿件成功,就往数据库中写入一条记录
?