You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:35:22