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
List
try{
//1. 读取文件
File file = new File("C:/Users/ruixuan/Desktop/测试");
MPPReader mppRead = new MPPReader();
ProjectFile pf = (file);
//2. 拿到task对象
List
//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
//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
List
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
("taskId", taskId);
("taskOutLineLevel", taskOutLineLevel);
if(listSize == 0){
if(taskOutLineLevel == 0){
(map);
}else{
return null;
}
}else{
Map
String lastTaskId = ("taskId")+"";
int lastTaskOutLineLevel = ("taskOutLineLevel");
if(taskOutLineLevel > lastTaskOutLineLevel){
(map);
ent_id(lastTaskId);
}else if(taskOutLineLevel == lastTaskOutLineLevel){
(taskOutLineLevel, map);
Map
String lastTaskId1 = ("taskId")+"";
ent_id(lastTaskId1);
}else if(taskOutLineLevel < lastTaskOutLineLevel){
(taskOutLineLevel, map);
Map
String lastTaskId2 = ("taskId")+"";
ent_id(lastTaskId2);
}
}
}
(0);
return taskList;
}
}
这里的地址我测试用的是本地的一个地址,在实际开发中会在上传的时候进行解析,拿到文件流的形式即可,接下来我会写一篇关于上传解
析文件的博客,也希望大佬们多多指点
第三步:测试package ;
import ;
import ;
import fo;
import ils;
public class TaskTest {
@Test
public void taskTest(){
// List
List
int i = 1;
for (TaskInfo taskInfo : lists) {
n("第" + i + "次任务:"+ ng());
i++;
}
}
}
如果可以正常运行的话,可以看到控制台打印如下内容
得到这个list集合之后 ,还不是你想干什么就干什么了。


发布评论