通过java导入读取微软项目管理文件
程序员文章站
2022-03-27 12:37:04
业务背景:在公司项目中开发了一个甘特图的功能,为了方便客户,让用户只需要用微软(Microsoft)的Project 工具,创建项目和任务计划的相关信息,即生成的就是一个mpp文件,导入到项目中,就可以转换成之前开发的甘特图来显示。即就是要解析用户导入的Project mpp文件,获取其中的信息,然后入库准备项目环境(maven依赖库):
业务背景:
在公司项目中开发了一个甘特图的功能,为了方便客户,让用户只需要用微软(Microsoft)的Project 工具,创建项目和任务计划的相关信息,即生成的就是一个mpp文件,导入到项目中,就可以转换成之前开发的甘特图来显示。即就是要解析
用户导入的Project mpp文件,获取其中的信息,然后入库
准备项目环境(maven依赖库):
<dependencies>
<!-- 微软project文件导入 -->
<dependency>
<groupId>net.sf.mpxj</groupId>
<artifactId>mpxj</artifactId>
<version>8.1.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
核心代码:
package project;
import net.sf.mpxj.*;
import net.sf.mpxj.MPXJException;
import net.sf.mpxj.Resource;
import net.sf.mpxj.ResourceAssignment;
import net.sf.mpxj.Task;
import net.sf.mpxj.ProjectFile;
import net.sf.mpxj.mpp.MPPReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ParseProjectMpp {
public static List psrseProjectFile(InputStream mppfile) {
List list = new ArrayList();
MPPReader reader = new MPPReader();
ProjectFile projectFile;
try {
//projectFile = reader.read(mppfile);
projectFile = reader.read(mppfile);
List<Task> firstTask = projectFile.getChildTasks();
List<Task> taskList=firstTask.get(0).getChildTasks();
for (Task task : taskList) {
Map map = new HashMap();
map.put("id", task.getID());
map.put("taskName", task.getName());
map.put("startDate", task.getStart());
map.put("endDate", task.getFinish());
map.put("beforeTask", getBeforeTaskId(task));//获取前置任务的Id
//map.put("resource", getResources(task));//获得资源
list.add(map);
}
} catch (MPXJException e) {
e.printStackTrace();
}
return list;
}
private static String getBeforeTaskId(Task task) {
StringBuffer beforeTaskId = new StringBuffer();
List<Relation> task_predecessors = task.getPredecessors();
//4. 获取前置任务(任务流)
StringBuilder beforeTaskType = new StringBuilder();
if (task_predecessors != null) {
if (task_predecessors.size() > 0) {
for (Relation relation : task_predecessors) {
Integer targetTaskId = relation.getTargetTask().getID();
if (beforeTaskId.length() == 0) {
beforeTaskId.append(targetTaskId);
beforeTaskType.append(relation.getType());
} else {
beforeTaskId.append("," + targetTaskId);
beforeTaskType.append("," + relation.getType());
}
}
}
}
return beforeTaskId.append(beforeTaskType).toString();
}
}
测试代码:
package project;
import java.io.File;
import java.io.InputStream;
import static org.junit.Assert.*;
public class ParseProjectMppTest {
ParseProjectMpp t;
@org.junit.Before
public void setUp() throws Exception {
t=new ParseProjectMpp();
}
@org.junit.Test
public void psrseProjectFile() {
//File f=new File("");
InputStream f=this.getClass().getClassLoader().getResourceAsStream("demo.mpp");
t.psrseProjectFile(f);
}
}
额外说明:
我写了一个在我们公司项目中比较通用的一个java静态类来解析,然后由业务层来调用,这个类的功能就只是
负责解析文件,至于保存入库之后展现给客户,当然这引用了一个开源的js框架,开发思路是查找表单,将表单的数据通过递归的方式获取后,然后动态创建一个树形的符合那个js框架的xml文件或者json文件,再加上前台的一些技术来展示。
本文地址:https://blog.csdn.net/hepeng421/article/details/107383757