import java.util.ArrayList;

import java.util.Calendar;

import java.util.Hashtable;

import java.util.List;

import net.sf.mpxj.ProjectFile;

import net.sf.mpxj.Relation;

import net.sf.mpxj.Task;

/**

* MSProject工具类

* @author
suhf

*

*/

publicclass MPPUtil {

static Hashtable<String,String>
dependencyTypes =
new Hashtable<String,String>();

publicstaticvoid init(){

dependencyTypes.put("FF",
"3");

dependencyTypes.put("FS",
"2");

dependencyTypes.put("SF",
"1");

dependencyTypes.put("SS",
"0");

}

/**

*
从MPP的Task读数据到数据库的BdTask

* @param task

* @param parentId

* @return

*/

privatestatic 
BdTask fetchTaskData(Task task, String parentId){

BdTask gttTask =new BdTask();

try{

gttTask.setPriority(1);

gttTask.setId(task.getUniqueID().toString());

gttTask.setNumbers(task.getID());

gttTask.setName(task.getName());

Double doub = Double.parseDouble(task.getDuration().toString().replaceAll("(?!\\.)[\\D]",
""));

gttTask.setDuration(doub.floatValue());

gttTask.setDurationUnit(task.getDuration().getUnits().toString());

Double effort = gttTask.getDuration()*8.0;

gttTask.setEffort(effort.intValue());

gttTask.setNote(task.getNotes());

gttTask.setPercentDone((task.getPercentageComplete().doubleValue()));

Calendar startDate = Calendar.getInstance();

Calendar endDate = Calendar.getInstance();

if(task.getMilestone()){//是里程碑

gttTask.setMilestone("1");

startDate.setTime(task.getStart());

//startDate.add(Calendar.DAY_OF_MONTH, 1);

endDate.setTime(task.getFinish());

//endDate.add(Calendar.DAY_OF_MONTH, 1);

}else{

gttTask.setMilestone("0");

startDate.setTime(task.getStart());

startDate.set(Calendar.HOUR_OF_DAY, 8);

startDate.set(Calendar.MINUTE, 30);

startDate.set(Calendar.SECOND, 0);

endDate.setTime(task.getFinish());

endDate.set(Calendar.HOUR_OF_DAY, 18);

endDate.set(Calendar.MINUTE, 0);

endDate.set(Calendar.SECOND, 0);

//endDate.add(Calendar.DAY_OF_MONTH, 1);

}

/*startDate.set(startDate.get(Calendar.YEAR),

startDate.get(Calendar.MONTH),

startDate.get(Calendar.DATE), 0, 0, 0);

endDate.set(endDate.get(Calendar.YEAR),

endDate.get(Calendar.MONTH),

endDate.get(Calendar.DATE), 0, 0, 0);*/

gttTask.setStartDate(DateFormatUtil.formatDateToString(startDate.getTime(), DateFormatUtil.V_LONG_DATE));

gttTask.setEndDate(DateFormatUtil.formatDateToString(endDate.getTime(), DateFormatUtil.V_LONG_DATE));

读取资源名称

/*List<ResourceAssignment> l = 
task.getResourceAssignments();

for (ResourceAssignment
ra : l) {

Resource r = ra.getResource();

if(r != null)

System.out.println(r.getName()+"--"+task.getName());

}*/

gttTask.setParentId(task.getParentTask().getUniqueID().toString()) ;

}catch(Exception e){

e.printStackTrace();

// System.exit(0);

}

return gttTask;

}

/**

*
获取项目计划任务数据

* @param projectFile MPP文件对象

* @return

* @throws Exception

*/

publicstatic List<BdTask> getTaskData(ProjectFile projectFile)
throws Exception{

List<BdTask> list =
new
ArrayList<BdTask>();

//这里有两层嵌套

for(Task tempTask :projectFile.getChildTasks())

{

int idx = 0;

for (Task task : tempTask.getChildTasks()) {

//加入最上层任务节点,
第三个參数parentId=0

BdTask gttTask =
fetchTaskData
(task,"");

//设置节点在姊妹节点下的顺序

gttTask.setIndexs(idx++);

//加入到数据库中

list.add(gttTask);

//递归调用

listHierarchy(task, list, gttTask.getId());

}

}

return list;

}

privatestatic List<BdTask> listHierarchy(Task task,List<BdTask> list, String parentId){

//节点的先后顺序

int idx = 0;

for (Task child : task.getChildTasks()) {

BdTask gttTask = fetchTaskData(child,parentId);

//设置任务的先后顺序

gttTask.setIndexs(idx++);

list.add(gttTask);

listHierarchy(child, list , parentId);

}

return list;

}

/**

*
获取项目计划任务关联数据

* @param projectFile MPP文件对象

* @return

* @throws Exception

*/

publicstatic List<BdDependency> getBdDependencyDate(ProjectFile projectFile){

List<BdDependency> list =
new
ArrayList<BdDependency>();

MPPUtil.init();//初始化MPP任务关联相应Gantt图的编号

//节点之间的关系

for (Task task : projectFile.getAllTasks()) {

List<Relation> predecessors = task.getPredecessors();

if (predecessors !=
null && predecessors.isEmpty() ==
false){

for (Relation relation : predecessors){

BdDependency dep =
new BdDependency();

dep.setToId(relation.getSourceTask().getUniqueID().toString());

dep.setFromId(relation.getTargetTask().getUniqueID().toString());

dep.setType(getDependencyType(relation.getType().toString()));

list.add(dep);

}

}

}

return list;

}

static String getDependencyType(String content){

Object ret = dependencyTypes.get(content);

return ret.toString();

}

}

使用mpxj读取MSPrjoect的更多相关文章

  1. ubuntu源码安装jdk8

    最近学习java,想起来没有在Ubuntu上使用过 因此想安装下环境,并在Ubuntu上试用MPXJ读取mpp文件 1.安装 下载jdk8 https://www.oracle.com/technet ...

  2. .NET读取Project 2007 MPP项目文件

    Project文件读取: 方法1:Microsoft.Project.OLEDB.11.0 string strConn = "Provider=Microsoft.Project.OLED ...

  3. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

  4. 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)

    Web.config的读取 对于Web.config的读取大家都很属性了.平时我们用得比较多的就是appSettings节点下配置.如: 我们对应的代码是: = ConfigurationManage ...

  5. Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。

    场景:有三个市场(Global.China.USA),对前台传过来的数据有些验证需要细化到每个市场去完成. 所以就出现了基类(Global)和派生类(China.USA) 定义基类(Global)Pe ...

  6. HTML中上传与读取图片或文件(input file)----在路上(25)

    input file相关知识简例 在此介绍的input file相关知识为: 上传照片及文件,其中包括单次上传.批量上传.删除照片.增加照片.读取图片.对上传的图片或文件的判断,比如限制图片的张数.限 ...

  7. Win.ini和注册表的读取写入

    最近在做打包的工作,应用程序的配置信息可以放在注册表文件中,但是在以前的16位操作系统下,配置信息放在Win.ini文件中.下面介绍一下Win.ini文件的读写方法和注册表的编程. 先介绍下Win.i ...

  8. spring无法读取properties文件数据

    只讲述异常点,关于怎么配置文件,这里不做说明.   1. controller中无法读取config.properties文件 controller中注入的@Value配置是从servlet-cont ...

  9. 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

随机推荐

  1. hdfs深入:02、今日课程内容大纲以及hdfs的基本实现

    1.hadoop第三天课程内容 hdfs:分布式文件存储系统hdfs的架构图hdfs的副本机制以及block块hdfs的元数据信息fsimage与editshdfs的文件读写过程hdfs的javaAP ...

  2. eclipse 的开发环境配置

    一.基础环境设置 1.jdk下载配置 2.JRE下载配置 3.Eclipse下载 4.Eclipde 与JRE配置,见图 二.PHP环境设置 1.apache + PHP 配置. 详见随笔文章:Ecl ...

  3. iOS 导航栏风格

    IOS-导航栏风格 导航控制器可以用几种不同的风格来显示自身.默认风格就是标准的灰色外观.目前支持三种不同的风格. 风    格 描    述 UIBarStyleDefault 默认风格:灰色背景, ...

  4. 通过JS判断联网类型和连接状态的实现代码

    <!DOCTYPE HTML><html xmlns="http://www.w3.org/1999/xhtml" lang="en"> ...

  5. Spring中注解注入bean和配置文件注入bean

    注解的方式确实比手动写xml文件注入要方便快捷很多,省去了很多不必要的时间去写xml文件 按以往要注入bean的时候,需要去配置一个xml,当然也可以直接扫描包体,用xml注入bean有以下方法: & ...

  6. [Python3网络爬虫开发实战] 1.3.2-Beautiful Soup的安装

    Beautiful Soup是Python的一个HTML或XML的解析库,我们可以用它来方便地从网页中提取数据.它拥有强大的API和多样的解析方式,本节就来了解下它的安装方式. 1. 相关链接 官方文 ...

  7. Go:struct

    一.使用方式 方式3和方式4返回的是:结构体指针,编译器底层对 p.Name 做了转化 *(p).Name,方便程序员使用. type Person struct { Name string Age ...

  8. 解决在使用Amoeba遇到的问题

    最近有同行在使用Amoeba 的过程中多少遇到了一些问题. 总结一下遇到问题的解决方法: 1.读写分离的时候设置的在queryRouter中设置无效? 读写分离配置的优先级别:        1)满足 ...

  9. Linux下汇编语言学习笔记6 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  10. Linux下汇编语言学习笔记25 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...