C# 4.0 MPXJ始终添加空白任务名称…MPXJ是否比Interop更好?

C# 4.0 MPXJ始终添加空白任务名称…MPXJ是否比Interop更好?,c#-4.0,office-interop,ms-project,mpxj,C# 4.0,Office Interop,Ms Project,Mpxj,我试图使用MPXJ从代码中存在的层次结构创建项目文件。需要转换以下层次结构: 分部 顾客 合同 计划 项目详情(开始/结束日期等) 我创建.mpx的代码如下: private void BuildExport() { net.sf.mpxj.ProjectFile file = new net.sf.mpxj.ProjectFile(); net.sf.mpxj.ProjectCalendar cal = file.addDefaul

我试图使用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文件中有一些客户是空的(尽管我在添加这些客户时插入了断点,并确保名称不是空的)。是否需要设置其他内容以确保使用所有名称

我是否应该继续使用极其缓慢的互操作代码(创建6000个任务需要17分钟)。是否有一种方法可以在不打开项目文件的情况下使用互操作写入项目集文件


谢谢

与Ryan进行了离线交谈,并查看了他的数据——以下是我们的发现

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

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

在Project2010中,这种行为似乎更糟糕,在Project2010中,许多任务名称在项目加载时都是空白的

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


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

Hi,你能把你用示例代码生成的MPX文件发给我吗(我的联系方式可以在mpxj.sf.net上找到),你能确认你使用的是哪个版本的mpxj吗?@Jon,我已经通过电子邮件把MPX文件发给你了。我正在使用MPXJ的v4.2。谢谢你的帮助。