如何用Java的MPXJ库让MPP兼容XML文件默认显示Work与ID列
实现MS Project XML默认显示ID和Work列
要让生成的MS Project兼容XML文件打开时默认显示ID和Work列,核心是通过MPXJ配置文件中的视图布局信息——MS Project会读取视图定义来决定默认显示的列。以下是具体实现方案:
解决方案代码
在你完成任务和资源的填充后,添加视图配置逻辑:
// 获取或创建甘特图视图(MS Project默认打开的视图) View ganttView = _project.getViews().getViewByName("Gantt Chart"); if (ganttView == null) { ganttView = _project.addView(); ganttView.setName("Gantt Chart"); ganttView.setType(ViewType.GANTT_CHART); } // 清空原有列配置(可选,若需要完全自定义显示列则执行) ganttView.getColumns().clear(); // 添加ID列 Column idColumn = ganttView.addColumn(); idColumn.setField(TaskField.ID); idColumn.setTitle("ID"); idColumn.setWidth(50); // 自定义列宽 // 添加Work列 Column workColumn = ganttView.addColumn(); workColumn.setField(TaskField.WORK); workColumn.setTitle("Work"); workColumn.setWidth(100); // 可按需添加其他常用列,比如任务名称列 Column nameColumn = ganttView.addColumn(); nameColumn.setField(TaskField.NAME); nameColumn.setTitle("Name"); nameColumn.setWidth(200); // 设置该视图为默认视图,确保打开文件时自动加载 _project.setDefaultView(ganttView);
关键说明
- MPXJ的
View类对应MS Project的视图定义,通过配置Column并关联TaskField枚举,可以指定要显示的列; TaskField.ID和TaskField.WORK是MPXJ内置的枚举值,精准对应MS Project中的ID和工时字段;- 若原有视图存在,可选择清空列后重新添加,或在现有列基础上插入需要的列;
- 设置
DefaultView确保文件打开时自动加载配置好的视图。
原问题代码参考
你提供的任务填充代码如下:
if (!extractedRow.getElement().isEmpty()) { element = contract.addTask(); element.setName(extractedRow.getElement()); element.setStart(startingDate); element.setOutlineLevel(LookUp.Mpp_Conversion_Element_OutlineLevel()); element.setID(id++); } else if (!extractedRow.getWorkpackage().isEmpty()) { workpackage = Objects.requireNonNull(element).addTask(); workpackage.setName(extractedRow.getWorkpackage()); workpackage.setOutlineLevel(LookUp.Mpp_Conversion_Workpackage_OutlineLevel()); workpackage.setID(id++); } else if (!extractedRow.getTask().isEmpty()) { task = Objects.requireNonNull(workpackage).addTask(); task.setName(extractedRow.getTask()); task.setType(TaskType.FIXED_WORK); task.setOutlineLevel(LookUp.Mpp_Conversion_Task_OutlineLevel()); task.setWork(Duration.getInstance(extractedRow.getEstimatedTime(), TimeUnit.HOURS)); task.setDuration(Duration.getInstance(extractedRow.getEstimatedTime() / 8, TimeUnit.DAYS)); task.setRemainingWork(Duration.getInstance(extractedRow.getEstimatedTime(), TimeUnit.HOURS)); task.setID(id++); if (!extractedRow.getRole().isEmpty()) { for (Resource resource : _project.getResources()) { if (resource.getName().equals(_filereader.get_mapper().getMapping(extractedRow.getRole()))) { assn = Objects.requireNonNull(task).addResourceAssignment(resource); assn.setStart(task.getStart()); assn.setWork(Duration.getInstance(extractedRow.getEstimatedTime(), TimeUnit.HOURS)); } } } }
内容的提问来源于stack exchange,提问作者Florian Bär
相关产品推荐
相关产品推荐

