最近在做一个项目管理的项目,主要是将用户在project文件中写的一些东西,读出来,并将其写入到数据库中。

也是借鉴了好多大佬的思想和代码,感觉自己需要整理一遍,所以,接下来就是表演的时候了。

第一步:首先创建一个实体类TaskInfo,这个类的作用就是将原本project文件中读取出的内置Task填充到自己的TaskInfo中进行处理。

还有这里用的jar包是mpxj。

package com.mammoth.entity;

import java.util.Date;

public class TaskInfo {

    private int project_id;                         // 所属项目ID
private int task_id; // 任务ID
private int task_unique_id; // 任务唯一ID
private String parent_id; // 父任务ID
private String task_type; // 任务类型(FS,SS,FF,SF)
private int task_outline_level; // 任务级别
private String task_name; // 任务名称
private double task_duration; // 任务工期
private String task_start_date; // 任务开始时间
private String task_finish_date; // 任务结束时间
private String task_predecessors; // 任务流
private String task_operator; // 负责人 public int getProject_id() {
return project_id;
}
public void setProject_id(int project_id) {
this.project_id = project_id;
}
public int getTask_id() {
return task_id;
}
public void setTask_id(int task_id) {
this.task_id = task_id;
}
public int getTask_unique_id() {
return task_unique_id;
}
public void setTask_unique_id(int task_unique_id) {
this.task_unique_id = task_unique_id;
}
public String getParent_id() {
return parent_id;
}
public void setParent_id(String parent_id) {
this.parent_id = parent_id;
}
public String getTask_type() {
return task_type;
}
public void setTask_type(String task_type) {
this.task_type = task_type;
}
public int getTask_outline_level() {
return task_outline_level;
}
public void setTask_outline_level(int task_outline_level) {
this.task_outline_level = task_outline_level;
}
public String getTask_name() {
return task_name;
}
public void setTask_name(String task_name) {
this.task_name = task_name;
}
public double getTask_duration() {
return task_duration;
}
public void setTask_duration(double task_duration) {
this.task_duration = task_duration;
}
public String getTask_start_date() {
return task_start_date;
}
public void setTask_start_date(String task_start_date) {
this.task_start_date = task_start_date;
}
public String getTask_finish_date() {
return task_finish_date;
}
public void setTask_finish_date(String task_finish_date) {
this.task_finish_date = task_finish_date;
}
public String getTask_predecessors() {
return task_predecessors;
}
public void setTask_predecessors(String task_predecessors) {
this.task_predecessors = task_predecessors;
}
public String getTask_operator() {
return task_operator;
}
public void setTask_operator(String task_operator) {
this.task_operator = task_operator;
}
@Override
public String toString() {
return "TaskInfo [project_id=" + project_id + ", task_id=" + task_id + ", task_unique_id=" + task_unique_id
+ ", parent_id=" + parent_id + ", task_type=" + task_type + ", task_outline_level=" + task_outline_level
+ ", task_name=" + task_name + ", task_duration=" + task_duration + ", task_start_date="
+ task_start_date + ", task_finish_date=" + task_finish_date + ", task_predecessors="
+ task_predecessors + ", task_operator=" + task_operator + "]";
}
}

第二步:写工具类,将mpxj jar包中的Task的对象解析出来,然后再封装到自己的TaskInfo中。

package com.mammoth.utils;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.mammoth.entity.TaskInfo; import net.sf.mpxj.MPXJException;
import net.sf.mpxj.ProjectFile;
import net.sf.mpxj.Relation;
import net.sf.mpxj.Task;
import net.sf.mpxj.mpp.MPPReader; public class TaskUtils { public static List<TaskInfo> readFile(){
List<TaskInfo> taskList = new ArrayList<TaskInfo>();
try{
//1. 读取文件
File file = new File("C:/Users/ruixuan/Desktop/测试project.mpp");
MPPReader mppRead = new MPPReader();
ProjectFile pf = mppRead.read(file);
//2. 拿到task对象
List<Task> tasks = pf.getAllTasks();
//3. 遍历task对象,找到其中的值
for (int i = 0; i < tasks.size(); i++) {
Task task = tasks.get(i);
Integer task_id = task.getID();
Integer task_unique_id = task.getUniqueID();
Integer task_outline_level = task.getOutlineLevel();
double task_duration = task.getDuration().getDuration();
Date task_start_date = task.getStart();
Date task_finish_date = task.getFinish();
List<Relation> task_predecessors = task.getPredecessors(); //4. 获取前置任务(任务流)
StringBuilder beforeTaskId = new StringBuilder();
StringBuilder beforeTaskType = new StringBuilder();
if(task_predecessors != null){
if(task_predecessors.size() > 0){
for(Relation relation : task_predecessors){
Integer targetTaskId = relation.getTargetTask().getID();
if(beforeTaskId.length() == 0){
beforeTaskId.append(targetTaskId);
beforeTaskType.append(relation.getType());
}else{
beforeTaskId.append("," + targetTaskId);
beforeTaskType.append("," + relation.getType());
}
}
}
}
String task_predecessors_str = beforeTaskId.toString();
String task_predecessors_str_type = beforeTaskType.toString();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//5. 给taskinfo实体类赋值
TaskInfo taskInfo = new TaskInfo();
taskInfo.setTask_id(task_id);
taskInfo.setTask_unique_id(task_unique_id);
taskInfo.setTask_outline_level(task_outline_level);
taskInfo.setTask_duration(task_duration);
taskInfo.setTask_start_date(format.format(task_start_date));
taskInfo.setTask_finish_date(format.format(task_finish_date));
taskInfo.setTask_predecessors(task_predecessors_str);
taskInfo.setTask_type(task_predecessors_str_type);
taskInfo.setTask_name(task.getName()); //6.自定义列读取
String task_operator = task.getText(2);
taskInfo.setTask_operator(task_operator);
taskList.add(taskInfo);
}
}catch (MPXJException e) {
return null;
} catch (Exception e) {
return null;
}
return taskList;
} // NO.2 获取TaskInfo之间的父子关联关系
public static List<TaskInfo> refreshTaskInfo(List<TaskInfo> taskList){
List<Map<String,Integer>> tempTaskOutLine = new ArrayList<Map<String,Integer>>();
for(TaskInfo taskInfo : taskList){
int taskId = taskInfo.getTask_id();
int taskOutLineLevel = taskInfo.getTask_outline_level();
int listSize = tempTaskOutLine.size();
// 初始化taskOutLineLevel
if(listSize > 2){
if(taskOutLineLevel == 1){
for(int i=listSize;i>2;i--){
tempTaskOutLine.remove(i-1);
}
listSize = 2;
}
}
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("taskId", taskId);
map.put("taskOutLineLevel", taskOutLineLevel);
if(listSize == 0){
if(taskOutLineLevel == 0){
tempTaskOutLine.add(map);
}else{
return null;
}
}else{
Map<String,Integer> lastMap = tempTaskOutLine.get(listSize-1);
String lastTaskId = lastMap.get("taskId")+"";
int lastTaskOutLineLevel = lastMap.get("taskOutLineLevel");
if(taskOutLineLevel > lastTaskOutLineLevel){
tempTaskOutLine.add(map);
taskInfo.setParent_id(lastTaskId);
}else if(taskOutLineLevel == lastTaskOutLineLevel){
tempTaskOutLine.set(taskOutLineLevel, map);
Map<String,Integer> lastMap1 = tempTaskOutLine.get(taskOutLineLevel-1);
String lastTaskId1 = lastMap1.get("taskId")+"";
taskInfo.setParent_id(lastTaskId1);
}else if(taskOutLineLevel < lastTaskOutLineLevel){
tempTaskOutLine.set(taskOutLineLevel, map);
Map<String,Integer> lastMap2 = tempTaskOutLine.get(taskOutLineLevel-1);
String lastTaskId2 = lastMap2.get("taskId")+"";
taskInfo.setParent_id(lastTaskId2);
}
}
}
taskList.remove(0);
return taskList;
}
}

这里的地址我测试用的是本地的一个地址,在实际开发中会在上传的时候进行解析,拿到文件流的形式即可,接下来我会写一篇关于上传解析文件的博客,也希望大佬们多多指点

第三步:测试

package com.mammoth.test;

import java.util.List;

import org.junit.Test;

import com.mammoth.entity.TaskInfo;
import com.mammoth.utils.TaskUtils; public class TaskTest { @Test
public void taskTest(){
// List<TaskInfo> lists = TaskUtils.readFile();
List<TaskInfo> lists = TaskUtils.refreshTaskInfo(TaskUtils.readFile());
int i = 1;
for (TaskInfo taskInfo : lists) {
System.out.println("第" + i + "次任务:"+ taskInfo.toString());
i++;
}
}
}

如果可以正常运行的话,可以看到控制台打印如下内容

得到这个list集合之后 ,还不是你想干什么就干什么了。

感谢http://blog.csdn.net/loongshawn/article/details/51038051,这篇博客,感谢大佬

微软project文件mpp解析的更多相关文章

  1. asp.net 读取导入的project(mpp)文件

    公司项目有用到读取project文件(.mpp)并保存到指定数据库类似的功能. 查了一下大家总结的方法. 找到一哥们代码,初步判断可行,特此收藏. using System.IO; using Mic ...

  2. Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析

    Office文件的奥秘——.NET平台下不借助Office实现Word.Powerpoint等文件的解析 分类: 技术 2013-07-26 15:38 852人阅读 评论(0) 收藏 举报 Offi ...

  3. .NET读取Project 2007 MPP项目文件

    Project文件读取: 方法1:Microsoft.Project.OLEDB.11.0 string strConn = "Provider=Microsoft.Project.OLED ...

  4. 豹哥嵌入式讲堂:ARM开发之文件详解(3)- project文件

    大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式开发里的project文件. 前面两节课里,豹哥分别给大家介绍了嵌入式开发中的两种典型input文件:source文件.linker文 ...

  5. C# 将Word,Execl,PPT,Project, 文件转成PDF, 不依赖Office!!

    git 地址 https://gitee.com/bandung/Execl_WordTOPDF.git 包括了各种破解的dll Word转PDF 挨个引用 Word转PDF public void ...

  6. Keil综合(03)_map文件全解析[转]

    推荐分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang 我的网站:ht ...

  7. 微软Project Oxford帮助开发人员创建更智能的应用

    Oxford帮助开发人员创建更智能的应用" title="微软Project Oxford帮助开发人员创建更智能的应用"> 假设你是一名对关于健身的应用充满奇思妙想 ...

  8. IDEA 之 ERROR:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

    问题描述:在使用IDEA对JSTL进行测试时出现error:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core] ...

  9. 自制C#版3DS文件的解析器并用SharpGL显示3DS模型

    自制C#版3DS文件的解析器并用SharpGL显示3DS模型 我已经重写了3ds解析器,详情在此(http://www.cnblogs.com/bitzhuwei/p/CSharpGL-2-parse ...

随机推荐

  1. 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)

    膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

  2. SpriteBuilder中节点的%位置移动

    在SpriteBuilder中可以将一个节点的位置设为%形式,这意味着在不同的屏幕尺寸中,该节点会定位在相对同一个位置. 比如x和y分别为 50%和50%的位置,在各种屏幕中都会定位到屏幕的中心. 但 ...

  3. nginx 编译增加新的模块

    原已经安装好的nginx,现在需要添加一个未被编译安装的模块: nginx -V 可以查看原来编译时都带了哪些参数 原来的参数:--prefix=/app/nginx 添加的参数: --with-ht ...

  4. 图形绘制中的PorterDuffXfermode

    1.概述 在android图形渲染中 会使用到图像混合模式 <span style="font-size:18px;">setXfermode(Xfermode xfe ...

  5. struts2 easyui实现datagrid的crud

    最近两天因为项目需要,接触了easyui,要用它的datagrid实现crud.第一次做,花了一天时间才完成所有功能,昨天做另外一个模块,同样的功能只用了两个小时. 现在把第一次做datagrid时遇 ...

  6. Android群英传笔记——第六章:Android绘图机制与处理技巧

    Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效 ...

  7. ReentrantReadWriteLock读写锁的使用1

    本文可作为传智播客<张孝祥-Java多线程与并发库高级应用>的学习笔记. 一个简单的例子 两个线程,一个不断打印a,一个不断打印b public class LockTest { publ ...

  8. Android adb基本命令-cd,ls,目录相关命令

    cd的命令 cd -:代表进入家目录,普通用户是/home/用户名,root用户是/root目录,-是家目录的代表 cd /:这是进入根目录,/是根目录的代表 cd .. :是返回上一级的目录 cd ...

  9. Spring的声明式事务管理

    在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例外(RunTimeExcep ...

  10. 恶补web之七:html DOM知识

    html DOM定义了访问和操作html文档的标准;dom是w3c的标准,dom定义了访问html和xml文档的标准: w3c文档对象模型(dom)是中立平台和语言的接口,它允许程序和脚本动态访问和更 ...