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等)都是其子窗口. ... 
随机推荐
- 点击页面任一地方,js发生响应!
			document.onmousedown = closeAll; function closeAll() { alert("aaaaaaaaaaaa"); } 
- mysql中文进行全文索引支持问题
			先来看看对一个字段做全文索引,作为一个数据库系统需要做哪些工作? 假设一个文章表里面包含几个字段:文章id.文章作者.文章标题.文章内容 比如,我们对文章内容这个字段artilce_content建立 ... 
- Python的自增运算符
			今天在写一个合并两个有血list的时候,使用了while循环,不自觉的使用了i++,自测的时候发现有语法错误,还检查了好几遍,觉得应该没啥错误啊,后来google了一把,恍然大悟,原来Python早就 ... 
- sam9260 adc module
			/* * driver/char/at91_adc.c * * Copyright (C) 2007 Embedall Technology Co., Ltd. * * Analog-to-digit ... 
- python-opencv 图像二值化,自适应阈值处理
			定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果. 一幅图像包括目标物体.背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用 ... 
- IIS 7上部署PHP【后续一】
			在之前成功在windows 2008+iis7环境下部署php的基础上,今天把之前的挂Q网站转移到了这个服务器下. 文件拷贝到服务器后,问题继续出现. 首先出现的问题是,Mysql的数据库名称和账户密 ... 
- _mysql.c:29:20: error: Python.h: No such file or directory
			在Centos系统中安装 pip install MySQL-python 提示: _mysql.c:29:20: error: Python.h: No such file or directory ... 
- R语言基本操作函数(1)变量的基本操作
			1.变量变换 as.array(x),as.data.frame(x),as.numeric(x),as.logical(x),as.complex(x),as.character(x) ... 
- Spring JDBC入门程序
			要了解JdbcTemplate类与Spring JDBC框架相关的概念,下面通过编写一个简单的例子演示如何使用Spring JDBC框架,在这个示例中,将在以student表上实现插入数据和读取数据的 ... 
- (实用)Ubuntu 开启NFS服务
			本文介绍如何在Ubuntu下开启NFS文件系统,从而挂载网络上其他机器的文件系统. NFS, Network File System, 即网络文件系统,通常NFS有提供者和使用者,提供者export自 ... 
