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
rojectMpp(tasks);
} catch (MPXJException e) {
tackTrace();
}
}
/**
* 遍历任务,解析mpp文件,并可进行相应该实际业务逻辑
*
* @param tasks
*/ public void parseProjectMpp(List
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
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
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);
} }
日历
List
//资源日历
List
ourceCalendars();
//标准日历
ProjectCalendardefaultCalendar = endar();
//根据具体任务日历
ProjectCalendartaskCalendar = endar();
资源分配工期
//开始时间
List
ephasedPlanned();
//结束时间
List
ephasedComplete();
源码研究,对源码感兴趣可解压下载下来的包,导入eclipse中。 其它,目前,编者目前使用mpxj-4.0实际开发中,支持读取Microsoft Office Project 2003/2007/2010,其它版本暂未做测试。缺点,mpxj-4.0目前不能写mpp文件。
如有疑问,可Email:wRitchie@
二〇一一年一月八日星期六
于北京.海淀


发布评论