读书人

Java依据word模板生成word文档之后台解

发布时间: 2012-08-25 10:06:20 作者: rapoo

Java根据word模板生成word文档之后台解析和实现及部分代码(二)

? ? ? ?上一节贴出了web应用访问生成报告的action和service层的关键2个方法。并提到了调用了httpclient方法去执行报告服务器上的方法,从而返回数据流。下面主要是看报告服务器上的方法是怎么样的?

? ? ? ? 首先还是要说明一下,我们的web服务器都是linux环境,而之所以要用到httpclient和单独的报告服务器就是解决jacob不支持linux服务器的问题,所以将生成word报告的工作交给了报告服务器去做,这样无形也减轻了web应用服务器的压力,下面从httpclient反问开始:

如:httpclient的url如下:

? ??

[java] view plaincopy
  1. 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
  1. /**???*?获取文件流对象?
  2. ??*?@param?inputPath???*?@return?InputStream?文件流对象?
  3. ??*?@throws?Exception???*/??
  4. ?public?InputStream?getInputStream(){??????InputStream?inputStream?=?null;??
  5. ????Map<String,String>?paramMap?=?new?HashMap<String,String>();??????//获取模版类型??
  6. ????String?docType?=?Struts2Utils.getParameter("docType");??????Integer?docType_i?=?0;??
  7. ????if(CommonUtils.isNotNull(docType)){??????????docType_i?=?Integer.parseInt(docType);??
  8. ????}??????//获取用户id??
  9. ????String?userId?=?Struts2Utils.getParameter("userId");??????//MAP对象参数??
  10. ????String?projectId?=?Struts2Utils.getParameter("projectId");??????//获取参数MAP??
  11. ????paramMap.put("project_id",?projectId);??????//获取组组编号参数??
  12. ????String?workgroupId?=?Struts2Utils.getParameter("workgroupId");??????if(CommonUtils.isNotNull(workgroupId)?&&?!workgroupId.equals("null")){??
  13. ????????paramMap.put("workgroupId",?workgroupId);??????}??
  14. ????//获取评估用例实例ID参数??????String?evtcaseInstId?=?Struts2Utils.getParameter("evtcaseInstId");??
  15. ????if(CommonUtils.isNotNull(evtcaseInstId)){??????????paramMap.put("evtcase_inst_id",?evtcaseInstId);??
  16. ????}????????
  17. ????if(CommonUtils.isNotNull(userId)){??????????paramMap.put("userId",?userId);??
  18. ????}??????//获取模版路径??
  19. ????String?xmlTempUrl?=?xmlPathDef.getXmlPath(docType);????????
  20. ????//设置打开word模版路径??????String?docPath?=?"";??
  21. ????//取得对应的模版路径??????TTemplIdx?templIdx?=?templIdxService.findFileByType(Integer.parseInt(XmlPathDef.TEMPL_IDX_1),Integer.parseInt(docType));??
  22. ????if(templIdx?!=?null){??????????docPath?=?xmlPathDef.getPath(XmlPathDef.getBasePath()?+?templIdx.getTemplFileName());??
  23. ????????try?{??????????????String?outPath?=?infoSystemDescService.showWordRp(xmlTempUrl,?docType_i,?paramMap,?docPath);??
  24. ????????????if(CommonUtils.isNotNull(outPath)){??????????????????inputStream?=?ServletActionContext.getServletContext().getResourceAsStream(xmlPathDef.getRealRepPath(outPath,projectId,docType,workgroupId));??
  25. ????????????}??????????}?catch?(Exception?e)?{??
  26. ????????????logger.error("没有创建成功");??????????????e.printStackTrace();??
  27. ????????}??????}??
  28. ????return?inputStream;????}??

?

主要是调用了service层的方法,这里主要也是传入了相关的参数和取得了word报告模板路径,创建word文档,然后返回流文件。

?

然后再看service层方法:

[java] view plaincopy
  1. /**????????*?生成报告(doc文档)?
  2. ???????*?@param??xmlTempUrl?模版路径????????*?@param??docType??要生成的报告类型?
  3. ???????*?@param??paramMap??报告参数????????*?@param??webName??要展示的报告名称?
  4. ???????*?@param??filename???报告文件名称????????*?@param??docId???报告文件主键?
  5. ???????*?@param??version??报告文件版本????????*?@param??docPath??报告路径?
  6. ???????*?@param??outRepPath??报告生成的路径????????*?@return?
  7. ???????*?@throws?Exception??????*/??
  8. ????public?String?showWordRp(String?xmlTempUrl,Integer?docType,Map<String,String>?paramMap,String?docPath)?throws?Exception?{??????????boolean?boo=?true;??
  9. ????????String?outRepPath?=?"";??????????try?{??
  10. ????????????Long?projectId?=?0l;??????????????Long?workgroupId?=0l;??
  11. ????????????String?evtcaseInstId?="";??????????????String?userId?="";??
  12. ????????????Set<Entry<String,?String>>?sets?=?paramMap.entrySet();??????????????Iterator<Entry<String,?String>>?it?=?sets.iterator();??
  13. ????????????while?(it.hasNext())?{??????????????????Map.Entry<String,String>?entry?=?(Map.Entry<String,String>)?it.next();??
  14. ????????????????String?key?=?entry.getKey();??????????????????if(key.equals("project_id")){??
  15. ????????????????????projectId?=??Long.parseLong(entry.getValue().toString());??????????????????}else?if(key.equals("workgroupId")){??
  16. ????????????????????workgroupId?=??Long.parseLong(entry.getValue().toString());??????????????????}else?if(key.equals("evtcase_inst_id")){??
  17. ????????????????????evtcaseInstId?=??entry.getValue();??????????????????}else?if(key.equals("userId")){??
  18. ????????????????????userId?=??entry.getValue();??????????????????}??
  19. ????????????}????????????????
  20. ????????????????????//获取Web项目名称??????????????//String?webName?=?XmlPathDef.getWebName();??
  21. ?????????????????????//获取文档表的最大主键值??????????????String?docId?=?this.getMaxDocId(docType,?workgroupId.toString(),projectId.toString());??
  22. ????????????//获取最大版本??????????????String?version?=?this.getMaxVersion(userId,?docType,?projectId,?workgroupId.toString(),?evtcaseInstId);??
  23. ????????????//获取生成后的文档名称??????????????String?filename?=?this.getFileName(docType,?projectId,docId,version);??
  24. ?????????????????//获取生成后的文档路径??????????????outRepPath?=?xmlPathDef.getPath(xmlPathDef.getCreatWordPath(userId,?docType.toString(),?projectId.toString(),workgroupId.toString())?+?filename);??
  25. ??????????????????????????//取得标签所对应的所有Map值??
  26. ????????????HashMap<String,Object>?map?=?this.getAllData(xmlTempUrl,?paramMap,docType.toString());??????????????//省去了相关的业务操作..............??
  27. ?????????????????????????????try?{??
  28. ????????????????System.out.println("?**************************报告类型为?--->?docType:?"+?docType);??????????????????Export2WordService?export2WordService?=?new?Export2WordService();??
  29. ????????????????//System.out.println("***************??开始调用?export2Word?方法????**********?执行到InfoSystemDescService类?");??????????????????boo?=?export2WordService.export2Word(docPath,outRepPath,map,docType.toString(),tbmap,tbvalue,testMap0,projectId,collect_feedback_auditValueMap,sccDatas,contentMap,sccContentMap,proEvtType);??
  30. ????????????????//System.out.println("***************??调用?export2Word?完毕方法???开始去向数据库中添加数据???**********?执行到InfoSystemDescService类?");??????????????????if(boo){//说明创建报告成功,然后保存到数据库??
  31. ????????????????????if(CommonUtils.isNotNull(docId)){??????????????????????????//生成后的word文档对象??
  32. ????????????????????????TProjDoc?doc?=?new?TProjDoc();??????????????????????????//设置需要保存的参数??
  33. ????????????????????????doc.setDocId(docId);??????????????????????????doc.setDispName(repName);??
  34. ????????????????????????doc.setFilename(filename);??????????????????????????doc.setPath(xmlPathDef.getRealRepPath(outRepPath,projectId.toString(),docType.toString(),workgroupId.toString()));//对应数据库中的相对路径??
  35. ????????????????????????doc.setType(docType);??????????????????????????doc.setVersion(Integer.parseInt(version));??
  36. ????????????????????????doc.setCreateTime(new?Timestamp(System.currentTimeMillis()));??????????????????????????doc.setSuffix(Short.parseShort("2"));??
  37. ????????????????????????TProject?proj?=?new?TProject();??????????????????????????proj.setProjectId(projectId);??
  38. ????????????????????????doc.setTProject(proj);??????????????????????????doc.setUserId(userId);??
  39. ????????????????????????doc.setWorkgroupId(workgroupId);??????????????????????????doc.setEvtcaseInstId(evtcaseInstId);??
  40. ????????????????????????projDocDao.save(doc);????????????????????????????
  41. ???????????????????????}??????????????????????}else{??
  42. ????????????????????????//如果没有创建成功就删除原来的文件??????????????????????????File?file?=?new?File(outRepPath);??
  43. ????????????????????????file.delete();????????????????????}??
  44. ????????????}?catch?(Exception?e)?{??????????????????logger.error("创建?Word.Application?失败!"?+?e.getMessage());????
  45. ????????????}????????????????
  46. ????????}?catch?(Exception?e)?{??????????????logger.error("创建报告失败!"?+?e.getMessage());????
  47. ????????????e.printStackTrace();?????????????}??
  48. ????????return?outRepPath;??????}??

?

这里主要:

1.调用工具类来解析XML定义文档,并获取到数据集Map

2.调用jacob的封装类,根据相关的数据集生成word报告

3,一旦word穿件成功,就往数据库中写入一条记录

?

读书人网 >编程

热点推荐