使用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>
相关文章:
使用net.sf.mpxj读取project的.mpp文件
1、导入.mpp文件 public void importMppFile(String updateType, MultipartFile multipartFile) {try (InputStream inputStream multipartFile.getInputStream()) {// 读取文件的组件MPPReader mppReader new MPPReader();// 注意,如果在这一步出现了读取异常&a…...
ubuntu 22.04 升级到24.04
step1. sudo apt update sudo apt upgrade sudo apt dist-upgrade step2. sudo apt autoremove step3. sudo apt install update-manager-core step4. sudo vim /etc/update-manager/release-upgrades 将 Prompt 设置为 lts: Promptlts 保存并退出 step5. sudo do-r…...
FreeRTOS学习笔记-基于stm32(14)内存管理
一、FreeRTOS 内存管理简介 FreeRTOS有两种方法来创建任务,队列,信号量等,一种动态一种静态。静态方法需要手动定义任务堆栈。使用动态内存管理的时候 FreeRTOS 内核在创建任务、队列、信号量的时候会动态的申请 RAM。 我们在移植FreeRTOS时可…...
关于Lambert W函数
来源:R. M. Corless, G. H. Gonnet, D. E. G. Hare, D. J. Jeffrey, and D. E. Knuth, “On Lambert’s W function,” Adv. Comput. Math., vol. 5, pp. 329–359, May 1996, doi: 10.1007/BF02124750. 摘要 Lambert W函数被定义为函数 w ↦ w e w w \mapsto we^…...
【免杀】C2远控-APC注入-进程镂空
目录 进程镂空&傀儡进程(主要过内存扫描)代码 傀儡进程演示如何上线上线演示 APC注入&进程欺骗(主要过内存扫描)同步调用与异步调用代码演示 进程镂空&傀儡进程(主要过内存扫描) 进程镂空(Pro…...
20240611 讯飞JAVA工程师(研发经理岗)面试
1.线程安全的集合类 在Java中,一些线程安全的集合类有Stack、Vector、Properties、Hashtable等 2.线程池中execute和submit的区别 1)参数及返回值不同 excute只能提交Runnable,无返回值 submit既可以提交Runnable,返回值为null&am…...
【研发日记】Matlab/Simulink软件优化(三)——利用NaNFlag为数据处理算法降阶
文章目录 前言 背景介绍 初始算法 优化算法 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 见《【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法》 背景介绍 在一个嵌入式软件开发项目中,需要开…...
go语言接口之http.Handler接口
package httptype Handler interface {ServeHTTP(w ResponseWriter, r *Request) }func ListenAndServe(address string, h Handler) error ListenAndServe函数需要一个例如“localhost:8000”的服务器地址,和一个所有请求都可以分 派的Handler接口实例。它会一直运…...
R语言 | 使用最简单方法添加显著性ggpubr包
本期教程原文:使用最简单方法添加显著性ggsignif包 本期教程 获得本期教程代码和数据,在后台回复关键词:20240605 小杜的生信笔记,自2021年11月开始做的知识分享,主要内容是R语言绘图教程、转录组上游分析、转录组下游…...
【Linux】shell脚本变量——系统变量、环境变量和用户自定义变量
系统变量 系统变量是由系统预设的,它们通常在系统启动时被加载,并对所有用户和所有shell实例都有效。这些变量通常控制着系统的行为和配置,例如PATH(命令搜索路径)、HOME(用户主目录)等。系统变…...
QWidget 属性——windowTitle·windowIcon·qrc
🐌博主主页:🐌倔强的大蜗牛🐌 📚专栏分类:QT ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 一、windowTitle二、windowIcon三、qrc 一、windowTitle windowTitle 是一个通常用于表示窗口标题…...
深入理解rtmp(一)之开发环境搭建
深入理解rtmp(一)之开发环境搭建 手机直播在15年的时候突然火起来,随着花椒,映客等出现,直播一下就出现在了风口,各个公司针对直播的战斗迅速打响,战斗过程比较短暂,随着许多公司的退出和死去,手机直播行业趋于稳定,直播服务时长也被传统的CDN厂商牢牢占据,后面大家又把精力投…...
java常用面试基础题
&与&&区别? &和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假;但是&&当第一个条件不成之后,后面的条件都不执行了,而&则还是继续执行,直到整个条件…...
互联网摸鱼日报(2024-06-11)
互联网摸鱼日报(2024-06-11) 36氪新闻 雅诗兰黛,胆子也太大了 苹果WWDC终极前瞻:5大看点20大AI新功能,库克不能输的一战 瑞士清洁科技公司Enerdrape开发预制地热板,回收城市地下空间的浅层地热能和废热用于建筑物制热或制冷 | …...
中介子方程十二
X$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XdX$XpX$XdX$XyXeXαX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XVXpX$XyXtXkXrXiXα…...
SLT简介【简单介绍SLT】
SLT简介 在c的学习当中STL的学习是一个很重要的一环,但是STL又是一个庞大的章节,因此这里我们先简单介绍一下STL,有助于后面我们对STL的学习,这里就是做一个简单的介绍,并无干货。 1.什么是STL STL(standard templa…...
vue实现pdf下载——html2canvas
html2canvas 官方文档https://html2canvas.hertzen.com/getting-started html2canvas 的原理是通过遍历DOM树,将每一个HTML元素转化为Canvas对象,并叠加到一起形成一张完整的图片或者PDF文件。 1. 安装插件 npm install html2canvas jspdf --save 2.使用(页面已经…...
安装docker+mysql的一些坑
yum -y install docker 提示missing signature 参考这里 https://www.8a.hk/news/content/8235.html 卸载旧的docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装…...
React Native采集数据离线存储、网络状态监控、加密上传、鉴权
在无网络环境下进行数据采集并在有网络时上传至服务器,同时确保数据的鉴权和加密,这一需求需要考虑多方面的实现细节。无论您选择原生开发还是使用React Native(甚至Expo),以下是如何实现这一需求的具体步骤和建议。 …...
网络数据库后端相关面试题(其三)
18, 传输控制协议tcp和用户数据报协议udp有哪些区别 第一,tcp是面向字节流的,基本的传输单位是tcp报文段;而udp是面向报文的,基本传输单位是用户数据报。 第二, tcp注重安全可靠性,连接双方在…...
怎样快速管理Windows预览版:离线注册工具完整使用手册
怎样快速管理Windows预览版:离线注册工具完整使用手册 【免费下载链接】offlineinsiderenroll 项目地址: https://gitcode.com/gh_mirrors/of/offlineinsiderenroll 想要体验Windows最新功能但又不想绑定微软账户?OfflineInsiderEnroll为你提供了…...
Python服务内存持续增长?5个被忽略的__del__陷阱+3种RAII式资源封装模板,今天必须修复!
第一章:Python服务内存持续增长的智能体诊断全景图Python服务在长期运行中出现内存持续增长,是生产环境中高频且隐蔽的稳定性风险。传统人工排查依赖经验与断点调试,难以覆盖异步任务、闭包引用、第三方库缓存等复杂场景。本章构建一个面向可…...
Java响应式编程实战:用Reactor 3.x处理高并发请求(附完整代码示例)
Java响应式编程实战:用Reactor 3.x处理高并发请求(附完整代码示例) 在当今高并发的互联网应用中,传统的同步阻塞式编程模型往往成为性能瓶颈。想象一下,当你的电商系统在秒杀活动中面临每秒数万次的请求时,…...
PP-DocLayoutV3完整指南:支持弯曲/倾斜文档的布局分析实战
PP-DocLayoutV3完整指南:支持弯曲/倾斜文档的布局分析实战 1. 引言:告别平面文档的限制 想象一下这样的场景:你手头有一份古老的卷轴文献,或者一张被折叠多次的纸质文档,甚至是一本装订厚重的书籍内页。这些文档往往…...
平衡小车/倒立摆核心:用STM32CubeMX和串级PID实现精准角度控制,调参避坑指南
平衡小车与倒立摆实战:STM32CubeMX串级PID调参全解析 平衡控制系统一直是嵌入式开发者的试金石。去年校电赛上,我亲眼见证一支队伍因为PID参数整定不当,导致他们精心设计的倒立摆在演示时像喝醉了一样左右摇摆,最终与奖项失之交臂…...
s2-pro企业应用指南:如何用参考音频批量生成统一品牌语音素材
s2-pro企业应用指南:如何用参考音频批量生成统一品牌语音素材 1. 企业语音素材的痛点与解决方案 在当今数字化营销环境中,企业面临一个共同挑战:如何高效制作大量统一品牌调性的语音素材。传统方案通常面临: 成本高昂ÿ…...
6.其他计算机系统基础知识
一、其他计算机系统基础知识 00:00 1. 计算机语言 00:31 1)计算机语言的概念 01:56 定义: 用于人与计算机之间交流的语言,是传递信息的媒介组成结构: 表达式: 包含变量、常量、字面量和运算符流程控制: 包括分支、循…...
如何在MATLAB中免费实现亚像素级变形测量:Ncorr 2D完整指南 [特殊字符]
如何在MATLAB中免费实现亚像素级变形测量:Ncorr 2D完整指南 🚀 【免费下载链接】ncorr_2D_matlab 2D Digital Image Correlation Matlab Software 项目地址: https://gitcode.com/gh_mirrors/nc/ncorr_2D_matlab 你是否曾为材料变形测量而烦恼&am…...
AI建站避坑指南:10个高频问题与风险防范全解析
用AI建站虽然快,但过程中隐藏的风险如果没到,轻则内容效果差,重则可能有版权或合规隐患。这份避坑指南,围绕大家最关心的10个核心问题,给出客观的分析和可操作的防范建议,帮你安心用好AI建站工具。\### 核心…...
从QEMU仿真到真机烧录:用Yocto为ArmSoM-Sige7开发板定制RK3588镜像的完整流程
从QEMU仿真到真机烧录:用Yocto为ArmSoM-Sige7开发板定制RK3588镜像的完整流程 在嵌入式开发领域,能够快速验证软件栈的可行性并最终部署到真实硬件是每个开发者的核心诉求。本文将带你完整走通从虚拟仿真到实体部署的全链路,使用Yocto项目为搭…...
