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等)都是其子窗口. ...
随机推荐
- Jquery的回调函数的使用
用$.Callbacks实现观察者模式 // 观察者模式 var observer = { hash: {}, subscribe: function(id, callback) { if (type ...
- WPF委托命令DelegateCommand的传参方式
首先引用 Microsoft.Practices.Prism MVVM模式代码如下: XAML代码: <!-- 无参方式 --> <Button Content="Tes ...
- Putty远程SSH免密码方式链接Linxu
1.首先确保Linxu服务器安装了ssh服务,可以输入ssh命令测试. ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spe ...
- MVC的JavaScriptResult使用
JavaScriptResult的使用有两个必要的前提: 1.Ajax 2.jquery.unobtrusive-ajax.js 使用代码示例 controller public ActionResu ...
- mongoDB之监控工具mongostat
mongostat是mongdb自带的状态检测工具,在命令行下使用.它会间隔固定时间获取mongodb的当前运行状态,并输出.如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mon ...
- JS不同浏览器图片载入处理
//不同浏览器图片加载判断 p.loadImgVerify = function(oimg,fn){ //载入发起请求 加入JS单线程队列事件(当状态满足时候执行些事件) if (qp_shared. ...
- Python 类的多态
#python的多态 class Dog(): def eat(self): print("i am dog , eat something . ") class Cat(): d ...
- 自然语言交流系统 phxnet团队 创新实训 个人博客 (六)
讯飞的语音sdk是需要申请的,地址是:http://dev.voicecloud.cn/developer.php?vt=1 .申请一个讯飞的开发者账号,然后申请一个appid,申请的时候需要填写开发 ...
- USB2.0学习笔记连载(十八):keil实现寄存器的配置及相关函数讲解(二)
其实之前也有提及过,Cypress公司提供的官方文件和应用手册真的可以解决很多问题.做的也很人性化,操作也及其简单,几乎只要在 TD_int()里面配置一些常用的参数即可,其他都可以不用操作. 作为一 ...
- win8.1系统如何激活
若是系统是win8.1或者win8系统,可能由于产品过期或者采用的系统不是正版的话,会出现windows 未激活的状态,想要激活需下载一个win8/win8.1系统 激活工具. http://www. ...