本来要使用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文件的更多相关文章

  1. 【DB2】国标行业分类存储,通过SQL查询出层级关系

    新建表 DROP TABLE Industry; CREATE TABLE Industry( IndustryCode VARCHAR(40),IndustryName VARCHAR(100),P ...

  2. Android事件分发机制完全解析,带你从源码的角度彻底理解

    Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...

  3. [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

    Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...

  4. Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

    http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...

  5. Android ListView工作原理完全解析,带你从源码的角度彻底理解

    版权声明:本文出自郭霖的博客,转载必须注明出处.   目录(?)[+] Adapter的作用 RecycleBin机制 第一次Layout 第二次Layout 滑动加载更多数据   转载请注明出处:h ...

  6. Android ListView工作原理全然解析,带你从源代码的角度彻底理解

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android全部经常使用的原生控件其中.使用方法最复杂的应该就是 ...

  7. Android AsyncTask完全解析,带你从源码的角度彻底理解

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11711405 我们都知道,Android UI是线程不安全的,如果想要在子线程里进 ...

  8. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

  9. MFC窗口的父子关系和层级关系

    一直对窗口之间的关系有些混乱,遇到需要指定父窗口的函数时常常要考虑很久,究竟父窗口是哪个窗口,遂上网查资料,略有所悟,简记如下: 对话框中的所有控件(比如Button等)都是其子窗口.        ...

随机推荐

  1. You have not concluded your merge (MERGE_HEAD exists) git拉取失败

    本文转自:http://yijiebuyi.com/blog/5b55eb51ad49ce41e2de9c85dd4513ca.html 今天获取git线上仓库代码报了这个错误: zhangzhi@m ...

  2. Base64与MD5的区别

    Base64和MD5都可用于做信息的简单加密,两者的简单差别如下: Base64 可逆性. 可以将图片等二进制文件转换为文本文件. 可以把非ASCII字符的数据转换成ASCII字符,避免不可见字符. ...

  3. log_bin_trust_function_creators

    log_bin_trust_function_creators错误解决 当有mysql本地或远程建立function或procedure时报上面的错误 或者如果开启了二进制日志,但是用户没有suppe ...

  4. 放弃winform的窗体吧,改用html作界面,桌面应用程序UI的新的开发方式。

    做过很多winform项目,都为winform控件头疼不已.想实现一些漂亮的样子总是很难.我这里列举几个缺点: 1.winform控件大多是 绝对布局 ,你需要给出准确的坐标.那么在实现居中效果就会很 ...

  5. 【jquery】图片前后对比效果——beforeAfter

    今天分享一款 jquery 插件——图片前后对比(beforeAfter),效果如下: 使用方法: <!DOCTYPE HTML> <html lang="en" ...

  6. tabs 标签样式

    http://www.jq22.com/jquery-info17973 http://www.jq22.com/demo/elementTab201801262311/ 插件描述:基于element ...

  7. 【CUDA学习】内核程序调试

    调试工具 cuda-gdb,网上有英文版的说明文档. 其中大部分调试命令和gdb的调试命令相同. cuda程序分为主机端程序和设备端程序,主机端程序调试也就是C语言程序的调试 主要是设备端程序,关键点 ...

  8. Axiom3D:Ogre动画基本流程与骨骼动画

    在Axiom中,Animation类用于管理动画,在此对象中主要管理着AnimationTrack对象,此对象用于管理动画的各种类型的每一桢.在Axiom中,动画类型主要有变形动画,姿态动画,骨骼动画 ...

  9. 【2】JVM-JAVA对象的访问

    Java中对象的访问 JAVA是面向对象的语言,那么在JAVA虚拟机中,存在非常多的对象,对象访问是无处不在的.即时是最简单的访问,也会涉及到JAVA栈.JAVA堆.方法区这三个非常重要的内存区域之间 ...

  10. Spring JDBC RowMapper接口示例

    JdbcTemplate类使用org.springframework.jdbc.core.RowMapper <T>接口在每行的基础上映射ResultSet的行.该接口的实现执行将每行映射 ...