MPXJ 7.2.1读取自定义标题Lookup字段值失败问题求助
解决MPXJ 7.2.1读取重命名Lookup自定义字段返回null的问题
我之前也碰到过一模一样的情况——把Microsoft Project里的Text类自定义字段改成Lookup类型并重命名后,用task.getText(1)这类按索引调用的方法就拿不到值了,返回全是null。这其实是因为MPXJ对重命名后的Lookup字段的处理逻辑和普通文本字段不一样,原来的索引已经找不到对应字段了。
针对你需要处理大量大型项目文件的场景,这里有两个实用的解决方案:
1. 通过字段名称而非索引获取值
放弃用getText(int)这种按索引的方法,转而通过字段的实际名称(比如你改的"Test")来定位自定义字段,再获取对应的值。这样不管字段有没有重命名、是不是Lookup类型,都能准确拿到数据。
考虑到你要处理大量大文件,建议把自定义字段的定位逻辑缓存起来,避免重复遍历损耗性能:
// 初始化时缓存项目中的Lookup类型文本字段(每个项目只执行一次) Map<String, CustomField> lookupTextFieldMap = new HashMap<>(); for (CustomField field : projectFile.getCustomFields()) { if (field.getType() == CustomFieldType.TEXT && field.getLookupValues() != null) { lookupTextFieldMap.put(field.getName(), field); } } // 处理单个任务时直接从缓存取字段 CustomField testField = lookupTextFieldMap.get("Test"); if (testField != null) { Object fieldValue = task.getCustomFieldValue(testField); // 转换为LookupValue获取实际值 if (fieldValue instanceof LookupValue) { LookupValue lookupVal = (LookupValue) fieldValue; String displayContent = lookupVal.getDescription(); // Project界面显示的内容 String internalValue = lookupVal.getValue(); // 字段内部存储值 // 根据业务需求处理这两个值即可 } }
2. 尝试升级MPXJ版本
这个问题大概率是MPXJ 7.2.1的一个版本bug,后续更新的版本可能已经修复了按索引读取重命名Lookup字段的问题。如果你的项目依赖允许,可以尝试升级到最新稳定版(比如当前的MPXJ 12.x系列),升级后再测试task.getText(1)是否能正常返回值。不过升级前一定要在测试环境验证兼容性,避免影响现有业务逻辑。
为什么task.getText(1)会返回null?
简单来说,当你把Text1改成Lookup类型并重命名后,MPXJ内部不再把它当作原来的"Text1"普通文本字段处理了。原来的索引1对应的是未被修改的普通Text1字段,但此时这个字段的元数据已经发生了本质变化,所以按索引调用就找不到对应的有效字段,自然返回null。
内容的提问来源于stack exchange,提问作者W. Lund
相关产品推荐
相关产品推荐

