如何使用C#通过MPXJ从MS Project的mpp文件提取Sprint等字段数据
针对MPXJ无法读取Sprint、Board Status字段的解决方案
MPXJ原生读取方案
- 这两个字段属于微软Project敏捷模板内置的系统字段,不属于自定义字段范畴,因此
ProjectFile.getCustomFields()无法查询到对应结果,getFieldByAlias()调用失败大概率是传入了中文别名,MPXJ内置枚举对应的是英文字段标识,直接通过TaskField枚举取值即可,示例代码如下:
// 读取单任务字段值 Task targetTask = projectFile.getTaskByID(任务ID); String sprintValue = targetTask.get(TaskField.SPRINT); String boardStatusValue = targetTask.get(TaskField.BOARD_STATUS);
- 若上述方法返回空值,先升级MPXJ到11.0.0及以上稳定版本,低版本对Project敏捷字段的适配存在缺陷,未覆盖部分新版MPP文件的字段存储逻辑。
- 升级后仍无法读取的,可遍历所有已填充的任务字段匹配值,部分本地化版本的Project文件会存在字段标识偏移的情况,遍历代码如下:
Task sampleTask = projectFile.getTasks().get(0); for (TaskField field : projectFile.getTasks().getPopulatedFields()) { Object fieldValue = sampleTask.get(field); System.out.printf("字段ID:%s 字段名:%s 字段值:%s%n", field.getID(), field.getName(), fieldValue); }
运行后比对输出值和原MPP文件中的Sprint、Board Status实际值,找到对应字段后直接通过ID调用即可。
替代解析方案
- .NET环境下可使用微软官方
Microsoft.Office.Interop.MSProject接口读取,可兼容所有Project版本的内置字段,缺点是运行环境需要提前安装微软Project软件。 - 跨环境场景可选用Aspose.Tasks商业库,对敏捷类字段的兼容性优于MPXJ,无需依赖本地安装Project软件,可满足商用场景需求。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

