java 读取 解析微软Project .mpp 文件到甘特图
1.引入价包;
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><!-- 这一个是解析mpp文件的--><dependency><groupId>net.sf.mpxj</groupId><artifactId>mpxj</artifactId><version>5.6.4</version></dependency><dependency><groupId>net.sf.jacob-project</groupId><artifactId>jacob</artifactId><version>1.14.3</version></dependency>
2.解析Task :
package com.xyy.utils;import java.io.Serializable;
import java.util.Date;/*** Created by 14258 on 2017/3/24.*/
public class SchProjectTask implements Serializable {private static final long serialVersionUID = -3323529750871923312L;/*** uuid*/private String id;/*** 编号id*/private String recordId;/*** 唯一id*/private String uniqueId;/*** 父节点编号**/private String parentId;/*** 任务名称**/private String name;/*** 大纲水平*/private Integer level;/*** 工期**/private Number duration;/*** 工期单位*/private String durationTimeUnit;/*** 开始时间**/private Date startTime;/*** 结束时间**/private Date finishTime;/*** 完成百分比**/private Number percentageComplete;/*** 前置任务**/private String predecessors;/*** 所属项目文件id*/private String ProId;//这里写set和get//这里写toStirng方法}
3.要读取的文件的名字和作者,版本号
package com.xyy.utils;import java.io.Serializable;/*** Created by 14258 on 2017/3/24.*/
public class SchProject implements Serializable {private static final long serialVersionUID = -3611636937880845938L;/*** uuid*/private String id;/*** 文件名字*/private String name;/*** 版本号 默认0*/private Integer version;/*** 作者*/private String author;//这里写set和get//这里写toStirng方法
}
4.使用自己写的工具类读取
package com.xyy.utils;import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import com.xyy.TaskBean;
import net.sf.mpxj.*;
import net.sf.mpxj.mpp.MPPReader;
import net.sf.mpxj.mpx.MPXReader;
import net.sf.mpxj.mspdi.MSPDIReader;import java.io.*;
import java.util.ArrayList;
import java.util.List;/*** @Author xuyangyang* @Describe 解析 project* @Date 2017/3/24* @Params * @Return */
public class MppUtil {/*** 顶级的父类Id**/private static final int TOP_PARENTID = 0;/*** 顶级的层次**/private static final int TOP_LEVEL = 1;/*** 导出生成mpp文件存放的路径**/private static final String FILE_PATH = "D:/tempFileSavePath.mpp";/*** 读取项目文件** @param fileName 文件名 绝对路径* @return* @throws FileNotFoundException*/private static ProjectFile readProject(String fileName)throws FileNotFoundException {InputStream is = new BufferedInputStream(new FileInputStream(fileName));is.mark(0);// 下面需要重复使用输入流,所以重新包装并设置重置标记ProjectFile mpx = null;try {mpx = new MPXReader().read(is);} catch (Exception ex) {try {is.reset();// 重置} catch (IOException e) {e.printStackTrace();}}if (mpx == null) {try {mpx = new MPPReader().read(is);} catch (Exception ex) {try {is.reset();} catch (IOException e) {e.printStackTrace();}}}if (mpx == null) {try {mpx = new MSPDIReader().read(is);} catch (Exception ex) {}}return mpx;}/*** 项目文件--获取任务列表** @throws FileNotFoundException* @Author xuyangyang* @Describe* @Date 2017/3/24* @Params fileName 读取.mpp文件路径* @Return*/public static List<SchProjectTask> getTaskList(String fileName) throws FileNotFoundException {ProjectFile file = readProject(fileName);// SchProject schProject = new SchProject();
// schProject.setName(file.getProjectHeader().getProjectTitle());
// schProject.setAuthor(file.getProjectHeader().getAuthor());
// schProject.setVersion(0);List<Task> tasks = file.getChildTasks();List<SchProjectTask> schProjectTaskList = new ArrayList<SchProjectTask>();if (!tasks.isEmpty()) {Task msTask = tasks.get(TOP_PARENTID);schProjectTaskList = listHierarchy(msTask, TOP_PARENTID);}return schProjectTaskList;}/*** 获取任务的子任务** @param parentId 父任务Id* @Author xuyangyang* @Describe* @Date 2017/3/24* @Params task 任务* @Return*/private static List<SchProjectTask> listHierarchy(Task msTask, int parentId) {List<Task> childTasks = msTask.getChildTasks();List<SchProjectTask> schProjectTaskList = new ArrayList<SchProjectTask>();SchProjectTask schProjectTask = null;if (!childTasks.isEmpty()) {for (Task task : childTasks) {schProjectTaskList.add(getTaskBean(schProjectTask, task, parentId));schProjectTaskList.addAll(listHierarchy(task, task.getID()));}}return schProjectTaskList;}/*** 获取任务的具体字段** @Author xuyangyang* @Describe* @Date 2017/3/24* @Params schProjectTask 任务Bean* @Params task 任务* @Params parentId 父类Id* @Return schProjectTask bean;*/private static SchProjectTask getTaskBean(SchProjectTask schProjectTask, Task task, Integer parentId) {schProjectTask = new SchProjectTask();schProjectTask.setRecordId(task.getID().toString());schProjectTask.setUniqueId(task.getUniqueID().toString());schProjectTask.setParentId(parentId.toString());schProjectTask.setName(task.getName());schProjectTask.setDuration(task.getDuration().getDuration());schProjectTask.setDurationTimeUnit(task.getDuration().getUnits().getName());schProjectTask.setStartTime(task.getStart());schProjectTask.setFinishTime(task.getFinish());schProjectTask.setPercentageComplete(task.getPercentageComplete());schProjectTask.setLevel(task.getOutlineLevel());
// schProjectTask.setPredecessors();
// schProjectTask.setProId();List<String> preLists = new ArrayList<String>();List<Relation> predecessors = task.getPredecessors();if (predecessors != null && predecessors.isEmpty() == false) {for (Relation relation : predecessors) {Task tragetTask = relation.getTargetTask();Integer targetTaskRecordId = tragetTask.getID();Integer targetTaskUniqueId = tragetTask.getUniqueID();String m_type = relation.getType().toString();//SS///FSString m_lag = relation.getLag().toString();//10.0d//0.0d//-35.0d// if (m_type.equals("FS")){m_type = "";}
// if (m_lag.equals("0.0d")){m_lag="";}else if(m_lag.equals("")){// }else if (!m_lag.startsWith("-") && !m_lag.equals("0.0d")){m_lag="+"+m_lag;
// }
// String s = " 工作日";
// String predecessor;
// if (m_type.equals("") || m_lag.equals("")){predecessor = targetRaskId.toString();
// } else {predecessor = targetRaskId+m_type+m_lag+s;
// }String predecessor = targetTaskRecordId + ":"+targetTaskUniqueId+":"+ m_type + ":" + m_lag;preLists.add(predecessor);}}schProjectTask.setPredecessors(listToString(preLists));return schProjectTask;}/*** List 转为 String* @Author xuyangyang* @Describe* @Date 2017/3/24* @Params List 对象集合* @Return String*/public static String listToString(List list) {StringBuilder sb = new StringBuilder();if (list != null && list.size() > 0) {for (int i = 0; i < list.size(); i++) {if (i < list.size() - 1) {sb.append(list.get(i) + ",");} else {sb.append(list.get(i));}}}return sb.toString();}/*** 创建mpp文件** @param taskBeanList 任务列表* @throws Exception*/public static void createMppFile(List<TaskBean> taskBeanList) throws Exception {File file = new File(FILE_PATH);if (file.exists()) {file.delete();}if (taskBeanList != null && taskBeanList.size() > 0) {ActiveXComponent app = null;try {app = new ActiveXComponent("MSProject.Application");app.setProperty("Visible", new Variant(false));Dispatch projects = app.getProperty("Projects").toDispatch();Dispatch project = Dispatch.call(projects, "Add").toDispatch();//添加一个项目Dispatch tasks = Dispatch.get(project, "Tasks").toDispatch();//生成一个task集合//生成TaskTaskBean topTaskBean = getTopTaskBean(taskBeanList);createTreeTable(tasks, topTaskBean, TOP_LEVEL, taskBeanList);//另存为Dispatch.invoke(project, "SaveAs", Dispatch.Method, new Object[]{FILE_PATH, new Variant(0)}, new int[1]);} catch (Exception e) {e.printStackTrace();System.out.println("aaaaaaaaaa");} finally {if (app != null)app.invoke("Quit", new Variant[]{});}}}/*** 创建树形结构** @param tasks 任务集合* @param taskBean 任务Bean* @param level 层次* @param taskBeanList 任务列表*/private static void createTreeTable(Dispatch tasks, TaskBean taskBean, int level, List<TaskBean> taskBeanList) {Dispatch task = Dispatch.call(tasks, "Add").toDispatch();setTaskValue(task, taskBean, level);List<TaskBean> sonTaskBeanList = getSonTaskBean(taskBeanList, taskBean);if (!sonTaskBeanList.isEmpty()) {for (TaskBean sonTaskBean : sonTaskBeanList) {createTreeTable(tasks, sonTaskBean, level + 1, taskBeanList);}}}/*** 获取所有的子任务** @param taskBeanList 任务列表* @param parentTaskBean 父级任务Bean* @return*/private static List<TaskBean> getSonTaskBean(List<TaskBean> taskBeanList, TaskBean parentTaskBean) {List<TaskBean> sonTaskBeanList = new ArrayList<TaskBean>();for (TaskBean taskBean : taskBeanList) {if (taskBean.getParentId() == parentTaskBean.getId()) {sonTaskBeanList.add(taskBean);}}return sonTaskBeanList;}/*** 获取顶级任务** @param taskBeanList 任务列表* @return*/private static TaskBean getTopTaskBean(List<TaskBean> taskBeanList) {for (TaskBean taskBean : taskBeanList) {if (taskBean.getParentId() == TOP_PARENTID)return taskBean;}return null;}/*** 给任务设置属性** @param task 任务指针* @param taskBean 任务Bean* @param level 层次*/private static void setTaskValue(Dispatch task, TaskBean taskBean, int level) {Dispatch.put(task, "Name", taskBean.getName());
// Dispatch.put(task, "Duration",Duration.getInstance(5, TimeUnit.DAYS));Dispatch.put(task, "Start", taskBean.getStartTime());Dispatch.put(task, "Finish", taskBean.getFinishTime());
// Dispatch.put(task, "Duration",taskBean.getDuration());
// Dispatch.put(task, "PercentageComplete",NumberUtility.getDouble(taskBean.getPercentageComplete()));Dispatch.put(task, "OutlineLevel", level);Dispatch.put(task, "ResourceNames", taskBean.getResource());}/*** 获取任务中的资源** @param task 任务* @return*/private static String listTaskRes(Task task) {StringBuffer buf = new StringBuffer();List<ResourceAssignment> assignments = task.getResourceAssignments();//获取任务资源列表if (assignments != null && !assignments.isEmpty()) {ResourceAssignment assignment = (ResourceAssignment) assignments.get(0);//只获取第一个资源Resource resource = assignment.getResource();if (resource != null)buf.append(resource.getName());}return buf.toString();}public static void main(String[] args) throws Exception {
// Project project=MppUtil.getTaskList("D:/环境科学楼含机电.mpp");
// List<TaskBean>taskBeanList=project.getTaskBeanList();
// System.out.println(taskBeanList.size());
// for(TaskBean task:taskBeanList){// System.out.println(task);
// }
// createMppFile(taskBeanList);List<SchProjectTask> taskBeanList = MppUtil.getTaskList("D:/环境科学楼含机电.mpp");System.out.println(taskBeanList.size());for (SchProjectTask task : taskBeanList) {System.out.println(task);}// createMppFile(taskBeanList);}
}
5.测试的文件:链接:http://pan.baidu.com/s/1o8sIN1K 密码:wefr
java 读取 解析微软Project .mpp 文件到甘特图相关推荐
- java解析Microsoft Project mpp文件(
背景: 在公司项目中,技术总监之前让我开发了一个甘特图的功能,当然这引用了一个开源的js框架. 我负责的是查找表单,将表单的数据通过递归的方式获取后,然后动态创建一个树形的符合那个js框架的xml文件 ...
- java 读取project_java 导入读取.mpp project文件(甘特图)
写这个的思路是:将.mpp文件中的内容读取出来,我只需要他的一级和二级目录,一级目录.二级目录各一张表,二级目录表存一级目录的主键id,这点和网上其他的方法不太一样,大多数都是一张表就完事的,因为表不 ...
- Java使用mpxj导入.mpp格式的Project文件(甘特图)
最近换工作了,主要的项目都是企业内部为支撑的管理平台,刚入入职没多久,遇到了一个需求,就是导入微软的Project文件,踩过不少坑,所以记录一下,后续还有从数据库导出Project引导文件,也就是xm ...
- java foxpro_java解析FoxPro DBF数据文件
前面的博文中提到过项目中有解析dbf数据文件做导入的需求,由于项目中用到的DBF文件由FoxPro产生,本文的重点也围绕FoxPro的DBF文件展开. 其实网上有相当多的java工具,用于解析dbf文 ...
- java读取系统中指定的文件_java读取jar中指定的文件
Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR ...
- java读取json配置文件_解决:java 读取 resources 下面的 json 文件
前言:java 读取 工程下的配置文件,文件类型为 json(*.json),记录一下始终读取不到 json 文件的坑.maven项目 直接上工具类代码 package com.yule.compon ...
- es elasticsearch 几种常见查询场景 二次分组 java读取es的查询json文件
大家好,我是烤鸭: es中几种常见的查询场景,使用java读取es的json文件进行查询. es 中文使用手册. https://www.elastic.co/guide/cn/elasticsear ...
- java printable_java解析电话薄 VCF文件ENCODING=QUOTED-PRINTABLE编码
posted on 2008-08-04 11:28 青菜猫(孙宇) 阅读(5587) 评论(6) 编辑 收藏 所属分类: java FeedBack: # re: java解析电话薄 VCF文件 ...
- Project Management Library项目管理甘特图控件
2019独角兽企业重金招聘Python工程师标准>>> Project Management Library是一款项目管理控件,包含了项目管理相关的Windows客户端控件,如:Pr ...
最新文章
- arcgis for android离线编辑,ArcGIS for Android离线数据编辑实现原理
- jQuery应用之(一)使用jQuery选择器(荐)
- Ubuntu下安装和配置Apache2方法简介
- gethostbyname()函数:通过域名获取IP地址
- JVM调优:图解对象内存分配过程
- C语言结构-演员请就位
- adb 的原理以及它总重启等问题详解
- Bean的scope属性
- XP中CPU占用率100%原因及解决方法
- 数据结构学习笔记(转载)
- 【个人笔记】OpenCV4 C++ 快速入门 26课
- c语言函数调用用法大全,C语言函数
- 一键抓取网页的所有图片
- linux kobject 原理,Linux设备驱动模型 - kobject原理与实例分析_Linux编程_Linux公社-Linux系统门户网站...
- 优雅使用Jsdelivr/CDN加速博客访问速度
- 【转】欧盟物联网研究战略路线图(3)
- 用“心”迎接情人节,用另一种形式表达爱意
- Android下监听返回键、home键、任务键
- C# Parellel.For 和 Parallel.ForEach
- 数据在内存中的存储形式
热门文章
- 安卓android+rom定制,移植,安卓Android ROM定制移植教程。.doc
- 杭电计算机专业期末考试助攻,杭电嘻哈:舶来文化亦可玩出小清新
- 国际化翻译navigator.language与语种对照表
- latex大括号 多行公式_如何快速入门 LaTeX,在 XMind 2020 中轻松输入方程。
- 美国俚语:Keep your eyes peeled什么意思?_
- postgresql 数据库表隐藏列 oid、tableoid、ctid、xmin、xmax、cmin、cmax
- 【docker】虚拟化和docker容器概念
- Basic grammar of Python day2
- html 手指状态,HTML5技术教程 手指按下和手指抬起触发事件
- 百度DuerOS硅谷公布普罗米修斯计划,100万美金基金吸引AI才俊