java解析Microsoft Project mpp文件(

背景:
在公司项目中,技术总监之前让我开发了一个甘特图的功能,当然这引用了一个开源的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();
    }
}
Microsoft Project 是一款常用的项目管理软件,它使用的文件格式为 .mpp。如果需要解析 .mpp 文件,可以使用 Microsoft Project 软件自带的 API,也可以使用第三方库或者工具实现。 Microsoft Project 提供了 VBA 编程接口,可以通过编写 VBA 宏实现对 .mpp 文件解析。具体步骤如下: 1. 打开 Microsoft Project 软件,按下 Alt + F11 打开 VBA 编辑器。 2. 在 VBA 编辑器中,插入一个新的模块。 3. 在模块中编写 VBA 代码,使用 Project 对象和 Task 对象来访问 .mpp 文件中的数据。例如,以下代码可以输出 .mpp 文件中所有任务的名称: ``` Sub ParseMppFile() Dim proj As Project Set proj = Application.ActiveProject Dim task As Task For Each task In proj.Tasks Debug.Print task.Name Next task End Sub ``` 此外,还可以使用第三方库或者工具实现 .mpp 文件解析。例如,有一些 Python 库可以读取和操作 .mpp 文件,如 pympp 和 pywin32。使用这些库,可以在 Python 环境中编写代码来读取 .mpp 文件中的数据。例如,以下 Python 代码可以读取 .mpp 文件中所有任务的名称: ``` import win32com.client app = win32com.client.Dispatch("MSProject.Application") app.Visible = True proj = app.FileOpenEx("path/to/mpp/file.mpp") for task in proj.Tasks: print(task.Name) proj.Close() app.Quit() ``` 需要注意的是,使用第三方库或者工具解析 .mpp 文件可能会受到 Microsoft Project 版本和 .mpp 文件格式的限制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值