Java解析Project mpp文件Word格式.docx
《Java解析Project mpp文件Word格式.docx》由会员分享,可在线阅读,更多相关《Java解析Project mpp文件Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
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);
Project文件绝对路径:
"
+pf.getProjectFilePath());
ParseProjectMppppm=newParseProjectMpp();
List<
Task>
tasks=pf.getAllTasks();
ppm.parseProjectMpp(tasks);
}catch(MPXJExceptione){
e.printStackTrace();
}
}
*遍历任务,解析mpp文件,并可进行相应该实际业务逻辑
*
*@paramtasks
publicvoidparseProjectMpp(List<
tasks){
System.out.println("
任务总数:
+tasks.size());
System.out
.println("
ID|任务名称|资源名称|开始时间|结束时间|完成百分比|任务层数|任务子级数"
);
for(TaskoneTask:
//相关具体业务逻辑代码,如保存至数据库...
//本教程代码为简单,直接输入
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();
List<
ResourceAssignment>
assignments=task.getResourceAssignments();
for(ResourceAssignmentassignment:
assignments){
Resourceresource=assignment.getResource();
if(resource!
=null){
buf.append(resource.getName()).append("
"
}
returnbuf.toString();
}
运行结果
\wRitchie.mpp
C:
\项目2010.mpp
12
ID|任务名称|资源名称|开始时间|结束时间|完成百分比|任务层数|任务子级数
0|项目2010||WedJan1208:
00:
00CST2011|MonJan3117:
00CST2011|0.0|0|0
2|mpp教程启动阶段|吴理琪,|WedJan1208:
00CST2011|WedJan1217:
00CST2011|0.0|1|1
5|mpp教程调研、分析阶段||WedJan1208:
00CST2011|FriJan1417:
00CST2011|0.0|1|2
8|网络调研|吴理琪,wRitchie,|WedJan1208:
00CST2011|ThuJan1317:
00CST2011|0.0|2|2.1
10|访问用户|wRitchie,|WedJan1208:
00CST2011|0.0|2|2.2
3|mpp教程设计阶段|吴理琪,|MonJan1708:
00CST2011|ThuJan2017:
00CST2011|0.0|1|3
11|架构设计|wRitchie,|MonJan1708:
00CST2011|MonJan1717:
00CST2011|0.0|2|3.1
4|mpp教程示例开发阶段|wRitchie,吴理琪,|MonJan2408:
00CST2011|MonJan2417:
00CST2011|0.0|1|4
12|示例代码开发|wRitchie,吴理琪,|FriJan2108:
00CST2011|0.0|2|4.1
6|mpp教程测试阶段|吴理琪,|WedJan1208:
00CST2011|TueJan2517:
00CST2011|0.0|1|5
7|mpp教程培训阶段|wRitchie,|ThuJan2708:
00CST2011|0.0|1|6
13|文档编著||WedJan2608:
00CST2011|0.0|2|6.1
四、代码解释
读取mpp文件:
ProjectReaderreader=newMPPReader();
ProjectFileproject=reader.read("
wRitchie.mpp"
读取mpp文件后,可以读资源
for(Resourceresource:
project.getAllResources())
{
System.out.println("
Resource:
+resource.getName()+"
(UniqueID="
+resource.getUniqueID()+"
)"
读取mpp文件后,可以读取所有任务
for(Tasktask:
project.getAllTasks())
Task:
+task.getName()+"
ID="
+task.getID()+"
UniqueID="
+task.getUniqueID());
获取指定ID或UniqueID资源或任务方法
Resourcer=project.getResourceByUniqueID(Integer.valueOf(88));
Taskt=project.getTaskByUniqueID(Integer.valueOf(88));
获取所有任务层次关系方法
List<
tasks=project.getChildTasks();
Tasktask=tasks.get(0);
tasks=task.getChildTasks();
publicvoidlistHierarchy(ProjectFilefile)
for(Tasktask:
file.getChildTasks())
{
+task.getName());
listHierarchy(task,"
System.out.println();
privatevoidlistHierarchy(Tasktask,Stringindent)
for(Taskchild:
task.getChildTasks())
System.out.println(indent+"
+child.getName());
listHierarchy(child,indent+"
前置任务关系
file.getAllTasks())
List<
Relation>
predecessors=task.getPredecessors();
if(predecessors!
=null&
&
predecessors.isEmpty()==false)
System.out.println(task.getName()+"
predecessors:
for(Relationrelation:
predecessors)
Task:
+file.getTaskByUniqueID(relation.getTaskUniqueID()).getName());
Type:
+relation.getType());
Lag:
+relation.getDuration());
relation.getTargetTask().getID()对应前置任务标识号;
relation.getType()对应前置任务类型:
relation.getLag()对应延隔时间,单位(日)
获取得形如
:
+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)"
resourceName=resource.getName();
Assignment:
Task="
+taskName+"
Resource="
+resourceName);
获取指定任务的资源名称
Assignmentsfortask"
:
for(ResourceAssignmentassignment:
task.getResourceAssignments())
日历
ProjectCalendar>
baseCalendars=file.getBaseCalendars();
//资源日历
resourceCalendars=file.getResourceCalendars();
//标准日历
ProjectCalendardefaultCalendar=file.getCalendar();
//根据具体任务日历
ProjectCalendartaskCalendar=task.getCalendar();
资源分配工期
//开始时间
TimephasedResourceAssignment>
planned=assignment.getTimephasedPlanned();
//结束时间
complete=assignment.getTimephasedComplete();
源码研究,对源码感兴趣可解压下载下来的mpxj-4.0.0.zip包,导入eclipse中。
其它,目前,编者目前使用mpxj-4.0实际开发中,支持读取MicrosoftOfficeProject2003/2007/2010,其它版本暂未做测试。
缺点,mpxj-4.0目前不能写mpp文件。
如有疑问,可Email:
wRitchie@
二〇一一年一月八日星期六
于北京.海淀