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 分) 相互運用コードの使用に戻る必要があります。プロジェクト ファイルを開かずに相互運用機能を使用して Projcet ファイルに書き込む方法はありますか。
ありがとう!!