2023年12月7日发(作者:)

Java解析Project mpp文件实用教程

编著:吴理琪(wRitchie)

概述:MPP指的是Microsoft Office Project文件。用于定制计划,主要参数有任务名称,资源名称,工期,开始时间,结束时间。工期通过工作时间及开始时间结束时间推算出来(工作时间:每星期工作几天,工作时间段为什么。可指定特定的工作日,工作时间段可单独设置)。MPXJ类包提供创建、读写Microsoft Project Exchange (MPX)文件,Project 2002 和 2003 MSPDI XML 文件;与读取Microsoft

Office Project 98/2000/ 2002/2003/2007/2010等MPP文件。

官网:

MPXJ数据结构及关系图:

一、 下载mpxj包:

/projects/mpxj/files/mpxj/Version%204.0.0//download

注:下载链接可能不能下载,可另选镜像: 二、 使用mpxj来解析mpp项目中所需的jar包:及其依赖的poi-*.*.jar包,如下图所示:

三、 代码

package ie;

.*;

import ception;

import ce;

import ceAssignment;

import ;

import tFile;

import ;

import .*;

public class ParseProjectMpp {

/**

* @Data 2011-1-13

* @author 吴理琪

* @parammppFilePath

*/

public static void main(String[] args) {

String mppFilePath = "c:";

File file = new File(mppFilePath); MPPReadermppRead = new MPPReader();

ProjectFilepf;

try {

pf = (file);

n("mpp文件:" + mppFilePath);

n("Project文件绝对路径 : " +

jectFilePath());

ParseProjectMpp ppm = new ParseProjectMpp();

List tasks = Tasks();

rojectMpp(tasks);

} catch (MPXJException e) {

tackTrace();

}

}

/**

* 遍历任务,解析mpp文件,并可进行相应该实际业务逻辑

*

* @param tasks

*/ public void parseProjectMpp(List tasks) {

n("任务总数: " + ());

.println("ID |任务名称 |资源名称

|开始时间 |结束时间 |完成百分比 |任务层数

|任务子级数");

for (Task oneTask : tasks) {

// 相关具体业务逻辑代码,如保存至数据库...

// 本教程代码为简单,直接输入

n(queID() + "|" +

e()

+ "|" + ource(oneTask) + "|"

+ rt() + "|" +

ish() + "|"

+ centageComplete() + "|"

+ lineLevel() + "|"

+ lineNumber());

}

}

/** * 获取资源

*

* @param task

* @return 资源名称

*/

@SuppressWarnings("rawtypes")

public String getResource(Task task) {

StringBufferbuf = new StringBuffer();

List

ourceAssignments();

for (ResourceAssignment assignment : assignments) {

Resource resource = ource();

if (resource != null) {

(e()).append(",");

}

}

return ng();

}

}

运行结果

mpp文件:c:

Project文件绝对路径 : C:项目

任务总数: 12

ID |任务名称 |资源名称 |开始时间 |结束时间|完assignments = 成百分比 |任务层数 |任务子级数

0|项目2010||Wed Jan 12 08:00:00 CST 2011|Mon Jan 31 17:00:00 CST

2011|0.0|0|0

2|mpp教程启动阶段|吴理琪,|Wed Jan 12 08:00:00 CST 2011|Wed Jan 12

17:00:00 CST 2011|0.0|1|1

5|mpp教程调研、分析阶段||Wed Jan 12 08:00:00 CST 2011|Fri Jan 14

17:00:00 CST 2011|0.0|1|2

8|网络调研|吴理琪,wRitchie,|Wed Jan 12 08:00:00 CST 2011|Thu Jan 13

17:00:00 CST 2011|0.0|2|2.1

10|访问用户|wRitchie,|Wed Jan 12 08:00:00 CST 2011|Thu Jan 13

17:00:00 CST 2011|0.0|2|2.2

3|mpp教程设计阶段|吴理琪,|Mon Jan 17 08:00:00 CST 2011|Thu Jan 20

17:00:00 CST 2011|0.0|1|3

11|架构设计|wRitchie,|Mon Jan 17 08:00:00 CST 2011|Mon Jan 17

17:00:00 CST 2011|0.0|2|3.1

4|mpp教程示例开发阶段|wRitchie,吴理琪,|Mon Jan 24 08:00:00 CST

2011|Mon Jan 24 17:00:00 CST 2011|0.0|1|4

12|示例代码开发|wRitchie,吴理琪,|Fri Jan 21 08:00:00 CST 2011|Mon Jan

24 17:00:00 CST 2011|0.0|2|4.1

6|mpp教程测试阶段|吴理琪,|Wed Jan 12 08:00:00 CST 2011|Tue Jan 25

17:00:00 CST 2011|0.0|1|5

7|mpp教程培训阶段|wRitchie,|Thu Jan 27 08:00:00 CST 2011|Mon Jan 31

17:00:00 CST 2011|0.0|1|6

13|文档编著||Wed Jan 26 08:00:00 CST 2011|Mon Jan 31 17:00:00 CST

2011|0.0|2|6.1

四、 代码解释

读取mpp文件:

ProjectReader reader = new MPPReader ();

ProjectFile project = ("");

读取mpp文件后,可以读资源

ProjectReader reader = new MPPReader ();

ProjectFile project = ("");

for (Resource resource : Resources())

{

n("Resource: " + e() + " (Unique

ID=" + queID() + ")"); }

读取mpp文件后,可以读取所有任务

ProjectReader reader = new MPPReader ();

ProjectFile project = ("");

for (Task task : Tasks())

{

n("Task: " + e() + " ID=" +

() + " Unique ID=" + queID());

}

获取指定ID或Unique ID资源或任务方法

Resource r = ourceByUniqueID(f(88));

Task t = kByUniqueID(f(88));

获取所有任务层次关系方法

List tasks = ldTasks();

Task task = (0);

tasks = ldTasks();

public void listHierarchy(ProjectFile file)

{

for (Task task : ldTasks())

{

n("Task: " + e());

listHierarchy(task, " ");

}

n();

}

private void listHierarchy(Task task, String indent)

{

for (Task child : ldTasks())

{

n(indent + "Task: " + e());

listHierarchy(child, indent + " ");

}

}

前置任务关系 for (Task task : Tasks())

{

List predecessors = decessors();

if (predecessors != null &&y() == false)

{

n(e() + " predecessors:");

for (Relation relation : predecessors)

{

n(" Task: " +

kByUniqueID(kUniqueID()).getName());

n(" Type: " + e());

n(" Lag: " + ation());

}

}

}

getTask().getID()对应前置任务标识号;

e()对应前置任务类型:()对应延隔时间,单位(日)

获取得形如:

n(""+getTask().getID()+e()+"+"+());

获得所有资源名称

for (ResourceAssignment assignment :

ResourceAssignments())

{

Task task = k();

String taskName;

if (task == null)

{

taskName = "(null task)";

}

else {

taskName = e();

}

Resource resource = ource();

String resourceName;

if (resource == null)

{

resourceName = "(null resource)";

}

else

{

resourceName = e();

}

n("Assignment: Task=" + taskName + " Resource="

+ resourceName);

}

获取指定任务的资源名称

for (Task task : Tasks())

{

n("Assignments for task " + e() +

":");

for (ResourceAssignment assignment :

ourceAssignments())

{

Resource resource = ource();

String resourceName;

if (resource == null)

{

resourceName = "";

}

else

{

resourceName = e();

}

n(" " + resourceName);

} }

日历

ListbaseCalendars = eCalendars();

//资源日历

ListresourceCalendars =

ourceCalendars();

//标准日历

ProjectCalendardefaultCalendar = endar();

//根据具体任务日历

ProjectCalendartaskCalendar = endar();

资源分配工期

//开始时间

List planned =

ephasedPlanned();

//结束时间

List complete =

ephasedComplete();

源码研究,对源码感兴趣可解压下载下来的包,导入eclipse中。 其它,目前,编者目前使用mpxj-4.0实际开发中,支持读取Microsoft Office Project 2003/2007/2010,其它版本暂未做测试。缺点,mpxj-4.0目前不能写mpp文件。

如有疑问,可Email:wRitchie@

二〇一一年一月八日星期六

于北京.海淀