2023年12月7日发(作者:)

微软project文件mpp解析

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

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

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

还有这里用的jar包是mpxj。

package ;

import ;

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) {

t_id = project_id;

}

public int getTask_id() {

return task_id;

}

public void setTask_id(int task_id) {

_id = task_id;

}

public int getTask_unique_id() {

return task_unique_id;

}

public void setTask_unique_id(int task_unique_id) {

_unique_id = task_unique_id;

}

public String getParent_id() {

return parent_id;

}

public void setParent_id(String parent_id) {

_id = parent_id;

}

public String getTask_type() {

return task_type;

}

public void setTask_type(String task_type) {

_type = task_type;

}

public int getTask_outline_level() {

return task_outline_level;

}

public void setTask_outline_level(int task_outline_level) {

_outline_level = task_outline_level; _outline_level = task_outline_level;

}

public String getTask_name() {

return task_name;

}

public void setTask_name(String task_name) {

_name = task_name;

}

public double getTask_duration() {

return task_duration;

}

public void setTask_duration(double task_duration) {

_duration = task_duration;

}

public String getTask_start_date() {

return task_start_date;

}

public void setTask_start_date(String task_start_date) {

_start_date = task_start_date;

}

public String getTask_finish_date() {

return task_finish_date;

}

public void setTask_finish_date(String task_finish_date) {

_finish_date = task_finish_date;

}

public String getTask_predecessors() {

return task_predecessors;

}

public void setTask_predecessors(String task_predecessors) {

_predecessors = task_predecessors;

}

public String getTask_operator() {

return task_operator;

}

public void setTask_operator(String task_operator) {

_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 ;

import ;

import DateFormat;

import ist;

import ;

import p;

import ;

import ;

import fo;

import ception;

import tFile;

import on;import on;

import ;

import der;

public class TaskUtils {

public static List readFile(){

List taskList = new ArrayList();

try{

//1. 读取文件

File file = new File("C:/Users/ruixuan/Desktop/测试");

MPPReader mppRead = new MPPReader();

ProjectFile pf = (file);

//2. 拿到task对象

List tasks = Tasks();

//3. 遍历task对象,找到其中的值

for (int i = 0; i < (); i++) {

Task task = (i);

Integer task_id = ();

Integer task_unique_id = queID();

Integer task_outline_level = lineLevel();

double task_duration = ation().getDuration();

Date task_start_date = rt();

Date task_finish_date = ish();

List task_predecessors = decessors();

//4. 获取前置任务(任务流)

StringBuilder beforeTaskId = new StringBuilder();

StringBuilder beforeTaskType = new StringBuilder();

if(task_predecessors != null){

if(task_() > 0){

for(Relation relation : task_predecessors){

Integer targetTaskId = getTask().getID();

if(() == 0){

(targetTaskId);

(e());

}else{

("," + targetTaskId);

("," + e());

}

}

}

}

String task_predecessors_str = ng();

String task_predecessors_str_type = ng();

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

//5. 给taskinfo实体类赋值

TaskInfo taskInfo = new TaskInfo();

k_id(task_id);

k_unique_id(task_unique_id);

k_outline_level(task_outline_level);

k_duration(task_duration);

k_start_date((task_start_date));

k_finish_date((task_finish_date));

k_predecessors(task_predecessors_str);

k_type(task_predecessors_str_type);

k_name(e());

//6.自定义列读取

String task_operator = t(2);

k_operator(task_operator);

(taskInfo);

}

}catch (MPXJException e) {

return null;

} catch (Exception e) { } catch (Exception e) {

return null;

}

return taskList;

}

// NO.2 获取TaskInfo之间的父子关联关系

public static List refreshTaskInfo(List taskList){

List> tempTaskOutLine = new ArrayList>();

for(TaskInfo taskInfo : taskList){

int taskId = k_id();

int taskOutLineLevel = k_outline_level();

int listSize = ();

// 初始化taskOutLineLevel

if(listSize > 2){

if(taskOutLineLevel == 1){

for(int i=listSize;i>2;i--){

(i-1);

}

listSize = 2;

}

}

Map map = new HashMap();

("taskId", taskId);

("taskOutLineLevel", taskOutLineLevel);

if(listSize == 0){

if(taskOutLineLevel == 0){

(map);

}else{

return null;

}

}else{

Map lastMap = (listSize-1);

String lastTaskId = ("taskId")+"";

int lastTaskOutLineLevel = ("taskOutLineLevel");

if(taskOutLineLevel > lastTaskOutLineLevel){

(map);

ent_id(lastTaskId);

}else if(taskOutLineLevel == lastTaskOutLineLevel){

(taskOutLineLevel, map);

Map lastMap1 = (taskOutLineLevel-1);

String lastTaskId1 = ("taskId")+"";

ent_id(lastTaskId1);

}else if(taskOutLineLevel < lastTaskOutLineLevel){

(taskOutLineLevel, map);

Map lastMap2 = (taskOutLineLevel-1);

String lastTaskId2 = ("taskId")+"";

ent_id(lastTaskId2);

}

}

}

(0);

return taskList;

}

}

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

析文件的博客,也希望大佬们多多指点

第三步:测试package ;

import ;

import ;

import fo;

import ils;

public class TaskTest {

@Test

public void taskTest(){

// List lists = le();

List lists = hTaskInfo(le());

int i = 1;

for (TaskInfo taskInfo : lists) {

n("第" + i + "次任务:"+ ng());

i++;

}

}

}

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

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