本来要使用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. [转]MySQL中int(11)最大长度是多少?

    原文地址:https://blog.csdn.net/allenjay11/article/details/76549503 今天在添加数据的时候,发现当数据类型为 int(11) 时,我当时让用户添 ...

  2. 使用Task代替ThreadPool和Thread

    转载:改善C#程序的建议9:使用Task代替ThreadPool和Thread 一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的 ...

  3. CAS (12) —— CAS TicketRegistry使用JPA方案数据源c3p0与JNDI

    CAS (12) -- CAS TicketRegistry使用JPA方案数据源c3p0与JNDI tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 cas版本: ...

  4. c# winform+wcf代理上网的处理

    程序是.net开发的winform工具,分服务器端和客户端,用wcf技术实现数据交互. 客户端是大型公司,内部统一使用代理服务器上网.具体描述为:在IE中设置lan代理服务器才能查询网络数据:登录QQ ...

  5. UMEditor(Ueditor mini)修改图片上传路径

    UMEditor(Ueditor mini)修改图片上传路径 imageUp.ashx string pathbase = "/UpLoad/images/"; //保存文件夹在网 ...

  6. ubuntu14.04 64位 安装搜狗输入法

    deb格式的搜狗输入法,搜狗拼音官网可以下载到 http://pinyin.sogou.com/linux/?r=pinyin (64位) 2.使用deb安装工具gdebi,这个工具能解决所有依赖问题 ...

  7. MFC函数—— CWnd::PreCreateWindow

     CWnd::PreCreateWindow virtual BOOL PreCreateWindow( CREATESTRUCT& cs ); 返回值: 如果要继续窗口的创建过程,则返回非零 ...

  8. [Intellij] Intellij IDEA 使用中遇见的问题

    问题集锦 [IntelliJ IDEA14 + tomcat 设置热部署] 点击deployment查看Deploy at the server startup 中tomcat每次所运行的包是 xxx ...

  9. 为什么c++中,有时可以用类名直接访问非静态成员函数?

    正规的C++语言标准目前(截止到C++14)应该还不支持这种调用方法.目前微软似乎在它的VC++中推行一种叫做C++/CLI的标准,有可能会支持这种调用,如果一定要用这种调用方法的话,还应该用VS20 ...

  10. 在kali linux之下安装wps之后 报错字体缺失

    启动WPS for Linux后,出现提示"系统缺失字体" . 出现提示的原因是因为WPS for Linux没有自带windows的字体,只要在Linux系统中加载字体即可. 第 ...