0

我正在尝试使用 MPXJ 从我的代码中存在的层次结构创建项目文件。需要转换以下层次结构:

  • 分配
    • 顾客
      • 合同
        • 项目
          • 项目详情(开始/结束日期等)

我创建 .mpx 的代码如下:

private void BuildExport()
    {

        net.sf.mpxj.ProjectFile file = new net.sf.mpxj.ProjectFile();
        net.sf.mpxj.ProjectCalendar cal = file.addDefaultBaseCalendar();

        //Microsoft.Office.Interop.MSProject.Application projApp = new Microsoft.Office.Interop.MSProject.Application();
        //projApp.Visible = true;
        //projApp.FileNew();

        string firstDate = string.Empty;

        foreach (IZCpTreeViewItem div in Divisions)
        {
            net.sf.mpxj.Task divTask = file.addTask();
            divTask.setName(div.Name);

            //Microsoft.Office.Interop.MSProject.Task newTask = projApp.ActiveProject.Tasks.Add(div.Name);

            //newTask.OutlineLevel = 1;

            foreach (IZCpTreeViewItem cust in div.Subitems)
            {
                net.sf.mpxj.Task custTask = null;

                if (cust.Subitems.Count > 0)
                {
                    custTask = divTask.addTask();
                    custTask.setName(cust.Name);
                }                    

                //Microsoft.Office.Interop.MSProject.Task custTask = newTask.OutlineChildren.Add(cust.Name);

                //custTask.OutlineLevel = 2;

                foreach (IZCpTreeViewItem contractVm in cust.Subitems)
                {
                    net.sf.mpxj.Task contTask = custTask.addTask();
                    contTask.setName(contractVm.Name);

                    //Microsoft.Office.Interop.MSProject.Task contractTask = custTask.OutlineChildren.Add(contractVm.Name);

                    //contractTask.OutlineLevel = 3;

                    foreach (ZCpProjectViewModel proj in (contractVm as ZCpContractViewModel).Projects)
                    {
                        net.sf.mpxj.Task projTask = contTask.addTask();
                        projTask.setName(proj.Name);

                        //Microsoft.Office.Interop.MSProject.Task projTask = contractTask.OutlineChildren.Add(proj.Project.Name);

                        //projTask.OutlineLevel = 4;

                        foreach (ZCpProjectDetailViewModel detail in proj.ProjectDetail)
                        {
                            net.sf.mpxj.Task projDTask = projTask.addTask();
                            projDTask.setName(detail.ProjectDetail.CostClass);
                            projDTask.setStart(detail.StartDate.HasValue ? new java.util.Date(detail.StartDate.ToString()) : null);

                            //Microsoft.Office.Interop.MSProject.Task projDetailTask = projTask.OutlineChildren.Add(detail.ProjectDetail.CostClass);

                            //projDetailTask.Start = String.Format("{0}", detail.StartDate.ToString());
                            //projDetailTask.Finish = String.Format("{0}", detail.EndDate.ToString());

                            //projDetailTask.OutlineLevel = 5;
                        }
                    }
                }
            }
        }

        net.sf.mpxj.writer.ProjectWriter writer = new MPXWriter();
        writer.write(file, "example.mpx");
    }

注释掉的代码是我在找到 MPXJ 之前使用的互操作代码。我的问题是,在我运行这个块之后,我的 .mpx 文件中有一些客户是空白的(即使我在添加这些客户时设置了断点并确保名称不为空)。我还需要设置其他东西以确保使用所有名称吗?

我是否应该回到使用极其缓慢(17 分钟创建约 6000 个任务)的互操作代码。有没有办法在不打开项目文件的情况下使用互操作写入 Projcet 文件。

谢谢!!

4

1 回答 1

2

与 Ryan 离线交谈并查看了他的数据 - 这就是我们发现的。

Ryan 可以使用 MPXJ 生成 MPX 和 MSPDI 文件,每个任务都具有最少的属性集。在上面显示的示例代码中,只提供了名称和开始日期。所有任务名称都按预期出现在 MPX 和 MSPDI 文件中。

在 Project 2003 或 Project 2007 中打开时,所有任务名称都是可见的......但是,如果您开始处理文件并折叠任务层次结构(在 Ryan 生成的数据的情况下,折叠下面的所有任务)客户级别)有时其中一项任务会被空白。该任务的所有数据将简单地消失,并且无论扩展和折叠任务层次结构都不会将其恢复。

Project 2010 中的行为似乎更糟,其中许多任务名称在项目加载后立即为空。

看起来这是一个奇怪的 MS Project 问题,与导入不存在某些属性的文件有关。在这种情况下,Ryan 在他的出口中添加了一个完成日期,这似乎起到了作用。在 Project 2010 中打开时,包含完成日期属性的文件正确显示所有任务名称。在 Project 2003 中打开时,我无法重现我在原始文件中看到的随机“空白”问题。

在更一般的说明中,MPXJ 附带了一个名为 MpxjCreate 的示例类,它提供了一个示例,说明了在 MS 中打开使用 MPXJ 创建的文件时确保任务、资源和资源分配按预期显示所需的最小属性集项目。

于 2011-07-26T12:26:49.683 回答