php解析出带层级关系的mpp文件
本来要使用DHX gantt插件自带的API做导入,可是做完后,又发现不稳定,不能访问了
可能是屏蔽掉了
所以又想起可以使用javaBridge,借用java的MPXJ
php解析mpp的 上一篇介绍
1.简单输出所有任务

$file_path = "aa.mpp";
require_once 'http://localhost:8089/JavaBridge/java/Java.inc';
$data = array();
if (empty($file_path)) {
return $data;
}
$mppRead = new Java('net.sf.mpxj.mpp.MPPReader');
$Filecontent = $mppRead->read($file_path);
$Alltasks = $Filecontent->getAllTasks();
$Tasks_size = java_values($Alltasks->size());
for ($i = ; $i < $Tasks_size; $i++) {
$separator = '|';
$tmp= getResource($Alltasks[$i]);
$items = array();
$items['id'] = $Alltasks[$i]->getID().'';
$items['level'] = $Alltasks[$i]->getOutlineLevel().'';
$items['uniqueID'] = $Alltasks[$i]->getUniqueID().'';
$items['name'] = $Alltasks[$i]->getName().'';
$items['duration'] = $Alltasks[$i]->getDuration().'';
$items['start'] = $Alltasks[$i]->getStart().'';
$items['finish'] = $Alltasks[$i]->getFinish().'';
$items['percentComplete'] = $Alltasks[$i]->getPercentageComplete().'';
$data[] = $items;
}
var_dump(json_encode($data));

这种解析的方式,忽略了微软Project允许用户创建的分层任务结构,虽然level可以表明他处于第几级
所以需要改进
2.输出带层级关系所有任务
将子任务放到children里
$file_path = "aa.mpp";
require_once 'http://localhost:8089/JavaBridge/java/Java.inc';
$data = array();
if (empty($file_path)) {
return $data;
}
$mppRead = new Java('net.sf.mpxj.mpp.MPPReader');
$Filecontent = $mppRead->read($file_path);
$Alltasks = $Filecontent->getChildTasks();
$Tasks_size = java_values($Alltasks->size());
$data = array();
if($Tasks_size){
$children = getChildren($Alltasks[]);
if($children){
$data = $children;
}
}
var_dump(json_encode($data));die;
function getChildren($task){
$child = $task->getChildTasks();
$Tasks_size = java_values($child->size());
$data = array();
$formatter = new Java('java.text.SimpleDateFormat', "yyyy-MM-dd HH:mm:ss");
for ($i = ; $i < $Tasks_size; $i++) {
$separator = '|';
$tmp= getResource($child[$i]);
$items = array();
$items['id'] = $child[$i]->getID().'';
$items['level'] = $child[$i]->getOutlineLevel().'';
$items['uniqueID'] = $child[$i]->getUniqueID().'';
$items['name'] = $child[$i]->getName().'';
$items['duration'] = $child[$i]->getDuration().'';
$start = $child[$i]->getStart();
$items['start'] = $formatter->format($start).'';
$finish = $child[$i]->getFinish();
$items['finish'] = $formatter->format($finish).'';
$items['percentComplete'] = $child[$i]->getPercentageComplete().'';
$children = getChildren($child[$i]);
if($children){
$items['children'] = $children;
}
$data[] = $items;
}
return $data;
}

解析后输出的json结构式带有层级关系的
说明:
$Alltasks = $Filecontent->getChildTasks();获取到的是文件的信息,一般就一个元素,
把$Alltasks[0]传给getChildren()获取的就是任务了
$Alltasks = $Filecontent->getChildTasks();
$Tasks_size = java_values($Alltasks->size());
$formatter = new Java('java.text.SimpleDateFormat', "yyyy-MM-dd HH:mm:ss");
for ($i = ; $i < $Tasks_size; $i++) {
$separator = '|';
$tmp= getResource($Alltasks[$i]);
$items = array();
$items['id'] = $Alltasks[$i]->getID().'';
$items['level'] = $Alltasks[$i]->getOutlineLevel().'';
$items['uniqueID'] = $Alltasks[$i]->getUniqueID().'';
$items['name'] = $Alltasks[$i]->getName().'';
$items['duration'] = $Alltasks[$i]->getDuration().'';
$start = $Alltasks[$i]->getStart();
$items['start'] = $formatter->format($start).'';
$finish = $Alltasks[$i]->getFinish();
$items['finish'] = $formatter->format($finish).'';
$items['percentComplete'] = $Alltasks[$i]->getPercentageComplete().'';
$data[] = $items;
} var_dump(json_encode($data));die;


输出的和用project看到的内容是一样的
MPXJ这个插件的功能还有很多,还有待继续研究
php解析出带层级关系的mpp文件的更多相关文章
- 【DB2】国标行业分类存储,通过SQL查询出层级关系
新建表 DROP TABLE Industry; CREATE TABLE Industry( IndustryCode VARCHAR(40),IndustryName VARCHAR(100),P ...
- Android事件分发机制完全解析,带你从源码的角度彻底理解
Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...
- [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...
- Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)
http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...
- Android ListView工作原理完全解析,带你从源码的角度彻底理解
版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[+] Adapter的作用 RecycleBin机制 第一次Layout 第二次Layout 滑动加载更多数据 转载请注明出处:h ...
- Android ListView工作原理全然解析,带你从源代码的角度彻底理解
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android全部经常使用的原生控件其中.使用方法最复杂的应该就是 ...
- Android AsyncTask完全解析,带你从源码的角度彻底理解
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11711405 我们都知道,Android UI是线程不安全的,如果想要在子线程里进 ...
- Unity NGUI和UGUI与模型、特效的层级关系
目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...
- MFC窗口的父子关系和层级关系
一直对窗口之间的关系有些混乱,遇到需要指定父窗口的函数时常常要考虑很久,究竟父窗口是哪个窗口,遂上网查资料,略有所悟,简记如下: 对话框中的所有控件(比如Button等)都是其子窗口. ...
随机推荐
- spring mvc之请求过程源码分析
简介 上一篇,我们分析了spring mvc启动过程的源码,这一节,来一起分析下在用户请求controller的过程中,spring mvc做了什么事? 一.准备 我写这么一个controller p ...
- 设置定时任务(Timer类的介绍)
设置定时任务(Timer类的介绍) 在我们的很多项目中,我们都须要用到定时任务,因此想借此博文来对定时任务进行一个介绍. 设置定时任务过程例如以下: 先new一个Timer对象 Timer timer ...
- [Linux基础环境/软件]Linux下安装resin web服务器(涉及gcc、jdk环境部署)
由于Ubuntu自带是没有jdk和gcc编译器的,而安装resin需要C编译器和jdk的支持,而且resin本身是java写的.另外我本身的网站是zip打包的,所以linux也要安装了gcc.jdk. ...
- C语言 · 判断回文
算法提高 判断回文 时间限制:1.0s 内存限制:512.0MB 编程判断一个字符串是否是回文,当字符串是回文时,输出字符串:yes!,否则输出字符串:no!.所谓回文即正向与反向的 ...
- C语言 · 征税程序
算法提高 征税程序 时间限制:1.0s 内存限制:512.0MB 问题描述 税务局希望你帮他们编写一个征税程序,该程序的功能是:首先输入某公司的年销售额sale和税率rate,然后程 ...
- vba的一个File操作类
Option Explicit '-------------------------------------------------------- '[Class name]: clsTxtFile ...
- CREATESTRUCT cs 结构体
PreCreateWindow(CREATESTRUCT& cs) typedef struct tagCREATESTRUCT { LPVOID lpCreateParams; // 创建窗 ...
- 《C++程序设计教程——给予Visual Studio 2008》读书笔记1,2章
double *p1; //p1为指向double型的指针变量 POINT *p2; //p2为指向POINT型(点类型)的指针变量 int (*p3)[6]; //p ...
- sparkR集群启动脚本的封装。
sparkR默认是以单机方式运行的.实现sparkR的集群启动,需要指定master地址,占用内存.CPU,及UI端口等,这对分析人员来说是比较麻烦的. 如何实现对其启动的封装,方便分析人员来使用: ...
- linux c 检测网络状态
转自:http://stackoverflow.com/questions/808560/how-to-detect-the-physical-connected-state-of-a-network ...