MPXJ последовательно добавляет пустое имя задачи. Лучше ли MPXJ, чем Interop?

Я пытаюсь использовать MPXJ для создания файла проекта из иерархии, которая существует в моем коде. Необходимо преобразовать следующую иерархию:

  • Division
    • Customer
      • Contract
        • Projects
          • Project details (start/end dates, 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 задач) кода взаимодействия. Есть ли способ записать файл Projcet с помощью взаимодействия без открытия файла проекта.

Спасибо!!


person Thelonias    schedule 21.07.2011    source источник
comment
Здравствуйте, можете ли вы прислать мне сгенерированный вами файл MPX с кодом примера (мои контактные данные можно найти на сайте mpxj.sf.net), и можете ли вы подтвердить, какую версию MPXJ вы используете?   -  person Jon Iles    schedule 21.07.2011
comment
@Jon, я отправил тебе файл MPX по электронной почте. Я использую v4.2 MPXJ. Спасибо за вашу помощь.   -  person Thelonias    schedule 22.07.2011


Ответы (1)


Поговорив с Райаном в оффлайне и просмотрев его данные - вот что мы нашли.

Райан может создавать файлы MPX и MSPDI, используя MPXJ, с минимальным набором атрибутов для каждой задачи. В приведенном выше примере кода указываются только имя и дата начала. Все имена задач отображаются, как и ожидалось, в файлах MPX и MSPDI.

При открытии в Project 2003 или Project 2007 видны все имена задач... однако, если вы начнете работать с файлом и свернете иерархию задач (в случае с данными, созданными Райаном, свернут все задачи под уровень клиента) иногда одна из задач будет просто отключена. Все данные для этой задачи просто исчезнут, и никакое расширение и свертывание иерархии задач не вернет их обратно.

Поведение кажется хуже в Project 2010, где многие имена задач остаются пустыми, как только проект загружается.

Похоже, это странная проблема MS Project, связанная с импортом файлов, в которых отсутствуют определенные атрибуты. В данном случае Райан добавил к своему экспорту дату окончания, и это, похоже, сработало. При открытии в Project 2010 файлы, содержащие атрибут даты окончания, правильно отображают все имена задач. При открытии в Project 2003 я не смог воспроизвести случайную проблему «гашения», которую я видел с исходным файлом.

В более общем плане, есть пример класса, который поставляется с MPXJ, называемый MpxjCreate, который дает пример минимального набора атрибутов, необходимых для обеспечения того, чтобы задачи, ресурсы и назначения ресурсов отображались должным образом, когда файлы, созданные с помощью MPXJ, открываются в MS. Проект.

person Jon Iles    schedule 26.07.2011