通过java导入读取微软项目管理文件

业务背景:

在公司项目中开发了一个甘特图的功能,为了方便客户,让用户只需要用微软(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文件,再加上前台的一些技术来展示。

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值