当前位置: 首页 > news >正文

使用net.sf.mpxj读取project的.mpp文件

1、导入.mpp文件

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

2、递归解析任务

 /*** 递归解析任务** @param taskList               循环解析对象* @param currentProjectProgress 当前循环的数据是它的子级* @param importList             循环解析后数据存入的集合*/private static void parseTasks(List<Task> taskList, ProjectProgressEntity currentProjectProgress, List<ProjectProgressEntity> importList) {// 设置层级,如果等于空,则代表是第一层级,不为空则在父级节点的层级基础上+1int levelNum = currentProjectProgress.getPlanLevel() == null ? 1 : currentProjectProgress.getPlanLevel() + 1;// 循环所有节点for (Task task : taskList) {ProjectProgressEntity projectProgress = new ProjectProgressEntity();projectProgress.setProjectProgressId(UUID.fastUuid().toString());projectProgress.setTaskId(task.getID());projectProgress.setSerialNumber(task.getID());projectProgress.setSplitParentId(currentProjectProgress.getSerialNumber());projectProgress.setPlanLevel(levelNum);projectProgress.setTaskName(task.getName());projectProgress.setDuration(task.getDuration().getDuration());projectProgress.setPlanStartDate(task.getStart());projectProgress.setPlanEndDate(task.getFinish());projectProgress.setParentId(getParentIds(task));// 获取实际开始时间和实际结束时间的值projectProgress.setActualStartDate(task.getActualStart());projectProgress.setActualEndDate(task.getActualFinish());// 获取任务完成进度百分比projectProgress.setProgress(BigDecimal.valueOf((Double) task.getPercentageComplete()));// 获取任务的资源集合projectProgress.setPersonInCharge(MppFileUtils.getResource(task));// 获取任务状态、开始告警、结束告警的状态buildTaskStatus(task.getActualStart(), task.getActualFinish(), projectProgress);buildStartAlert(task.getStart(), task.getActualStart(), projectProgress);buildEndAlert(task.getFinish(), task.getActualFinish(), projectProgress);// 判断是否有子任务if (task.getChildTasks().size() > 0) {projectProgress.setIsNotSplit("0");// 继续进行递归,当前保存的只是父任务的信息parseTasks(task.getChildTasks(), projectProgress, importList);} else {projectProgress.setIsNotSplit("1");}importList.add(projectProgress);}}

3. 获取资源名称:MppFileUtils类的getResource方法

    /*** 获取资源名称** @param task 任务* @return 资源名称*/public static String getResource(Task task) {StringBuffer buf = new StringBuffer();List assignments = task.getResourceAssignments();for (int i = 0; i < assignments.size(); i++) {ResourceAssignment assignment = (ResourceAssignment) assignments.get(i);Resource resource = assignment.getResource();if (resource != null) {buf.append(resource.getName());// 如果不是最后一个资源,就添加逗号if (i < assignments.size() - 1) {buf.append(",");}}}return buf.toString();}
4.引入依赖:解析project的.mpp文件
        <!-- 引入依赖:解析project的.mpp文件 --><dependency><groupId>net.sf.mpxj</groupId><artifactId>mpxj</artifactId><version>10.14.1</version></dependency>

相关文章:

  • 文件操作(2)(C语言版)
  • Tuple 元组
  • MAX30102驱动
  • 【ajax基础03】常用ajax请求方法和数据提交以及axios错误处理
  • Java23种设计模式(二)
  • MySQL系列-语法说明以及基本操作(二)
  • 力扣爆刷第153天之TOP100五连刷(相交、翻转、排序链表、螺旋矩阵、锯齿二叉树)
  • IPython 使用技巧整理
  • Linux系统之mtr命令的基本使用
  • 超多细节—app图标拖动排序实现详解
  • 简析:分账系统
  • 测试testing06182
  • 暑期计划打卡清单表怎么写 暑期待办计划清单
  • 干G货,性能测试基本方法和原则,
  • shell命令(进程管理和用户管理)
  • $translatePartialLoader加载失败及解决方式
  • 《Java编程思想》读书笔记-对象导论
  • 11111111
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Angular 响应式表单之下拉框
  • eclipse(luna)创建web工程
  • Git同步原始仓库到Fork仓库中
  • laravel 用artisan创建自己的模板
  • Linux CTF 逆向入门
  • Puppeteer:浏览器控制器
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpringBoot 实战 (三) | 配置文件详解
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue 2.3、2.4 知识点小结
  • Vue全家桶实现一个Web App
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 初识MongoDB分片
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 力扣(LeetCode)56
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 探索 JS 中的模块化
  • 以太坊客户端Geth命令参数详解
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • UI设计初学者应该如何入门?
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 如何正确理解,内页权重高于首页?
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # 数论-逆元
  • #Ubuntu(修改root信息)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $L^p$ 调和函数恒为零
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (06)Hive——正则表达式
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (function(){})()的分步解析
  • (办公)springboot配置aop处理请求.
  • (多级缓存)缓存同步