Java解析Project mpp文件.docx
《Java解析Project mpp文件.docx》由会员分享,可在线阅读,更多相关《Java解析Project mpp文件.docx(12页珍藏版)》请在冰豆网上搜索。
Java解析Projectmpp文件
Java解析Projectmpp文件实用教程
编著:
吴理琪(wRitchie)
概述:
MPP指的是MicrosoftOfficeProject文件。
用于定制计划,主要参数有任务名称,资源名称,工期,开始时间,结束时间。
工期通过工作时间及开始时间结束时间推算出来(工作时间:
每星期工作几天,工作时间段为什么。
可指定特定的工作日,工作时间段可单独设置)。
MPXJ类包提供创建、读写MicrosoftProjectExchange(MPX)文件,Project2002和2003MSPDIXML文件;与读取MicrosoftOfficeProject98/2000/2002/2003/2007/2010等MPP文件。
官网:
MPXJ数据结构及关系图:
一、下载mpxj包:
注:
下载链接可能不能下载,可另选镜像:
二、使用mpxj来解析mpp项目中所需的jar包:
mpxj.jar及其依赖的poi-*.*.jar包,如下图所示:
三、代码
packagecom.writchie;
importnet.sf.mpxj.mpp.*;
importnet.sf.mpxj.MPXJException;
importnet.sf.mpxj.Resource;
importnet.sf.mpxj.ResourceAssignment;
importnet.sf.mpxj.Task;
importnet.sf.mpxj.ProjectFile;
importjava.util.List;
importjava.io.*;
publicclassParseProjectMpp{
/**
*@Data2011-1-13
*@author吴理琪
*@parammppFilePath
*/
publicstaticvoidmain(String[]args){
StringmppFilePath="c:
\\wRitchie.mpp";
Filefile=newFile(mppFilePath);
MPPReadermppRead=newMPPReader();
ProjectFilepf;
try{
pf=mppRead.read(file);
System.out.println("mpp文件:
"+mppFilePath);
System.out.println("Project文件绝对路径:
"+pf.getProjectFilePath());
ParseProjectMppppm=newParseProjectMpp();
Listtasks=pf.getAllTasks();
ppm.parseProjectMpp(tasks);
}catch(MPXJExceptione){
e.printStackTrace();
}
}
/**
*遍历任务,解析mpp文件,并可进行相应该实际业务逻辑
*
*@paramtasks
*/
publicvoidparseProjectMpp(Listtasks){
System.out.println("任务总数:
"+tasks.size());
System.out
.println("ID|任务名称|资源名称|开始时间|结束时间|完成百分比|任务层数|任务子级数");
for(TaskoneTask:
tasks){
//相关具体业务逻辑代码,如保存至数据库...
//本教程代码为简单,直接输入
System.out.println(oneTask.getUniqueID()+"|"+oneTask.getName()
+"|"+this.getResource(oneTask)+"|"
+oneTask.getStart()+"|"+oneTask.getFinish()+"|"
+oneTask.getPercentageComplete()+"|"
+oneTask.getOutlineLevel()+"|"
+oneTask.getOutlineNumber());
}
}
/**
*获取资源
*
*@paramtask
*@return资源名称
*/
@SuppressWarnings("rawtypes")
publicStringgetResource(Tasktask){
StringBufferbuf=newStringBuffer();
Listassignments=task.getResourceAssignments();
for(ResourceAssignmentassignment:
assignments){
Resourceresource=assignment.getResource();
if(resource!
=null){
buf.append(resource.getName()).append(",");
}
}
returnbuf.toString();
}
}
运行结果
mpp文件:
c:
\wRitchie.mpp
Project文件绝对路径:
C:
\项目2010.mpp
任务总数:
12
ID|任务名称|资源名称|开始时间|结束时间|完成百分比|任务层数|任务子级数
0|项目2010||WedJan1208:
00:
00CST2011|MonJan3117:
00:
00CST2011|0.0|0|0
2|mpp教程启动阶段|吴理琪,|WedJan1208:
00:
00CST2011|WedJan1217:
00:
00CST2011|0.0|1|1
5|mpp教程调研、分析阶段||WedJan1208:
00:
00CST2011|FriJan1417:
00:
00CST2011|0.0|1|2
8|网络调研|吴理琪,wRitchie,|WedJan1208:
00:
00CST2011|ThuJan1317:
00:
00CST2011|0.0|2|2.1
10|访问用户|wRitchie,|WedJan1208:
00:
00CST2011|ThuJan1317:
00:
00CST2011|0.0|2|2.2
3|mpp教程设计阶段|吴理琪,|MonJan1708:
00:
00CST2011|ThuJan2017:
00:
00CST2011|0.0|1|3
11|架构设计|wRitchie,|MonJan1708:
00:
00CST2011|MonJan1717:
00:
00CST2011|0.0|2|3.1
4|mpp教程示例开发阶段|wRitchie,吴理琪,|MonJan2408:
00:
00CST2011|MonJan2417:
00:
00CST2011|0.0|1|4
12|示例代码开发|wRitchie,吴理琪,|FriJan2108:
00:
00CST2011|MonJan2417:
00:
00CST2011|0.0|2|4.1
6|mpp教程测试阶段|吴理琪,|WedJan1208:
00:
00CST2011|TueJan2517:
00:
00CST2011|0.0|1|5
7|mpp教程培训阶段|wRitchie,|ThuJan2708:
00:
00CST2011|MonJan3117:
00:
00CST2011|0.0|1|6
13|文档编著||WedJan2608:
00:
00CST2011|MonJan3117:
00:
00CST2011|0.0|2|6.1
四、代码解释
读取mpp文件:
ProjectReaderreader=newMPPReader();
ProjectFileproject=reader.read("wRitchie.mpp");
读取mpp文件后,可以读资源
ProjectReaderreader=newMPPReader();
ProjectFileproject=reader.read("wRitchie.mpp");
for(Resourceresource:
project.getAllResources())
{
System.out.println("Resource:
"+resource.getName()+"(UniqueID="+resource.getUniqueID()+")");
}
读取mpp文件后,可以读取所有任务
ProjectReaderreader=newMPPReader();
ProjectFileproject=reader.read("wRitchie.mpp");
for(Tasktask:
project.getAllTasks())
{
System.out.println("Task:
"+task.getName()+"ID="+task.getID()+"UniqueID="+task.getUniqueID());
}
获取指定ID或UniqueID资源或任务方法
Resourcer=project.getResourceByUniqueID(Integer.valueOf(88));
Taskt=project.getTaskByUniqueID(Integer.valueOf(88));
获取所有任务层次关系方法
Listtasks=project.getChildTasks();
Tasktask=tasks.get(0);
tasks=task.getChildTasks();
publicvoidlistHierarchy(ProjectFilefile)
{
for(Tasktask:
file.getChildTasks())
{
System.out.println("Task:
"+task.getName());
listHierarchy(task,"");
}
System.out.println();
}
privatevoidlistHierarchy(Tasktask,Stringindent)
{
for(Taskchild:
task.getChildTasks())
{
System.out.println(indent+"Task:
"+child.getName());
listHierarchy(child,indent+"");
}
}
前置任务关系
for(Tasktask:
file.getAllTasks())
{
Listpredecessors=task.getPredecessors();
if(predecessors!
=null&&predecessors.isEmpty()==false)
{
System.out.println(task.getName()+"predecessors:
");
for(Relationrelation:
predecessors)
{
System.out.println("Task:
"+file.getTaskByUniqueID(relation.getTaskUniqueID()).getName());
System.out.println("Type:
"+relation.getType());
System.out.println("Lag:
"+relation.getDuration());
}
}
}
relation.getTargetTask().getID()对应前置任务标识号;
relation.getType()对应前置任务类型:
relation.getLag()对应延隔时间,单位(日)
获取得形如
:
System.out.println(""+relation.getTargetTask().getID()+relation.getType()+"+"+relation.getLag());
获得所有资源名称
for(ResourceAssignmentassignment:
file.getAllResourceAssignments())
{
Tasktask=assignment.getTask();
StringtaskName;
if(task==null)
{
taskName="(nulltask)";
}
else
{
taskName=task.getName();
}
Resourceresource=assignment.getResource();
StringresourceName;
if(resource==null)
{
resourceName="(nullresource)";
}
else
{
resourceName=resource.getName();
}
System.out.println("Assignment:
Task="+taskName+"Resource="+resourceName);
}
获取指定任务的资源名称
for(Tasktask:
file.getAllTasks())
{
System.out.println("Assignmentsfortask"+task.getName()+":
");
for(ResourceAssignmentassignment:
task.getResourceAssignments())
{
Resourceresource=assignment.getResource();
StringresourceName;
if(resource==null)
{
resourceName="";
}
else
{
resourceName=resource.getName();
}
System.out.println(""+resourceName);
}
}
日历
ListbaseCalendars=file.getBaseCalendars();
//资源日历
ListresourceCalendars=file.getResourceCalendars();
//标准日历
ProjectCalendardefaultCalendar=file.getCalendar();
//根据具体任务日历
ProjectCalendartaskCalendar=task.getCalendar();
资源分配工期
//开始时间
Listplanned=assignment.getTimephasedPlanned();
//结束时间
Listcomplete=assignment.getTimephasedComplete();
源码研究,对源码感兴趣可解压下载下来的mpxj-4.0.0.zip包,导入eclipse中。
其它,目前,编者目前使用mpxj-4.0实际开发中,支持读取MicrosoftOfficeProject2003/2007/2010,其它版本暂未做测试。
缺点,mpxj-4.0目前不能写mpp文件。
如有疑问,可Email:
wRitchie@
二〇一一年一月八日星期六
于北京.海淀