1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java解析project mpp文件_Jira数据导出 Java写mpp文件

java解析project mpp文件_Jira数据导出 Java写mpp文件

时间:2022-11-12 14:05:14

相关推荐

java解析project mpp文件_Jira数据导出 Java写mpp文件

1.从JIRA上读取数据。

2.读写MSProject文件。

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

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

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

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

使用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, summary和desc.

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

//获取问题的issueKey

[SANDBOX-1]

finalstaticPatternISSUE_KEY_PATTERN=pile(

"

(\\s)+\\[(?s).*?&",Pattern.CANON_EQ);

//获得问题的Summary

//href="http://jira./browse/SANDBOX-1">TimeoutThread或Thread.setTimeout

finalstaticPatternISSUE_SUMMARY_PATTERN=pile(

"

(\\s)+\\[(?s).*?

+JpContext.jiraDomain

+"/browse/(\\S)+(-)([0-9])+\">(?s).*?

",

Pattern.CANON_EQ);

//获取问题的描述

......

finalstaticPatternISSUE_DESC_PATTERN=pile(

"

(?s).*?",Pattern.CANON_EQ);

//获取问题的fixversion修复版本:...........

finalstaticPatternISSUE_FIXVERSION_PATTERN=pile(

"修复版本(?s).*?",Pattern.CANON_EQ);

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

#获得指定issueKey的问题的所有子任务

JIRA_ISSUESUB_URL={domain}/browse/{issueKey}

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

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

首先要实例出一个soap对象

SOAPSessionsoapSession=newSOAPSession(newURL(baseUrl));

soapSession.getJiraSoapService();

获取所有的issue

SearchSoapExerciserse=newSearchSoapExerciser(soapSession);

//存储所有问题

/**遍历所有的issues*/

try{

for(RemoteIssueri:se.testJqlSearch("",10)){

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

完整代码在附件中

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

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

java操作msproject文件方面,已经有一个很好的开源包了,/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支持的文件,

packagecom.test;

importjava.io.IOException;

importnet.sf.mpxj.MPXJException;

importnet.sf.mpxj.ProjectFile;

importnet.sf.mpxj.mpp.MPPReader;

importnet.sf.mpxj.mspdi.MSPDIWriter;

importnet.sf.mpxj.reader.ProjectReader;

importnet.sf.mpxj.writer.ProjectWriter;

publicclassTest{

publicstaticvoidmain(String[]args)throwsException{

ProjectReaderreader=newMPPReader();

ProjectFileproject;

try{

project=reader.read("d:\\native.mpp");

//生成文件

ProjectWriterwriter=newMSPDIWriter();

try{

writer.write(project,"d:\\test.xml");

}catch(IOExceptionioe){

throwioe;

}

}catch(MPXJExceptionmpxje){

throwmpxje;

}catch(Exceptione){

e.printStackTrace();

}

}

}

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

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

方法来源:

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

具体做法如下:

//实例一个app,这个app可以想象成是一个msproject的应用程序

/**这里要指明的一点的是,使用这种方法生成*.mpp文件的前提是你的电脑上必须安装有msproject这个软件*/

app=newDispatchPtr("MSProject.Application");

/**从这个链接中可以发现app有个成员是/en-us/library/bb236984(v=office.12).aspx*/

DispatchPtrprojects=(DispatchPtr)app.get("Projects");

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

Use theProjectobject to theProjectscollection. The following example creates a new project without prompting for project information.

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

/**从这个链接中可以发现/en-us/library/bb214615(v=office.12).aspx*/

DispatchPtrproject=(DispatchPtr)projects.invoke("Add");

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

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

//生成一个task集合

DispatchPtrtasks=(DispatchPtr)project.get("Tasks");

//之后多次调用来生成一个个任务

DispatchPtrtaskName=(DispatchPtr)tasks.invoke("Add");

//当然要为任务设置属性:这要是namenotes,

issueName.put("Name",issueKey+":"+issueSummary);

issueName.put("Notes",issueDesc);

issueName.put("OutlineLevel","1");

//在task对象中,没有明确的父子关系可以确定,在生成的过程中,都是更具生成的id和UniqueID顺序排下去的

//唯一可以确定最终在msproject中的结构的就是一个

OutLineLevel属性了.

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

project.invoke("SaveAs",mppPath);

app.invoke("DocClose");

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。