java解析Microsoft Project mpp文件(
2013-11-13 10:18
295 查看
背景:
在公司项目中,技术总监之前让我开发了一个甘特图的功能,当然这引用了一个开源的js框架。
我负责的是查找表单,将表单的数据通过递归的方式获取后,然后动态创建一个树形的符合那个js框架的xml文件,再加上前台的一些技术,eg:Ajax 、 jQuery 、Extjs....就OK了!
后来,技术总监说为了方便客户,让用户只需要用微软(Microsoft)的Project 工具,创建项目和任务计划的相关信息,即生成的就是一个mpp文件,导入到项目中,就可以转换成之前开发的甘特图来显示。即就是要解析
用户导入的Project mpp文件,获取其中的信息,然后入库
说明:
我写了一个在我们公司项目中比较通用的一个java静态类来解析,然后由业务层来调用,这个类的功能就只是
负责解析文件,至于保存入库,每个公司都有自己的方式,我就不展示代码了........
------------------------------------------------------------------------------------------------
代码如下:
----------------------------------
package com.cinsea.parsempp.ext;
import com.cinsea.exception.DataOperationException;
import net.sf.mpxj.*;
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 net.sf.mpxj.mpp.MPPReader;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public static class ParseProjectMpp{
public static List psrseProjectFile(File mppfile){
List list = new ArrayList();
MPPReader reader = new MPPReader();
ProjectFile projectFile;
try{
projectFile = reader.read(mppfile);
List taskList = projectFile.getAllTasks();
for(Task task : taskList){
Map map = new HashMap();
map.put("id",task.getID());
map.put("taskName",task.getName());
map.put("startDate",task.getStart());
map.put("endDate",task.getFinish());
map.put("beforeTask",getBeforeTaskId(task));//获取前置任务的Id
map.put("resource",getResources(task));//获得资源
list.add(map);
}
}catch(MPXJException e ){
e.printStackTrace();
}
return list;
}
private static String getBeforeTaskId(Task task){
StringBuffer beforeTaskId = new StringBuffer();
if(task!=null){
List list = task.getPredecessors();
if(list != null ){
if(list.size()>0){
for(int i=0; i<list.size(); i++){
Relation relation = (Relation)list.get(i);
beforeTaskId.append(relation.getTargetTask().getID());
}
}
}
}
return beforeTaskId.toString();
}
private static String getResources(Task task){
if(task == null){
return "";
}
StringBuffer sb = new StringBuffer();
List assignments = task.getResourceAssignments();
for(ResourceAssignment ra : assignments){
Resource resource = ra.getResource();
if(resource != null){
sb = sb.append(resource.getName());
}
}
return sb.toString();
}
}
在公司项目中,技术总监之前让我开发了一个甘特图的功能,当然这引用了一个开源的js框架。
我负责的是查找表单,将表单的数据通过递归的方式获取后,然后动态创建一个树形的符合那个js框架的xml文件,再加上前台的一些技术,eg:Ajax 、 jQuery 、Extjs....就OK了!
后来,技术总监说为了方便客户,让用户只需要用微软(Microsoft)的Project 工具,创建项目和任务计划的相关信息,即生成的就是一个mpp文件,导入到项目中,就可以转换成之前开发的甘特图来显示。即就是要解析
用户导入的Project mpp文件,获取其中的信息,然后入库
说明:
我写了一个在我们公司项目中比较通用的一个java静态类来解析,然后由业务层来调用,这个类的功能就只是
负责解析文件,至于保存入库,每个公司都有自己的方式,我就不展示代码了........
------------------------------------------------------------------------------------------------
代码如下:
----------------------------------
package com.cinsea.parsempp.ext;
import com.cinsea.exception.DataOperationException;
import net.sf.mpxj.*;
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 net.sf.mpxj.mpp.MPPReader;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public static class ParseProjectMpp{
public static List psrseProjectFile(File mppfile){
List list = new ArrayList();
MPPReader reader = new MPPReader();
ProjectFile projectFile;
try{
projectFile = reader.read(mppfile);
List taskList = projectFile.getAllTasks();
for(Task task : taskList){
Map map = new HashMap();
map.put("id",task.getID());
map.put("taskName",task.getName());
map.put("startDate",task.getStart());
map.put("endDate",task.getFinish());
map.put("beforeTask",getBeforeTaskId(task));//获取前置任务的Id
map.put("resource",getResources(task));//获得资源
list.add(map);
}
}catch(MPXJException e ){
e.printStackTrace();
}
return list;
}
private static String getBeforeTaskId(Task task){
StringBuffer beforeTaskId = new StringBuffer();
if(task!=null){
List list = task.getPredecessors();
if(list != null ){
if(list.size()>0){
for(int i=0; i<list.size(); i++){
Relation relation = (Relation)list.get(i);
beforeTaskId.append(relation.getTargetTask().getID());
}
}
}
}
return beforeTaskId.toString();
}
private static String getResources(Task task){
if(task == null){
return "";
}
StringBuffer sb = new StringBuffer();
List assignments = task.getResourceAssignments();
for(ResourceAssignment ra : assignments){
Resource resource = ra.getResource();
if(resource != null){
sb = sb.append(resource.getName());
}
}
return sb.toString();
}
}
相关文章推荐
- struts2的DevMode模式
- spring+hibernate出错小结:
- org.springframework.core.NestedIOException
- Java读取xls文件
- jsp 页面怎么得到spring BindingResult 里面的错误消息?
- 对于eclipse选择服务器的问题eclipse Cannot create a server using the selected type
- Java Serializable(序列化)
- org.eclipse.debug.core.DebugException: 检索数组的组件类型时发生 com.sun.jdi.
- java 从零开始,学习笔记之基础入门<异常>(十五)
- java算法3_蒙特卡洛方法(Monte Carlo method)求PI和椭圆面积
- javafx 不规则窗体实现
- Struts2整合百度在线编辑器上传不了文件问题
- jsonp调用及后台java返回
- Eclipse智能提示
- eclipse+ADT 进行android应用签名打包详解
- Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
- myeclipse 运行问题
- JAVA socket编程实例
- Java自学视频整理(持续更新中...)
- java项目视频