使用mpxj读取MSPrjoect
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的更多相关文章
- ubuntu源码安装jdk8
最近学习java,想起来没有在Ubuntu上使用过 因此想安装下环境,并在Ubuntu上试用MPXJ读取mpp文件 1.安装 下载jdk8 https://www.oracle.com/technet ...
- .NET读取Project 2007 MPP项目文件
Project文件读取: 方法1:Microsoft.Project.OLEDB.11.0 string strConn = "Provider=Microsoft.Project.OLED ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
- 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)
Web.config的读取 对于Web.config的读取大家都很属性了.平时我们用得比较多的就是appSettings节点下配置.如: 我们对应的代码是: = ConfigurationManage ...
- Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。
场景:有三个市场(Global.China.USA),对前台传过来的数据有些验证需要细化到每个市场去完成. 所以就出现了基类(Global)和派生类(China.USA) 定义基类(Global)Pe ...
- HTML中上传与读取图片或文件(input file)----在路上(25)
input file相关知识简例 在此介绍的input file相关知识为: 上传照片及文件,其中包括单次上传.批量上传.删除照片.增加照片.读取图片.对上传的图片或文件的判断,比如限制图片的张数.限 ...
- Win.ini和注册表的读取写入
最近在做打包的工作,应用程序的配置信息可以放在注册表文件中,但是在以前的16位操作系统下,配置信息放在Win.ini文件中.下面介绍一下Win.ini文件的读写方法和注册表的编程. 先介绍下Win.i ...
- spring无法读取properties文件数据
只讲述异常点,关于怎么配置文件,这里不做说明. 1. controller中无法读取config.properties文件 controller中注入的@Value配置是从servlet-cont ...
- 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中
#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...
随机推荐
- 01Hibernate
Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自 ...
- iis如何在dos中注册
iis如何在dos中注册 2009-09-23 08:13 提问者采纳 cd \cd c:\windows\microsoft.net\framework\v2.0.50727aspnet_r ...
- [Python3网络爬虫开发实战] 1.5.2-PyMongo的安装
在Python中,如果想要和MongoDB进行交互,就需要借助于PyMongo库,这里就来了解一下它的安装方法. 1. 相关链接 GitHub:https://github.com/mongodb/m ...
- db2,差集
--漏报的数据 FROM A LEFT JOIN A′ ON 交集的条件 WHERE A′.xx IS NULL --多报的数据 FROM A′ LEFT JOIN A ON 交集的条件 WHERE ...
- 微信小程序 传值取值的方法总结
微信小程序 传值取值的几种方法总结 列表index下标取值 页面传值 form表单取值 1. 列表index下标取值 实现方式是:data-index="{{index}}"挖坑及 ...
- LINUX:Contos7.0 / 7.2 LAMP+R 下载安装Mysql篇
文章来源:http://www.cnblogs.com/hello-tl/p/7569097.html 更新时间:2017-09-21 16:06 简介 LAMP+R指Linux+Apache+Mys ...
- 如何用nfs命令烧写内核和文件系统(网络下载文件到nandflash)(未完)
使用tftp下载烧写 a.设uboot里的ip地址 set ipaddr 192.168.1.17(uboot的ip设置成同网段) set serverip 192.168.1.5(电脑本机作为服务i ...
- c# TcpClient简易聊天工具
说明: TcpClient 链接是一个比较安全稳定的链接,作为聊天或者是数据稳定传输,是比较合适的,下面的代码测试过,如果你吧他放在公网服务器上,也是可以用的 using System; using ...
- sqlite3 新建数据库的过程
有些东西,很简单,不过有坑,就变复杂了.我先说最简单的方法,新建一个空的txt文档,然后把后缀改为db就可以了.-_-蛋疼,其实一开始我是不知道的,也是后来成功新建db后发现db为0kb才大胆地做了这 ...
- codeforces 369B
#include<stdio.h>//题没读懂,没做出来 int main() { int n,k,l,r,s,s1,m,a,i; while(scanf("%d%d% ...