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 文件到甘特图相关推荐

  1. java解析Microsoft Project mpp文件(

    背景: 在公司项目中,技术总监之前让我开发了一个甘特图的功能,当然这引用了一个开源的js框架. 我负责的是查找表单,将表单的数据通过递归的方式获取后,然后动态创建一个树形的符合那个js框架的xml文件 ...

  2. java 读取project_java 导入读取.mpp project文件(甘特图)

    写这个的思路是:将.mpp文件中的内容读取出来,我只需要他的一级和二级目录,一级目录.二级目录各一张表,二级目录表存一级目录的主键id,这点和网上其他的方法不太一样,大多数都是一张表就完事的,因为表不 ...

  3. Java使用mpxj导入.mpp格式的Project文件(甘特图)

    最近换工作了,主要的项目都是企业内部为支撑的管理平台,刚入入职没多久,遇到了一个需求,就是导入微软的Project文件,踩过不少坑,所以记录一下,后续还有从数据库导出Project引导文件,也就是xm ...

  4. java foxpro_java解析FoxPro DBF数据文件

    前面的博文中提到过项目中有解析dbf数据文件做导入的需求,由于项目中用到的DBF文件由FoxPro产生,本文的重点也围绕FoxPro的DBF文件展开. 其实网上有相当多的java工具,用于解析dbf文 ...

  5. java读取系统中指定的文件_java读取jar中指定的文件

    Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR ...

  6. java读取json配置文件_解决:java 读取 resources 下面的 json 文件

    前言:java 读取 工程下的配置文件,文件类型为 json(*.json),记录一下始终读取不到 json 文件的坑.maven项目 直接上工具类代码 package com.yule.compon ...

  7. es elasticsearch 几种常见查询场景 二次分组 java读取es的查询json文件

    大家好,我是烤鸭: es中几种常见的查询场景,使用java读取es的json文件进行查询. es 中文使用手册. https://www.elastic.co/guide/cn/elasticsear ...

  8. java printable_java解析电话薄 VCF文件ENCODING=QUOTED-PRINTABLE编码

    posted on 2008-08-04 11:28 青菜猫(孙宇) 阅读(5587) 评论(6)  编辑  收藏 所属分类: java FeedBack: # re: java解析电话薄 VCF文件 ...

  9. Project Management Library项目管理甘特图控件

    2019独角兽企业重金招聘Python工程师标准>>> Project Management Library是一款项目管理控件,包含了项目管理相关的Windows客户端控件,如:Pr ...

最新文章

  1. arcgis for android离线编辑,ArcGIS for Android离线数据编辑实现原理
  2. jQuery应用之(一)使用jQuery选择器(荐)
  3. Ubuntu下安装和配置Apache2方法简介
  4. gethostbyname()函数:通过域名获取IP地址
  5. JVM调优:图解对象内存分配过程
  6. C语言结构-演员请就位
  7. adb 的原理以及它总重启等问题详解
  8. Bean的scope属性
  9. XP中CPU占用率100%原因及解决方法
  10. 数据结构学习笔记(转载)
  11. 【个人笔记】OpenCV4 C++ 快速入门 26课
  12. c语言函数调用用法大全,C语言函数
  13. 一键抓取网页的所有图片
  14. linux kobject 原理,Linux设备驱动模型 - kobject原理与实例分析_Linux编程_Linux公社-Linux系统门户网站...
  15. 优雅使用Jsdelivr/CDN加速博客访问速度
  16. 【转】欧盟物联网研究战略路线图(3)
  17. 用“心”迎接情人节,用另一种形式表达爱意
  18. Android下监听返回键、home键、任务键
  19. C# Parellel.For 和 Parallel.ForEach
  20. 数据在内存中的存储形式

热门文章

  1. 安卓android+rom定制,移植,安卓Android ROM定制移植教程。.doc
  2. 杭电计算机专业期末考试助攻,杭电嘻哈:舶来文化亦可玩出小清新
  3. 国际化翻译navigator.language与语种对照表
  4. latex大括号 多行公式_如何快速入门 LaTeX,在 XMind 2020 中轻松输入方程。
  5. 美国俚语:Keep your eyes peeled什么意思?_
  6. postgresql 数据库表隐藏列 oid、tableoid、ctid、xmin、xmax、cmin、cmax
  7. 【docker】虚拟化和docker容器概念
  8. Basic grammar of Python day2
  9. html 手指状态,HTML5技术教程 手指按下和手指抬起触发事件
  10. 百度DuerOS硅谷公布普罗米修斯计划,100万美金基金吸引AI才俊