Jira数据导出,Java写mpp文件

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介:

        1.       JIRA上读取数据。

2.       读写MSProject文件。

 

JIRA上读取数据,主要有两种方法:

方法一 采用HTTPClient的方法来抓取页面数据(JIRA3.*.*的建议采用这种方法),

         具体实现过程中,首先必须让JIRA站点能够允许匿名查看项目的问题.

         另外不要知道每个项目 版本对应的pidfixfor.

         使用httpclient访问的时候,使用这个路径比较好:

#获得所有Issue的页面

JIRA_ISSUE_FULLCONTENT={domain}/sr/jira.issueviews:searchrequest-fullcontent/temp/SearchRequest.html?pid={pid}&fixfor={fixfor}&resolution=-1&sorter/field=priority&sorter/order=DESC&tempMax=10000

 

      在这个页面中,可以一次性获取问题的issueKey, summarydesc.

   一般获取这个页面源代码之后,可以通过这些正则表达式:

 


 
 
  1. // 获取问题的issueKey <h3 class="formtitle">[SANDBOX-1]&nbsp; 
  2.     final static Pattern ISSUE_KEY_PATTERN = Pattern.compile( 
  3.             "<h3 class=\"formtitle\">(\\s)+\\[(?s).*?&", Pattern.CANON_EQ); 
  4.  
  5.     // 获得问题的Summary <a 
  6.     // href="http://jira.taobao.ali.com/browse/SANDBOX-1">TimeoutThread或Thread.setTimeout</a> 
  7.     final static Pattern ISSUE_SUMMARY_PATTERN = Pattern.compile( 
  8.             "<h3 class=\"formtitle\">(\\s)+\\[(?s).*?&nbsp;<a href=\"" 
  9.                     + JpContext.jiraDomain 
  10.                     + "/browse/(\\S)+(-)([0-9])+\">(?s).*?</a>"
  11.             Pattern.CANON_EQ); 
  12.  
  13.     // 获取问题的描述<div id="description_full">......</div> 
  14.     final static Pattern ISSUE_DESC_PATTERN = Pattern.compile( 
  15.             "<td id=\"descriptionArea\">(?s).*?</td>", Pattern.CANON_EQ); 
  16.  
  17.     // 获取问题的fixversion <b>修复版本:...........</tr> 
  18.     final static Pattern ISSUE_FIXVERSION_PATTERN = Pattern.compile( 
  19.             "<b>修复版本(?s).*?</tr>", Pattern.CANON_EQ); 

 获得issueKey之后,就可以进行子任务的获取了,具体获取方法,


 
 
  1. #获得指定issueKey的问题的所有子任务 
  2. JIRA_ISSUESUB_URL={domain}/browse/{issueKey} 

 方法二.通过JIRA提供的API进行相应问题的获取,这种途径只能在JIRA4.0.0及以上版本中可以使用.

 

 使用JIRA的soap客户端来获取jira站点上的所有问题的方法:

首先要实例出一个soap对象


  
  
  1. SOAPSession soapSession = new SOAPSession(new URL(baseUrl)); 
  2. soapSession.getJiraSoapService();

这个SOAPSession其实是帮我们封装了com.atlassian.jira.rpc.soap.service中的一些类。

获取所有的issue 

 


  
  
  1. SearchSoapExerciser se = new SearchSoapExerciser(soapSession); 
  2.  
  3.             // 存储所有问题 
  4.  
  5.             /** 遍历所有的issues */ 
  6.             try { 
  7.                 for (RemoteIssue ri : se.testJqlSearch(""10)) { 

遍历后就可以得到所有RemoteIssue对象了。

完整代码在附件中  

查看jira的api http://docs.atlassian.com/software/jira/docs/api/rpc-jira-plugin/

 接下去看看将问题下载到本地后,如何处理这些问题及其和子任务.

由于要将问题导入到msproject中进行管理,那么必然要进行java操作msproject文件的过程.

java操作msproject文件方面,已经有一个很好的开源包了,http://mpxj.sourceforge.net/index.html, 这个包唯一的不足之处是他能够读取msproject文件*.mpp中的内容,但是在写方面,他只能通过*.xml作为中间过渡.

     读mpp文件

  • net.sf.mpxj.mpp.MPPReader: reads Microsoft Project MPP files
  • net.sf.mpxj.mpx.MPXReader: reads Microsoft MPX files
  • net.sf.mpxj.mspdi.MSPDIReader: reads Microsoft MSPDI (XML) files
  • net.sf.mpxj.mpd.MPDIReader: reads Microsoft MPD files
  • net.sf.mpxj.planner.PlannerReader: reads Planner (XML) files

    写:

  • net.sf.mpxj.mpx.MPXWriter: writes Microsoft MPX files
  • net.sf.mpxj.mspdi.MSPDIWriter: writes Microsoft MSPDI (XML) files
  • net.sf.mpxj.planner.PlannerWriter: writes Planner (XML) files

 

 

一般的做法就是这样:

通过net.sf.mpxj.mpp.MPPReader: reads Microsoft Project MPP files来读取msproject文件内容

通过net.sf.mpxj.mspdi.MSPDIWriter: writes Microsoft MSPDI (XML) files生成一个msproject支持的文件,

 


 
 
  1. package com.test; 
  2.  
  3. import java.io.IOException; 
  4. import net.sf.mpxj.MPXJException; 
  5. import net.sf.mpxj.ProjectFile; 
  6. import net.sf.mpxj.mpp.MPPReader; 
  7. import net.sf.mpxj.mspdi.MSPDIWriter; 
  8. import net.sf.mpxj.reader.ProjectReader; 
  9. import net.sf.mpxj.writer.ProjectWriter; 
  10. public class Test{ 
  11.     public static void main(String[] args)throws Exception{ 
  12.         ProjectReader reader = new MPPReader(); 
  13.         ProjectFile project; 
  14.         try { 
  15.             project = reader.read("d:\\native.mpp"); 
  16.             //生成文件 
  17.             ProjectWriter writer = new MSPDIWriter(); 
  18.             try
  19.                 writer.write(project, "d:\\test.xml"); 
  20.             }catch(IOException ioe){ 
  21.                 throw ioe; 
  22.             } 
  23.         } catch (MPXJException mpxje) { 
  24.             throw mpxje; 
  25.         } catch (Exception e) { 
  26.             e.printStackTrace(); 
  27.         } 
  28.     } 

 

     这种做法的结果是:每次用project打开这个xml文件时候,都会进行一次导入向导:

每次导入的打开的时候.....

 

很显然,这样的做法用户体验相当差   这里推荐一种使用Java写mpp文件的做法

方法来源:

http://sourceforge.net/projects/jawinproject/

http://msdn.microsoft.com/en-us/library/bb244274(v=office.12).aspx

 

利用jawin可以进行windows的com组件调用, 利用Project Object Model Reference 可以生成一个msproject 支持的文件.  这样就可以通过Java写*.mpp文件了

具体做法如下:


 
 
  1. //实例一个app,这个app可以想象成是一个ms project的应用程序 
  2.             /**这里要指明的一点的是,使用这种方法生成*.mpp文件的前提是你的电脑上必须安装有msproject这个软件*/ 
  3.             app = new DispatchPtr("MSProject.Application"); 

 
 
  1. /**从这个链接中可以发现app有个成员是http://msdn.microsoft.com/en-us/library/bb236984(v=office.12).aspx*/ 
  2.             DispatchPtr projects = (DispatchPtr) app.get("Projects"); 

 

接下去,ms 官方给我们的提示是:

http://msdn.microsoft.com/en-us/library/bb214615(v=office.12).aspx

 

Use the Add method to add a Project object to the Projects collection. The following example creates a new project without prompting for project information. 

 由于实例出com组件的对象,通过jawin帮我们封装好的反射来


 
 
  1. /**从这个链接中可以发现http://msdn.microsoft.com/en-us/library/bb214615(v=office.12).aspx*/ 
  2.             DispatchPtr project = (DispatchPtr) projects.invoke("Add"); 

 接下去的事情好办了,有了一个project对象后,我们相当于只要调用project下面的方法来生成一个详细的project.

所谓详细的project就是为他添加多个task.

 


 
 
  1. //生成一个task集合 
  2. DispatchPtr tasks = (DispatchPtr) project.get("Tasks"); 
  3.  
  4. //之后多次调用来生成一个个任务 
  5. DispatchPtr taskName = (DispatchPtr) tasks.invoke("Add"); 
  6.  
  7. //当然要为任务设置属性:这要是name notes, 
  8. issueName.put("Name", issueKey + ":" + issueSummary ); 
  9. issueName.put("Notes", issueDesc ); 
  10. issueName.put("OutlineLevel""1"); 
  11. //在task对象中,没有明确的父子关系可以确定,在生成的过程中,都是更具生成的id和UniqueID顺序排下去的 
  12. //唯一可以确定最终在msproject中的结构的就是一个 
  13. OutLineLevel属性了. 

最后,进行保存操作,以及不要忘记进行应用程序的关闭.


 
 
  1. project.invoke("SaveAs", mppPath); 
  2. app.invoke("DocClose" ); 

 



本文转自 nileader 51CTO博客,原文链接:http://blog.51cto.com/nileader/376597,如需转载请自行联系原作者

相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
2月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
185 3
|
3月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
3月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
1月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
155 1
|
2月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
203 16
|
7月前
|
自然语言处理 Java 关系型数据库
Java|小数据量场景的模糊搜索体验优化
在小数据量场景下,如何优化模糊搜索体验?本文分享一个简单实用的方案,虽然有点“土”,但效果还不错。
156 0
|
4月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
249 14
|
6月前
|
SQL 存储 OLAP
数据外置提速革命:轻量级开源SPL如何用文件存储实现MPP级性能?
传统交易型数据库在分析计算中常遇性能瓶颈,将数据迁至OLAP数据仓库虽可缓解,但成本高、架构复杂。SPL通过轻量级列存文件存储历史数据,提供强大计算能力,大幅简化架构并提升性能。它优化了列式存储、数据压缩与多线程并行处理,在常规及复杂计算场景中均表现优异,甚至单机性能超越集群。实际案例中,SPL在250亿行数据的时空碰撞问题上,仅用6分钟完成ClickHouse集群30分钟的任务。
数据外置提速革命:轻量级开源SPL如何用文件存储实现MPP级性能?
|
4月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
130 0
|
4月前
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
288 0

热门文章

最新文章