[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[整理]Java使用MPXJ操作MS Project

上一篇:[转]《中华人民共和国劳动合同法》全文 (2008年1月1日执行)
下一篇:[闲文]抱窝小母鸡,母鸡中的战斗机……

添加日期:2009/6/18 11:36:14 快速返回   返回列表 阅读6424次

MPXJ是一个开源的包,网址http://mpxj.sourceforge.net/index.html

它需要POI的支持。

它可以读取MPP文件(不能写!!!)

可以读写MPX文件,MPX就是一个纯文本文件,里面有TASK,Resource之类的信息,按一定格式书写的。
Project 98及之前版本可以另存为MPX文件,从Project 2000开始就不支持另存为MPX格式了,
但是,它们仍然可以读取MPX文件。

MPXJ的读写的类主要有这么几个:
读:
net.sf.mpxj.mpp.MPPReader: reads Microsoft Project MPP files 
net.sf.mpxj.mpx.MPXReader: reads Microsoft MPX files 
net.sf.mpxj.mspdi.MSPDIReader: reads Microsoft MSPDI (XML) files 
net.sf.mpxj.mpd.MPDIReader: reads Microsoft MPD files 
net.sf.mpxj.planner.PlannerReader: reads Planner (XML) files 

写:
net.sf.mpxj.mpx.MPXWriter: writes Microsoft MPX files 
net.sf.mpxj.mspdi.MSPDIWriter: writes Microsoft MSPDI (XML) files 
net.sf.mpxj.planner.PlannerWriter: writes Planner (XML) files 

所以,目前可以做的就是:
1.读取MPP文件信息,写入DB之类的……
2.new 一个ProjectFile,写入Task,Resources,Calendar之类的信息,
然后使用MPXWriter写入MPX文件,然后用Project打开,好像会有个导入数据的对话框。
……

MPXJ的数据结构:
一个Project由Task,Resources,Calendar构成,Task与Calendar,Resources与Calendar都有关系。
Task和Resources通过ResourceAssignment关联。
===========================================================
下面是使用MPXWrite的一段代码,转载的,参考参考。

package mpx;   
  
import java.util.Locale;   
  
import net.sf.mpxj.DateRange;   
import net.sf.mpxj.Day;   
import net.sf.mpxj.Duration;   
import net.sf.mpxj.FieldType;   
import net.sf.mpxj.ProjectCalendar;   
import net.sf.mpxj.ProjectCalendarHours;   
import net.sf.mpxj.ProjectFile;   
import net.sf.mpxj.ProjectHeader;   
import net.sf.mpxj.Relation;   
import net.sf.mpxj.RelationType;   
import net.sf.mpxj.Resource;   
import net.sf.mpxj.Task;   
import net.sf.mpxj.TaskField;   
import net.sf.mpxj.TimeUnit;   
import net.sf.mpxj.mpx.MPXWriter;   
import net.sf.mpxj.utility.NumberUtility;   
  
public class CreateMPX   
{   
    public CreateMPX()   
    {   
    }   
  
    public static void main(String args[])   
    {   
        try  
        {   
            create("d:\\output.MPX");   
        }   
        catch (Exception ex)   
        {   
            ex.printStackTrace(System.out);   
        }   
    }   
  
       
    private static void create(String filename) throws Exception   
    {   
        ProjectFile file =new ProjectFile();   
                       
        Task task1 = file.addTask();   
        task1.setName("task1");   
        task1.setUniqueID(1);   
        task1.setID(1);   
        task1.setOutlineLevel(task0.getOutlineLevel()+1);   
           
        Task task11 = task1.addTask();   
        task11.setName("task1-1");   
        task11.setDuration(Duration.getInstance(6, TimeUnit.DAYS));   
        task11.setStart(java.sql.Date.valueOf("2008-8-21"));   
        task11.setFinish(java.sql.Date.valueOf("2008-8-26"));   
        task11.setPercentageComplete(NumberUtility.getDouble(90D));   
        task11.setUniqueID(2);   
        task11.setID(2);   
        task11.setResourceNames("one");   
                   
        Task task12 = task1.addTask();   
        task12.setName("task12");   
        task12.setDuration(Duration.getInstance(5, TimeUnit.DAYS));   
        task12.setStart(java.sql.Date.valueOf("2008-8-27"));   
        task12.setFinish(java.sql.Date.valueOf("2008-8-31"));   
        task12.setResourceNames("two");   
        task12.setUniqueID(3);   
        task12.setID(3);   
               
                  //前置关系   
        Relation r=task12.addPredecessor(task11);      
  
             r.setType(RelationType.FINISH_START);   
             r.setTaskUniqueID(task11.getUniqueID());   
           
        ProjectCalendar pc=file.addBaseCalendar();   
           
                  //设置工作日历 这里设的周1-7全部工作,呵呵 如不设默认为5天工作制   
        pc.setName("压榨民工");   
        pc.setWorkingDay(Day.SUNDAY, true);   
        pc.setWorkingDay(Day.MONDAY, true);   
        pc.setWorkingDay(Day.TUESDAY, true);   
        pc.setWorkingDay(Day.WEDNESDAY, true);   
        pc.setWorkingDay(Day.THURSDAY, true);   
        pc.setWorkingDay(Day.FRIDAY, true);   
        pc.setWorkingDay(Day.SATURDAY, true);   
           
        ProjectCalendarHours h1=pc.addCalendarHours(Day.SUNDAY);   
        h1.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START1, ProjectCalendar.DEFAULT_END1));   
        h1.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START2, ProjectCalendar.DEFAULT_END2));   
           
        ProjectCalendarHours h2=pc.addCalendarHours(Day.MONDAY);   
        h2.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START1, ProjectCalendar.DEFAULT_END1));   
        h2.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START2, ProjectCalendar.DEFAULT_END2));   
           
        ProjectCalendarHours h3=pc.addCalendarHours(Day.TUESDAY);   
        h3.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START1, ProjectCalendar.DEFAULT_END1));   
        h3.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START2, ProjectCalendar.DEFAULT_END2));   
           
        ProjectCalendarHours h4=pc.addCalendarHours(Day.WEDNESDAY);   
        h4.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START1, ProjectCalendar.DEFAULT_END1));   
        h4.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START2, ProjectCalendar.DEFAULT_END2));   
           
        ProjectCalendarHours h5=pc.addCalendarHours(Day.THURSDAY);   
        h5.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START1, ProjectCalendar.DEFAULT_END1));   
        h5.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START2, ProjectCalendar.DEFAULT_END2));   
           
        ProjectCalendarHours h6=pc.addCalendarHours(Day.FRIDAY);   
        h6.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START1, ProjectCalendar.DEFAULT_END1));   
        h6.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START2, ProjectCalendar.DEFAULT_END2));   
           
        ProjectCalendarHours h7=pc.addCalendarHours(Day.SATURDAY);   
        h7.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START1, ProjectCalendar.DEFAULT_END1));   
        h7.addDateRange(new DateRange (ProjectCalendar.DEFAULT_START2, ProjectCalendar.DEFAULT_END2));   
           
           
        ProjectHeader ph=file.getProjectHeader();   
        ph.setCalendarName(pc.getName());   
                   
        MPXWriter writer = new MPXWriter();   
             //设置中文   
        writer.setLocale(Locale.CHINESE);   
        writer.write(file, filename);   
    }   
}  


 

评论 COMMENTS
guest394269948
2010/4/6 16:43:03
niu
guest926103251
2010/4/9 17:43:40
为什么把代码中的前置关系去掉后,导入的时间都变了,都是以最早时间为准进行排序的
guest350260060
2010/9/29 20:25:05
有问题 r.setType(RelationType.FINISH_START);
r.setTaskUniqueID(task11.getUniqueID()); 出错
哇嘎嘎
2010/9/30 20:49:29
那段代码是别地方copy过来的,看看大概写法就行了,出错就不管它了,哇哈哈
guest490111117
2011/12/29 9:34:43
mpx的导入是没有问题。那么我要导入mpp文件怎么弄呀?

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved