【发布时间】:2011-07-26 20:26:49
【问题描述】:
我正在尝试使用 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 文件。
谢谢!!
【问题讨论】:
-
嗨,你能把你用你的示例代码生成的 MPX 文件发给我吗(我的联系方式可以在 mpxj.sf.net 找到),你能确认你使用的是哪个版本的 MPXJ?
-
@Jon,我已将 MPX 文件通过电子邮件发送给您。我正在使用 MPXJ v4.2。感谢您的帮助。
标签: c#-4.0 office-interop ms-project mpxj