`
long_yu2
  • 浏览: 311749 次
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

        后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换。首先想多说一句就是 jacob会每次生成word报告时都会启动一个office word进程,替换完毕之后 需要关闭掉这个进程,如果有死掉的word进程有可能会影响word的生成。这些具体做火这调试过程中就会发现这个问题的。

        还需要说明一点,解析XML有很多种方式,自己挑选自己熟悉的就行了,我采用jdom,当时想的没有这么负责,所以写代码也没有怎么重构,需要重新整理,主要方法我会贴出来。

       那么我就从头到尾的说一下,调用生成报告时,后台的整个调用过程是怎么样的,是如何运转的?

       首先访问web应用地址:http://192.16.3.22/demo/DocInfo!createDoc.action 这样我提交一个方法 action方法,这个方法首先是在web应用服务器上的,然后进入action中的createDoc方法,同时你需要获取到从方法传过来的相关参数, 比如:sql中定义的那个查询条件,报告类型等参数。

 (在去调用生成报告的方法中,可能你还需要加入一些判断,如是否已经生成过报告啊,或者最新报告的版本啊,因为我们都是既保存word报告文档又会在数据库中插入一条记录,方便查询),这样就开始了:

首先是action的createDoc方法:

[java] view plain copy
  1. /**  
  2.      * 通过HttpCient调用报告服务器的方法生成报告 DOC  
  3.      */   
  4.     public  String createDoc()  throws  Exception {  
  5.                  //定义放回成功与否的判断码   
  6.                  String prMsg="" ;  
  7.          // 获取当前登录的用户   
  8.          UserVo userVo = CommonUtils.getUserMessage();  
  9.          //获取模版类型   
  10.          docType = Struts2Utils.getParameter("docType" );  
  11.          //重新创建文档   
  12.          String creatOrnot = Struts2Utils.getParameter("creatOrnot" );  
  13.          //获取组组编号参数   
  14.          workgroupId = Struts2Utils.getParameter("workgroupId" );  
  15.          //获取评估用例实例ID参数   
  16.          evtcaseInstId = Struts2Utils.getParameter("evtcaseInstId" );  
  17.         if (CommonUtils.isNotNull(docType)){  
  18.             //获取项目Id   
  19.              projectId = Struts2Utils.getParameter("projectId" );  
  20.             if (!CommonUtils.isNotNull(projectId)){  
  21.                 if (CommonUtils.isNotNull( this .getIdFromSession( "PM_PROJECTID" ))){  
  22.                     projectId = this .getIdFromSession( "PM_PROJECTID" ).toString();  
  23.                 }else {  
  24.                     Struts2Utils.getRequest().setAttribute("msg" "请先选择项目!" );  
  25.                 }  
  26.             }  
  27.             if (CommonUtils.isNotNull(projectId)){  
  28.                 prMsg = infoSystemDescService.downloadFileByUrl(projectId, userVo.getUserId(), workgroupId, evtcaseInstId, docType, creatOrnot);  
  29.             }  
  30.         }  
  31.         return   "docList" ;  
  32.     }  


      注:在我贴出来的代码中,能看懂就行了,有些不用管他(可能是其他业务方面的判断),关于最后返回的prMsg---代表各种状态 主要表示成功与否或者是出错的信息。


   接着我贴出service层的方法downloadFileByUrl    

 

[java] view plain copy
  1. </pre><p></p><p></p><pre name= "code"   class = "java" ><pre name= "code"   class = "java" > /**  
  2.      * 功能:  
  3.      * 1.(生成报告文档)  
  4.      * 2.保存指定URL的源文件到指定路径下    
  5.      * @param projectId  
  6.      * @param userId  
  7.      * @param workgroupId  
  8.      * @param evtcaseInstId  
  9.      * @param docType  
  10.      * @param creatOrnot  
  11.      * @return  
  12.      * @throws Exception  
  13.      */   
  14.     @SuppressWarnings ( "deprecation" )  
  15.     public   synchronized  String downloadFileByUrl(String projectId,String userId,String workgroupId,String evtcaseInstId,String docType,String creatOrnot)  throws  Exception {     
  16.         String msg = "1" ; //"1":默认为创建成功的提示信息 "2":标识创建失败   
  17.         String srcUrl = "" ;   //报告服务器的执行路径   
  18.         HttpResponse response = null ;     
  19.         FileOutputStream out = null ;   
  20.         HttpClient httpclient = null ;  
  21.         HttpGet httpget = null ;  
  22.         long  time1 = System.currentTimeMillis();  
  23.         //获取保存后的路径    
  24.         TProjDoc projDoc = projectDocDao.findFileByType(userId, Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);  
  25.         if (projDoc ==  null  || (projDoc !=  null  && CommonUtils.isNotNull(creatOrnot) && creatOrnot.equals( "1" ))){    //FT_任务编号_[FID]   
  26.              try  {      
  27.                  //获取报告服务器的执行路径   
  28.                     srcUrl = xmlPathDef.getActionUrl(docType, projectId,userId,workgroupId,evtcaseInstId);  
  29.                      
  30.                     HttpParams httpParams = new  BasicHttpParams();   
  31.                     // 设置最大连接数     
  32.                     ConnManagerParams.setMaxTotalConnections(httpParams, 1 );    
  33.                     // 设置获取连接的最大等待时间     
  34.                     //ConnManagerParams.setTimeout(httpParams, 6000);   
  35.                     // 设置每个路由最大连接数     
  36.                     ConnPerRouteBean connPerRoute = new  ConnPerRouteBean( 1 );    
  37.                     ConnManagerParams.setMaxConnectionsPerRoute(httpParams,connPerRoute);   
  38.                     // 设置连接超时时间     
  39.                     HttpConnectionParams.setConnectionTimeout(httpParams, 6000 );    
  40.                     // 设置读取超时时间     
  41.                     if (docType.toString().equals(XmlPathDef.SPOTTEST_DOC) && docType.toString().equals(XmlPathDef.FTEST_DOC)){  
  42.                         HttpConnectionParams.setSoTimeout(httpParams, 2400000 );    
  43.                     }else {  
  44.                         HttpConnectionParams.setSoTimeout(httpParams, 600000 );  
  45.                     }  
  46.                       
  47.                       
  48.                     SchemeRegistry registry = new  SchemeRegistry();    
  49.                     registry.register(new  Scheme( "http" , PlainSocketFactory.getSocketFactory(),  80 ));    
  50.                     registry.register(new  Scheme( "https" , SSLSocketFactory.getSocketFactory(),  443 ));    
  51.                       
  52.                     ClientConnectionManager connectionManager = new  ThreadSafeClientConnManager(httpParams, registry);   
  53.                       
  54.                     httpclient = new  DefaultHttpClient(connectionManager, httpParams);    
  55.                       
  56.                     httpget = new  HttpGet(srcUrl);    
  57.                     //执行返回   
  58.                     response = httpclient.execute(httpget);  
  59.                     //如果是本机既当服务器,又当报表服务器,那么就只生成一遍   
  60.                     String ipvalues = xmlPathDef.getRepUrl();  
  61.                     if (CommonUtils.isNotNull(ipvalues)){  
  62.                         if (ipvalues.indexOf( ":" ) != - 1 ){  
  63.                             ipvalues = ipvalues.substring(0 ,ipvalues.lastIndexOf( ":" ));  
  64.                         }  
  65.                     }  
  66.                     HttpEntity entity = response.getEntity();  
  67.                                 //获取保存后的路径    
  68.                                 projDoc = projectDocDao.findFileByType(userId,Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);  
  69.                                 String filePath = "" ;  
  70.                                 if (projDoc !=  null )  
  71.                                     filePath = projDoc.getPath();  
  72.                                 if (CommonUtils.isNotNull(filePath)){  
  73.                                     String basepath = XmlPathDef.getBasePath();  
  74.                                     String outFilePath = (basepath + filePath).replaceAll("\\\\", " \\/");  
  75.                                     XmlPathDef.isExists(outFilePath);  
  76.                                     File wdFile = new  File(outFilePath);   
  77.                                     out = new  FileOutputStream(wdFile);  
  78.                                     int  l;     
  79.                                     byte [] tmp =  new   byte [ 2048 ];     
  80.                                     while  ((l = instream.read(tmp)) != - 1 ) {    
  81.                                         out.write(tmp, 0 , l);     
  82.                                       }     
  83.                                     out.flush();  
  84.                                     out.close();   
  85.                                    System.out.println("****************************** " );  
  86.                                    System.out.println("" );  
  87.                                    System.out.println("*************** 恭喜! 报告创建成功   结束   ***************" );  
  88.                                    System.out.println("" );  
  89.                                 }else {  
  90.                                     msg = "8" ; //说明word创建成功,但是数据没有保存成功   
  91.                                     response = null ;  
  92.                                 }  
  93.                         }else {  
  94.                             msg = "2" ;  
  95.                       }  
  96.                 } catch  (ClientProtocolException e) {     
  97.                     msg = "7" ;  
  98.                     e.printStackTrace();     
  99.                 } catch  (IOException e) {  
  100.                     msg = "7" ;  
  101.                     logger.error("数据库报告服务器地址配置错误或网络不通!!2.连接是否超时"  + e.getMessage());    
  102.                     e.printStackTrace();     
  103.                 }finally {     
  104.                     if (out!= null ){     
  105.                         try  {     
  106.                             out.close();    
  107.                         } catch  (IOException e) {     
  108.                             msg = "7" ;  
  109.                             logger.error("数据库报告服务器地址配置错误或网络不通!!2.连接是否超时"  + e.getMessage());    
  110.                             e.printStackTrace();     
  111.                         }     
  112.                       }   
  113.                       
  114.             }  
  115.         }  
  116.         long  time2 = System.currentTimeMillis();  
  117.         long  numTime = time2 - time1;  
  118.         if (docType.toString().equals(XmlPathDef.SPOTTEST_DOC) && docType.toString().equals(XmlPathDef.FTEST_DOC)){  
  119.             if (numTime >=  2401000 ){  
  120.                 msg = "9" ;  
  121.                   
  122.             }  
  123.         }else {  
  124.             if (numTime >=  601000 ){  
  125.                 msg = "9" ;  
  126.             }  
  127.         }  
  128.         System.out.println("" );   
  129.         String loggerinfo = "********* 报告类型为 :"  +  docType +  " 执行时间为: "  + (time2 - time1) / 1000   +  " 秒!***************" ;  
  130.         System.out.println(loggerinfo);   
  131.         System.out.println("" );   
  132.         System.out.println("*****************************" );   
  133.         logger.info(loggerinfo);  
  134.         return  msg;  
  135.     }   


这个方法还有待优化和调整,现在我主要说明他的作用:

首先 使用了synchronized 关键字 意思说使用同步的方式,让每次只有一个线程运行这个方法(其实如果是大数量的并发,就不能这样写了,自己去摸索吧)。然后在方法体中,使用了一个 httpclient技术,这个主要是调用远程的服务返回对象流,在我这里就是调用另外一个服务器的代码,去生成报告,

然后 将word报告的流返回来就ok,如果不明白httpclient的用法,请上网学一下,具体我就不说了。(下节我会贴出相应的代码

最后 通过httpclient的返回流写成word文档就行了(其实里面还有一些判断什么的,比如:最后返回流是否是word流啊,什么的 都需要判断的,我都去掉了,代码太多),返回一个状态码给action就完毕。

分享到:
评论

相关推荐

    java XML解析方式实现自动生成word文档

    java XML解析方式实现自动生成word文档,文档中主要描述word模板的使用方法,文件中带有案例代码,可以方便理解

    freemarker模板技术生成复杂word文档---解决了编码问题

    3.写java程序根据模板生成word 总结,之前在网上查到这个资料怎么调试都失败,后来经过反复查找发现是编码问题导致生成word格式错误,已经修正,希望能给大家带来帮助。 效率测试生成100000行数据大概4000毫秒...

    完美解决方案:Java生成复杂Word文档

     POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。  iText操作...

    使用freemarker生成word文档,源代码+jar包+说明文档及注意事项

    资料附有Java源代码和自己总结的使用说明及注意事项 大至预览如下: 1、用word编辑好模板 普通字符串替换为 ${string} 表格循环用标签 姓名:${user.userName} , 性别:${user.sex} 2、将word模板另存为xml...

    使用Java-freemarker生成word文档.doc

    先创建一个word文档,按照需求在word中填好一个模板,然后将文档保存为xml文档格式,使用文档编辑器打开这个xml格式的文档(这里直接使用eclipse自带的编辑工具),把对应的数据换成变量${xxx},使用Freemarker读取...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    freemarker生成复杂word

    在Web应用中,有时需要按照固定的模板将数据导出到Word,如流程审批单,在流程处理完成后将处理过程按照流程单的要求导出,有时程序中需要实现生成标准Word文档,要求能够打印,并且保持页面样式不变,常见的方案有...

    aspose.words table 多行单元格合并

    aspose.words 控件可以方便的出来word文档,通过在word模板中定义书签,可以在指定的位置插入内容,如果需要在word中插入表格,并且表格中含有多行行头,需要合并单元时,就稍微麻烦一些,必须要注意设置单元格的...

    java开源包5

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包8

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包10

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    word转pdf、word导出、pdf加水印

    1、使用freemaker对模板解析填充数据导出word文档的功能 2、实现使用itext对word转pdf功能 3、实现了对pdf加水印功能

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包6

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包9

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包101

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics