java解析Microsoft Project mpp文件(

来源:互联网 发布:淘宝口红小样是真的吗 编辑:程序博客网 时间:2024/05/21 17:09
背景:
在公司项目中,技术总监之前让我开发了一个甘特图的功能,当然这引用了一个开源的js框架。
我负责的是查找表单,将表单的数据通过递归的方式获取后,然后动态创建一个树形的符合那个js框架的xml文件,再加上前台的一些技术,eg:Ajax 、 jQuery 、Extjs....就OK了!

后来,技术总监说为了方便客户,让用户只需要用微软(Microsoft)的Project 工具,创建项目和任务计划的相关信息,即生成的就是一个mpp文件,导入到项目中,就可以转换成之前开发的甘特图来显示。即就是要解析
用户导入的Project mpp文件,获取其中的信息,然后入库

说明:
我写了一个在我们公司项目中比较通用的一个java静态类来解析,然后由业务层来调用,这个类的功能就只是
负责解析文件,至于保存入库,每个公司都有自己的方式,我就不展示代码了........
------------------------------------------------------------------------------------------------
代码如下:
----------------------------------
package com.cinsea.parsempp.ext;

import com.cinsea.exception.DataOperationException;
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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public static class ParseProjectMpp{

   
    public static List psrseProjectFile(File mppfile){
        List list = new ArrayList();
        MPPReader reader = new MPPReader();
        ProjectFile projectFile;
        try{
            projectFile = reader.read(mppfile);
            List taskList = projectFile.getAllTasks();
            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();
        if(task!=null){
            List list = task.getPredecessors();
            if(list != null ){
                if(list.size()>0){
                    for(int i=0; i<list.size(); i++){
                        Relation relation = (Relation)list.get(i);
                        beforeTaskId.append(relation.getTargetTask().getID());
                    }
                }
            }
        }
        return beforeTaskId.toString();
    }

   
    private static String getResources(Task task){
        if(task == null){
            return "";
        }
        StringBuffer sb = new StringBuffer();
        List assignments = task.getResourceAssignments();
        for(ResourceAssignment ra : assignments){
            Resource resource = ra.getResource();
            if(resource != null){
                sb = sb.append(resource.getName());
            }
        }
        return sb.toString();
    }
}
原创粉丝点击