使用MPXJ库修改Java任务时长后MS Project无变化,求解决方法
解决MPXJ修改MS Project任务时长不生效的问题
我之前用MPXJ处理Project文件时也碰到过一模一样的情况,修改完任务时长后在Project 2016里完全看不到变化,大概率是以下几个常见坑导致的,你可以逐一排查:
1. 任务的固定类型限制
MS Project的任务有三种固定类型:固定工期、固定工时、固定资源。如果目标任务不是固定工期(Fixed Duration),直接修改时长会被Project自动覆盖——因为它会根据工时/资源的参数自动计算工期,不会保留你手动设置的数值。
解决方法:先把任务类型改成固定工期,再设置时长:
for (Task task : allTasks) { if (task.getID() == 3) { // 先设置任务为固定工期类型 task.setFixedTaskType(FixedTaskType.FIXED_DURATION); // 再设置3天的时长 task.setDuration(Duration.getInstance(3, TimeUnit.DAYS)); break; // 找到目标任务后直接跳出循环,更高效 } }
2. 目标任务是摘要任务
如果ID为3的任务是摘要任务,它的时长是由子任务的工期自动汇总计算的,手动修改摘要任务的时长根本不会生效——Project会自动重新计算并覆盖你的修改。
解决方法:先判断任务是否为摘要任务,若是则修改它的子任务,而非直接改摘要任务:
for (Task task : allTasks) { if (task.getID() == 3) { if (task.isSummary()) { System.out.println("注意:该任务是摘要任务,需修改其子任务来调整总时长"); // 遍历子任务修改的示例(按需调整子任务时长) for (Task subtask : task.getChildTasks()) { subtask.setFixedTaskType(FixedTaskType.FIXED_DURATION); subtask.setDuration(Duration.getInstance(1, TimeUnit.DAYS)); } } else { task.setFixedTaskType(FixedTaskType.FIXED_DURATION); task.setDuration(Duration.getInstance(3, TimeUnit.DAYS)); } break; } }
3. 文件保存环节出问题
确保你用正确的XML写入器保存文件,且没有忽略IO异常:
try { ProjectWriter writer = new XMLWriter(); // 确认路径有写入权限,且不要覆盖正在被MS Project打开的文件 writer.write(project, "modified_project.xml"); System.out.println("文件保存成功"); } catch (IOException e) { e.printStackTrace(); // 查看是否有保存失败的异常信息 }
另外,不要直接覆盖正在被MS Project打开的原文件,否则修改后的内容不会被读取到。
4. 日历与时区的差异
MPXJ的Duration默认使用项目的基准日历,如果你的项目用了非标准工作日历(比如周末不工作),可以明确关联项目日历来确保时长计算符合预期:
task.setDuration(Duration.getInstance(3, TimeUnit.DAYS, project.getCalendar()));
这样设置的3天会对应项目日历中的3个工作日,而非自然日。
5. 任务被锁定(小众情况)
虽然代码修改通常能绕过MS Project的锁定设置,但可以尝试先解锁任务再修改:
if (task.getID() == 3) { task.setLocked(false); task.setFixedTaskType(FixedTaskType.FIXED_DURATION); task.setDuration(Duration.getInstance(3, TimeUnit.DAYS)); }
建议你先从检查任务类型和是否为摘要任务入手,这两个是最常见的触发原因。
内容的提问来源于stack exchange,提问作者Marin Jurjević
相关产品推荐
相关产品推荐

