我用的是递归循环的,不限制有多少子级关系都可以拿到

首先引入解析mpp所需依赖

        <dependency><groupId>net.sf.mpxj</groupId><artifactId>mpxj</artifactId><version>7.1.0</version></dependency>

解析所用实体类,每个字段都有对应意思

public class ArrowDiagramImport extends Model<ArrowDiagramImport> {@TableId(value = "ID")private String id;/*** 序号*/@TableField(value = "SERIAL_NUMBER",exist = true  )private String serialNumber;/*** 节点名称*/@TableField(value = "TASK_NAME",exist = true  )private String taskName;/*** 前置节点ID*/@TableField(value = "PARENT_ID",exist = true  )private String parentId;/*** 工期*/@TableField(value = "DURATION",exist = true  )private Double duration;/*** 计划开始时间*/@TableField(value = "PLAN_START_DATE",exist = true  )@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")private Date planStartDate;/*** 计划结束时间*/@TableField(value = "PLAN_END_DATE",exist = true  )@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")private Date planEndDate;/*** 层级*/@TableField(value = "plan_level",exist = true  )private String planLevel;/*** 是否拆分 0是 1否(代表该条数据是不是父节点)*/@TableField(value = "is_not_split",exist = true  )private String isNotSplit;/*** 拆分后子任务的父节点序号*/@TableField(value = "split_parent_id",exist = true  )private String splitParentId;}

核心代码

    public void mppFileAnalysis(MultipartFile multipartFile) {try {//读取文件的组件MPPReader mppReader = new MPPReader();//注意,如果在这一步出现了读取异常,肯定是版本不兼容,换个版本试试ProjectFile pf = mppReader.read(multipartFile.getInputStream());//从文件中获取的任务对象List<Task> tasks = pf.getChildTasks();//解析后数据存入对象List<ArrowDiagramImport> importList = new ArrayList<>();//递归解析方法childrenTask(tasks.get(0).getChildTasks(), new ArrowDiagramImport(), importList);for (ArrowDiagramImport diagramImport : importList) {System.out.println(diagramImport.getTaskName());}} catch (Exception e) {e.printStackTrace();}}

递归方法

taskList 循环解析对象,rtSingleArrowDiagramImport 代表当前循环的数据是它的子级,importList 循环解析后数据存入的集合

    //taskList 循环解析对象,rtSingleArrowDiagramImport   代表当前循环的数据是它的子级,importList   循环解析后数据存入的集合public void childrenTask(List<Task> taskList, ArrowDiagramImport rtSingleArrowDiagramImport, List<ArrowDiagramImport> importList) {//设置层级,如果等于空,则代表是第一层级,不为空则在父级节点的层级基础上+1int levelNum;if (StringUtils.isEmpty(rtSingleArrowDiagramImport.getPlanLevel())) {levelNum = 1;} else {levelNum = Integer.parseInt(rtSingleArrowDiagramImport.getPlanLevel()) + 1;}//循环所有节点for (Task task : taskList) {ArrowDiagramImport diagramImport = new ArrowDiagramImport();diagramImport.setId(StringUtils.getUUID());diagramImport.setSerialNumber(task.getID().toString());diagramImport.setSplitParentId(rtSingleArrowDiagramImport.getSerialNumber());//将上一级目录的Id赋值给下一级的ParentIddiagramImport.setPlanLevel(String.valueOf(levelNum));//层级diagramImport.setTaskName(task.getName());//这个是获取文件中的“任务名称”列的数据diagramImport.setDuration(task.getDuration().getDuration());//获取的是文件中的“工期”diagramImport.setPlanStartDate(task.getStart());//获取文件中的 “开始时间”diagramImport.setPlanEndDate(task.getFinish());//获取文件中的 “完成时间”diagramImport.setParentId(getParentIds(task));if (task.getChildTasks().size() > 0) {diagramImport.setIsNotSplit(DelFlagType.Normal.getType());childrenTask(task.getChildTasks(), diagramImport, importList);//继续进行递归,当前保存的只是父任务的信息} else {diagramImport.setIsNotSplit(DelFlagType.Delete.getType());}importList.add(diagramImport);}}

该方法是为了获取前置节点的关系,包含特殊前置关系

 public String getParentIds(Task task) {String parentId = "";if (task.getPredecessors().size() > 0) {for (Relation relation : task.getPredecessors()) {//前置节点IDString id = relation.getTargetTask().getID().toString();//关联前置节点的关系 FS/FF/SS/SFString type = relation.getType().toString();//与前置节点关系的天数Integer duration = (int) relation.getLag().getDuration();//如果类型=FS,并且天数为0,则代表没有特殊关系if (type.equals(DiagramPlanType.FS.getCode()) && duration == 0.0) {parentId += id + ",";} else {String durationStr = "";if (duration > 0.0) {durationStr = "+" + duration + "工日";} else if (duration < 0.0) {durationStr = duration.toString() + "工日";}parentId += id + type + durationStr + ",";}}parentId = parentId.substring(0, parentId.length() - 1);}return parentId;}

java解析mpp文件(包含层级关系)相关推荐

  1. java 解析 csv 文件

    文章分类:JavaEye 一.貌似有bug,不行用 二.或 三. 的方法 Java代码   import java.io.BufferedReader; import java.io.FileInpu ...

  2. 用正则表达式和java解析csv文件

    用正则表达式和java解析csv文件 作者:弹着钢琴设计  来源:博客园  发布时间:2009-06-15 18:31  阅读:337 次  原文链接   [收藏]   在解析csv文件之前,先来看看 ...

  3. java解析dxf文件_浅析JVM方法解析、创建和链接

    一:前言 上周末写了一篇文章<你知道Java类是如何被加载的吗?>,分析了HotSpot是如何加载Java类的,干脆趁热打铁,本周末再来分析下Hotspot又是如何解析.创建和链接类方法的 ...

  4. python读取包含层级关系的excel

    1.场景描述 使用python读取包含层级关系excel,数据示例如下图所示. 2.代码 import xlrd def read_excel():# 打开文件workbook = xlrd.open ...

  5. XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML

    XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 以及查找xml文件中相同的节点属性值 项目背景:这是本人实习中所碰到的项目,当时感觉很棘手, ...

  6. java解析xml文件

    使用java解析xml文件,通过dom4j. 代码如下: package com.java.team; import java.io.File; import java.util.ArrayList; ...

  7. java解析Excel文件

    下文介绍java解析Excel文件的方案 前置准备 1.第三方jar包或者Maven配置 org.apache.poi的jar包 Maven配置如下 <groupId>org.apache ...

  8. JAVA解析.xlsb文件

    Java解析.Xlsb文件 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId& ...

  9. java解析xml文件的几种方式(DOM解析)

    好久不用的东西,今天居然被面试官问到了.那既然这样,我们就一起回顾下java解析xml文件的几种方式吧. DOM解析 dom解析所需依赖是我们jdk自带的,所以只需要使用jdk为我们提供的接口即可上手 ...

最新文章

  1. Blender赛车动画制作学习教程 Learn Race Car Animation with Blender
  2. python rq asyncio_Python 的异步 IO:Asyncio 简介
  3. 动态数据交换 python_如何用 Python 和 Streamlit 做交互式数据分析产品?
  4. wordpress标签或者固定地址中文404错误解决插件
  5. dubbo学习--导入eclipse异常Unbound classpath container(2)
  6. python之集合操作 - |
  7. JAVA数据库宾馆住宿系统_基于Java的酒店入住管理系统的设计与实现(含源文件).doc...
  8. 简述er图的作用_用例图、ER图、功能结构图
  9. 全国哀悼日网站变灰代码
  10. linux 卸载 sdcc,Linux sdcc安装
  11. 推荐系统序列化建模总结
  12. 回归算法-线性回归分析-过拟合欠拟合岭回归
  13. UWB室内定位:TDOA定位方法的时间同步问题
  14. rpm升级包冲突:conflicts with file
  15. IntelE3 E5 E7 至强命名规则
  16. 女子不满被骗刺死已婚男友获刑14年(图)
  17. 华为云数据库 PostgreSQL 支持 10.3 ,高性能,新体验
  18. linux查看端口转发配置文件,Linux配置端口转发
  19. [HBNIS2018]excel破解1
  20. python汉字个数统计

热门文章

  1. 计算机要素--第六章 汇编编译器
  2. ABAQUS UEL
  3. 电赛中常用的模块电路设计
  4. 信息安全技术之08之设备与环境安全测试卷
  5. 《RFID原理及应用》期末复习总结(1)
  6. C51数字钟程序-ZT(拿来学习用)
  7. 手机linux系统介绍,Ubuntu手机系统介绍及Ubuntu刷机教程分享
  8. 浅析肖特基二极管损坏的具体原因
  9. 什么是移动SEO?为什么移动搜索引擎优化很重要?
  10. python微博评论情感分析_Python采集微博热评进行情感分析祝你狗年脱单