我试图使用MPXJ从代码中存在的层次结构创建项目文件。需要转换以下层次结构:
etc.)
我创建.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个任务)互操作代码。是否有一种方法可以使用interop写入Projcet文件而不打开Project文件。
谢谢!!
发布于 2011-07-26 12:26:49
和Ryan谈过线下,看看他的数据-这是我们发现的。
Ryan可以使用MPXJ生成MPX和MSPDI文件,每个任务的属性集最少。在上面显示的示例代码中,只提供了一个名称和开始日期。在MPX和MSPDI文件中,所有任务名称都按预期显示。
当在Project 2003或Project 2007中打开时,所有任务名称都是可见的.但是,如果开始遍历文件并折叠任务层次结构(如果是Ryan生成的数据,则折叠客户级别下的所有任务),偶尔其中一个任务将被排除在外。该任务的所有数据将简单地消失,任何扩展和折叠任务层次结构都不会使其恢复。
在Project 2010中,这种行为似乎更糟糕,在项目加载时,许多任务名称都是空白的。
看起来这是一个与导入没有特定属性的文件有关的奇怪的MS问题。在这种情况下,瑞安增加了一个完成日期,他的出口,这似乎起到了作用。当在Project 2010中打开时,包含finish date属性的文件将正确显示所有任务名称。当在Project 2003中打开时,我无法报告原始文件中随机出现的“消隐”问题。
在更一般的说明中,有一个随MPXJ附带的示例类,名为MpxjCreate,它提供了一个示例,说明在more中打开用MPXJ创建的文件时,所需的最小属性集,以确保任务、资源和资源分配按预期显示。
https://stackoverflow.com/questions/6776064
复制相似问题