php解析mpp文件
php没有找到相应的包
Java的mpxj可以实现
所以借助JavaBridge.jar JavaBridge介绍
1.安装jdk,设置环境变量(我的版本jdk1.8.0_131)
2.下载mpjx
在http://www.mpxj.org/官网MPXJ in Java,进入下载页
(我的版本mpxj-7.0.2)
解压,将mpxj.jar和lib下面的commons-collections4-4.1.jar、poi-3.17.jar、rtfparserkit-1.10.0.jar放到Java安装目录下的jre/lib/ext下面
测试
aa.mpp

在www/mpp新建mpxjtest.java
import net.sf.mpxj.mpp.*;
import net.sf.mpxj.MPXJException;
import net.sf.mpxj.Resource;
import net.sf.mpxj.ResourceAssignment;
import net.sf.mpxj.Task;
import net.sf.mpxj.ProjectFile;
import java.util.List;
import java.io.*;
public class mpxjtest {
public static void main(String[] args) throws MPXJException {
File file = new File("aa.mpp");
MPPReader mppRead = new MPPReader();
ProjectFile pf = mppRead.read(file);
System.out.println(pf);
List tasks = pf.getAllTasks();
mpxjtest mt = new mpxjtest();
System.out.println("总任务数: " + tasks.size());
System.out.println("ID|任务名|资源|开始时间|结束时间|完成百分比");
for (int i = 1; i < tasks.size(); i++) {
System.out.println(((Task) tasks.get(i)).getUniqueID() + "|" + ((Task) tasks.get(i)).getName() + "|" + mt.getResource((Task) tasks.get(i)) + "|" + ((Task) tasks.get(i)).getStart() + "|" + ((Task) tasks.get(i)).getFinish() + "|" + ((Task) tasks.get(i)).getPercentageComplete());
} }
public String getResource(Task task) {
StringBuffer buf = new StringBuffer();
List assignments = task.getResourceAssignments();
for (int i = 0; i < assignments.size(); i++) {
ResourceAssignment assignment = (ResourceAssignment) assignments .get(i);
Resource resource = assignment.getResource();
if (resource != null) {
buf.append(resource.getName()).append(" ");
}
}
return buf.toString();
}
}

3.php调用java
JavaBridge.jar--用于搭建WEB服务器接口的核心JAVA应用程序包
Java.inc--供PHP语言调用的方法包,主要是Java类
首先运行JavaBridge.jar启动WEB服务器接口,在JavaBridge.jar所在目录运行命令
java -jar JavaBridge.jar SERVLET_LOCAL:
注:
不加SERVLET_LOCAL:8089,默认的就是8080
修改php.ini里的allow_url_include为ON
测试
新建aa.php
<?php
require_once("http://localhost:8080/JavaBridge/java/Java.inc");
$System = java("java.lang.System");
echo $System->getProperties();

成功
注:
要调用自己开发的类,类必须是public类型的。要调用的方法也必须是public类型的
4.php解析mpp
<?php
$fileName = "aa.mpp";
$data = parseMSPJ($fileName);
echo "success";
$fp = fopen('./a.txt', 'a+b');
fwrite($fp, var_export($data, true));
fclose($fp);
function parseMSPJ($fileName)
{
$file_path = $fileName;
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());
// ID|任务名|开始时间|结束时间|完成百分比|资源|工期
for ($i = 1; $i < $Tasks_size; $i++) {
$separator = '|';
$tmp= getResource($Alltasks[$i]);
$string = $Alltasks[$i]->getUniqueID() . $separator . $Alltasks[$i]->getName() . $separator .$tmp.$separator.$Alltasks[$i]->getStart() . $separator . $Alltasks[$i]->getFinish() . $separator . $Alltasks[$i]->getPercentageComplete();
$data[] = explode('|', $string);
}
return $data;
}
function getResource($task)
{
$resource = $task->getResourceAssignments();
$size = java_values($resource->size());
$buf = '';
if($size>0){
for ($i = 0; $i < $size; $i++) {
$tmp = $resource[$i]->getResource();
if(!(java_is_null($tmp))){
$buf[] = $tmp->getName();
}
}
}
return $buf;
}
将解析出的文件内容,写入a.txt
只是简单的解析,还有待完善
php解析mpp文件的更多相关文章
- php解析mpp文件中的多级任务
获取层级的project任务 参考 启动javabridge java -jar JavaBridge.jar SERVLET_LOCAL:8089 1.读取mpp文件 $file_path = & ...
- php解析mpp文件中的资源
获取层级的project任务 参考 启动javabridge java -jar JavaBridge.jar SERVLET_LOCAL: 1.读取mpp文件 $file_path = " ...
- php解析mpp文件中的前置任务
获取层级的project任务 参考 启动javabridge java -jar JavaBridge.jar SERVLET_LOCAL:8089 1.读取mpp文件 $file_path = & ...
- php解析出带层级关系的mpp文件
本来要使用DHX gantt插件自带的API做导入,可是做完后,又发现不稳定,不能访问了 可能是屏蔽掉了 所以又想起可以使用javaBridge,借用java的MPXJ php解析mpp的 上一篇介绍 ...
- 脱离Office约束,C#结合Mpxj组件完美解析MSProject(.mpp)文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- CSharpGL(9)解析OBJ文件并用CSharpGL渲染
CSharpGL(9)解析OBJ文件并用CSharpGL渲染 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...
- Jsoup系列学习(2)-解析html文件
解析html文件 1.当我们通过发送http请求时,有时候返回结果是一个html格式字符串,你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 使用 Jsoup ...
- JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...
随机推荐
- 启动Tomcat报错:class path resource cannot be opened
直接原因:WEB-INF/classes下没有文件,即eclipse项目文件没有发布到Tomcat的文件夹. 根本原因:项目的Java Build Path /Libraries 里tomcat 和j ...
- 中文字符通过URL转给PHP处理,导致中文乱码的解决办法!
在JS中 var content = encodeURI(encodeURI('中文字符')); 在PHP服务端接收 header("Content-type: text/html; cha ...
- C#2.0 Socket套接字编程之实例初探 200
首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以 ...
- IO -阻塞,非阻塞, 同步,异步
转载自: http://blog.csdn.net/historyasamirror/article/details/5778378 同步(synchronous) IO和异步(asynchronou ...
- HashTable浅析
本文转载自: http://rock3.info/blog/2013/12/05/hashtable%E6%B5%85%E6%9E%90/ 一.Hash特点 Hash,就是杂凑算法,Hash(str1 ...
- C#使用BeginInvoke和EndInvoke异步下载和获取返回结果
场景:为了防止UI卡死,使用异步下载文件 问题:采用多线程下载,关闭窗口后下载线程不能停止,线程操作麻烦. 参考:C#客户端的异步操作: http://www.cnblogs.com/fish-li/ ...
- RavenDb学习(四)处理文档相关性
RavenDb是文档型数据库,但是我们常常也需要定义对象之间的关系,那RavenDb当中是如何处理的呢? RavenDb提供了优雅的解决方式,使用正确的话,可以减少数据开销以及网络拥堵 Denorma ...
- Git 克隆操作
我们有一个裸库Git服务器,Tom 也推了他的第一个版本.现在,Jerry 可以查看他的变化.克隆操作的远程存储库创建实例. Jerry 在他的home目录,并创建新的目录,执行克隆操作. [jerr ...
- MVC教程八:母版页(布局页)视图
一.母版页介绍和使用 母版页的扩展名为".cshtml",也叫做视图布局页,它相当于网页的模板.在其他网页中,只要引用了母版页,母版页的页面内容就可以自动显示出来,设计者可以修改引 ...
- 反射setAccessible()方法
java代码中,常常将一个类的成员变量置为private 在类的外面获取此类的私有成员变量的value时,需要注意: 测试类: public class AccessibleTest { privat ...