java解析mpp文件(包含层级关系)
我用的是递归循环的,不限制有多少子级关系都可以拿到
首先引入解析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文件(包含层级关系)相关推荐
- java 解析 csv 文件
文章分类:JavaEye 一.貌似有bug,不行用 二.或 三. 的方法 Java代码 import java.io.BufferedReader; import java.io.FileInpu ...
- 用正则表达式和java解析csv文件
用正则表达式和java解析csv文件 作者:弹着钢琴设计 来源:博客园 发布时间:2009-06-15 18:31 阅读:337 次 原文链接 [收藏] 在解析csv文件之前,先来看看 ...
- java解析dxf文件_浅析JVM方法解析、创建和链接
一:前言 上周末写了一篇文章<你知道Java类是如何被加载的吗?>,分析了HotSpot是如何加载Java类的,干脆趁热打铁,本周末再来分析下Hotspot又是如何解析.创建和链接类方法的 ...
- python读取包含层级关系的excel
1.场景描述 使用python读取包含层级关系excel,数据示例如下图所示. 2.代码 import xlrd def read_excel():# 打开文件workbook = xlrd.open ...
- XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML
XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 以及查找xml文件中相同的节点属性值 项目背景:这是本人实习中所碰到的项目,当时感觉很棘手, ...
- java解析xml文件
使用java解析xml文件,通过dom4j. 代码如下: package com.java.team; import java.io.File; import java.util.ArrayList; ...
- java解析Excel文件
下文介绍java解析Excel文件的方案 前置准备 1.第三方jar包或者Maven配置 org.apache.poi的jar包 Maven配置如下 <groupId>org.apache ...
- JAVA解析.xlsb文件
Java解析.Xlsb文件 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId& ...
- java解析xml文件的几种方式(DOM解析)
好久不用的东西,今天居然被面试官问到了.那既然这样,我们就一起回顾下java解析xml文件的几种方式吧. DOM解析 dom解析所需依赖是我们jdk自带的,所以只需要使用jdk为我们提供的接口即可上手 ...
最新文章
- Blender赛车动画制作学习教程 Learn Race Car Animation with Blender
- python rq asyncio_Python 的异步 IO:Asyncio 简介
- 动态数据交换 python_如何用 Python 和 Streamlit 做交互式数据分析产品?
- wordpress标签或者固定地址中文404错误解决插件
- dubbo学习--导入eclipse异常Unbound classpath container(2)
- python之集合操作 - |
- JAVA数据库宾馆住宿系统_基于Java的酒店入住管理系统的设计与实现(含源文件).doc...
- 简述er图的作用_用例图、ER图、功能结构图
- 全国哀悼日网站变灰代码
- linux 卸载 sdcc,Linux sdcc安装
- 推荐系统序列化建模总结
- 回归算法-线性回归分析-过拟合欠拟合岭回归
- UWB室内定位:TDOA定位方法的时间同步问题
- rpm升级包冲突:conflicts with file
- IntelE3 E5 E7 至强命名规则
- 女子不满被骗刺死已婚男友获刑14年(图)
- 华为云数据库 PostgreSQL 支持 10.3 ,高性能,新体验
- linux查看端口转发配置文件,Linux配置端口转发
- [HBNIS2018]excel破解1
- python汉字个数统计