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 ファイルに空白の顧客が含まれていることです (これらの顧客を追加するときにブレークポイントを設定し、名前が空でないことを確認したにもかかわらず)。すべての名前が確実に使用されるように設定する必要があるものは他にありますか?

信じられないほど遅い (約 6000 のタスクを作成するのに 17 分) 相互運用コードの使用に戻る必要があります。プロジェクト ファイルを開かずに相互運用機能を使用して Projcet ファイルに書き込む方法はありますか。

ありがとう!!

4

1 に答える 1

2

ライアンとオフラインで話し、彼のデータを見た-これが私たちが見つけたものです。

Ryanは、MPXJを使用して、各タスクの最小限の属性セットを使用して、MPXファイルとMSPDIファイルの両方を生成できます。上記のサンプルコードでは、名前と開始日のみが指定されています。すべてのタスク名は、MPXファイルとMSPDIファイルの両方で期待どおりに表示されます。

Project2003またはProject2007で開くと、すべてのタスク名が表示されます...ただし、ファイルの操作を開始してタスク階層を折りたたむと(Ryanが生成したデータの場合、下のすべてのタスクを折りたたむ)顧客レベル)場合によっては、タスクの1つが空白になることがあります。そのタスクのすべてのデータは単純に消え、タスク階層を展開したり折りたたんだりしても、データは元に戻りません。

プロジェクトが読み込まれるとすぐにタスク名の多くが空白になるProject2010では、動作が悪化しているようです。

これは、特定の属性が存在しないファイルのインポートに関連する奇妙なMSProjectの問題のようです。この場合、ライアンはエクスポートに終了日を追加しましたが、それでうまくいくようです。Project 2010で開くと、終了日属性を含むファイルにすべてのタスク名が正しく表示されます。Project 2003で開いたとき、元のファイルで見たランダムな「ブランキング」の問題を再現できませんでした。

より一般的な注意点として、MPXJで作成されたファイルをMSで開いたときに、タスク、リソース、およびリソースの割り当てが期待どおりに表示されるようにするために必要な属性の最小セットの例を示す、MpxjCreateと呼ばれるMPXJに付属するクラスの例があります。計画。

于 2011-07-26T12:26:49.683 に答える