Экспорт и импорт из Primavera P6

С библиотекой dhtmlxGantt вы можете легко экспортировать данные из вашей диаграммы Ганта в Primavera P6 или импортировать данные из Primavera P6 в диаграмму Ганта.

Сервис экспорта бесплатен, но если вы используете библиотеку по лицензии GPL, в полученном файле будет водяной знак. Если у вас есть действующая лицензия PRO, экспорт будет без водяного знака в течение периода вашей поддержки (12 месяцев для всех PRO лицензий).

Существует несколько сервисов экспорта, которые вы можете настроить на вашем компьютере для локальной обработки экспорта диаграмм Ганта в Primavera P6. Обратите внимание, что эти сервисы экспорта не входят в пакет Gantt. Для получения подробной информации о том, как использовать каждый сервис, ознакомьтесь с соответствующей статьей.

Ограничения онлайн-сервиса экспорта

Онлайн-сервис экспорта имеет некоторые ограничения по времени и размеру запроса.

Ограничения по времени

Если процесс экспорта занимает более 20 секунд, он будет отменен, и вы увидите сообщение об ошибке следующего содержания:

Ошибка: Тайм-аут 20 секунд

Когда несколько пользователей одновременно экспортируют диаграммы Ганта, процесс может занять немного больше времени. Однако время, затраченное на каждый запрос экспорта пользователя, рассчитывается индивидуально.

Ограничения по размеру запроса

Общий API-эндпоинт https://export.dhtmlx.com/gantt используется для всех методов экспорта (exportToPDF, exportToPNG, exportToMSProject и т.д.). Максимальный размер запроса здесь составляет 10 MB.

Для экспортных/импортных сервисов MS Project и Primavera P6 (exportToMSProject, importFromMSProject, exportToPrimaveraP6, importFromPrimaveraP6) доступен выделенный API-эндпоинт: https://export.dhtmlx.com/gantt/project. Этот эндпоинт позволяет больший размер запроса — 40 MB.

Использование модулей экспорта

Если вам нужно обрабатывать более крупные диаграммы, рассмотрите возможность использования стендэлон модуля экспорта. Этот модуль предоставляется бесплатно, если у вас есть Commercial, Enterprise или Ultimate лицензия. Альтернативно, вы можете приобрести его отдельно.

Для получения более подробной информации о использовании модуля экспорта для MS Project, обратитесь к документации. Этот модуль поддерживает как экспорт, так и импорт для MS Project и Primavera P6.

Экспорт в Primavera P6

Компонент Gantt позволяет экспортировать задачи, связи и ресурсы в Primavera P6.

Чтобы экспортировать данные из диаграммы Ганта в Primavera P6, выполните следующие шаги:

  • Включите плагин export_api через метод плагины, если вы используете онлайн-сервис экспорта:
gantt.plugins({
    export_api: true
});

Для версий Gantt старше 8.0, вам нужно включить https://export.dhtmlx.com/gantt/api.js на вашей странице, чтобы использовать онлайн-сервис экспорта. Например:

<script src="codebase/dhtmlxgantt.js"></script>
<script src="https://export.dhtmlx.com/gantt/api.js"></script>

gantt.exportToPrimaveraP6();

Этот метод отправляет запрос на удаленный сервис, который либо генерирует XML файл проекта, либо предоставляет ссылку для скачивания файла.

Related sample:  Export data : MS Project, PrimaveraP6, Excel & iCal

При экспорте данных в Primavera убедитесь, что свойство Summary для проектных задач установлено в true для корректной работы:

gantt.exportToPrimaveraP6({
  tasks: {
    Summary: function (task) {
      return !!gantt.hasChild(task.id);
    },
    CustomProperty: function (task) {
      return task.custom_property;
    },
    SlateId: function (task) {
      return task.id + "";
    },
  }
});

Related sample:  Пользовательские свойства для WBS задач (Summary задачи PrimaveraP6)

Ответ

Ответ включает JSON объект следующей структуры:

{
    data: {},
    config: {},
    resources: [],
    worktime: {}
}
  • data: объект данных Gantt, содержащий детали задач, такие как id, open, parent, progress, start_date, text и resource. Даты форматируются как строки в формате "%Y-%m-%d %H:%i".
  • config: объект конфигурации Gantt с настройками, извлеченными из файла проекта.
  • resources: Массив объектов, каждый из которых содержит свойства id, name и type, представляющие список ресурсов из файла проекта.
  • worktime: Объект с настройками рабочего времени из календаря проекта.

Настройки экспорта

Метод exportToPrimaveraP6() позволяет экспортировать данные, передавая объект с несколькими необязательными свойствами:

  • name - (строка) Устанавливает имя для экспортированного файла. По умолчанию он называется 'gantt.xml'.
gantt.exportToPrimaveraP6({
    name: 'custom.xml'
});
  • auto_scheduling - (логическое) Определяет режим планирования задач в экспортированном проекте. Если установлено в true, задачи обозначаются как автоматически планируемые. Если установлено в false, задачи планируются вручную (по умолчанию).
gantt.exportToPrimaveraP6({
    auto_scheduling: false
});
  • skip_circular_links - (логическое) Определяет, следует ли исключать циклические связи. По умолчанию установлено в true, что означает удаление циклических связей. Установите в false, если хотите их сохранить.
gantt.exportToPrimaveraP6({
    skip_circular_links: false
});
  • project - (объект) Позволяет определить пользовательские свойства для экспортируемой сущности проекта.
gantt.exportToPrimaveraP6({
    project: {
        'Author': 'I am!',
        'MinutesPerDay': function () {
            return gantt.config.hours_per_day * 60;
        }
    }
});

Свойства в этом объекте соответствуют соответствующим свойствам сущности проекта. Вы можете найти список поддерживаемых свойств здесь. Эти свойства могут иметь фиксированные значения или функции, которые выполняются во время экспорта.

  • tasks - (объект) Позволяет определить пользовательские свойства для экспортируемых элементов задач.
gantt.exportToPrimaveraP6({
   tasks: {
        'StartVariance': function (task) {
           return task.startVariance || 0;
        },
        'PercentWorkComplete': function (task) {
           return task.progress + 0.1;
        },
        'Custom': function (task) {
           return 'Custom value';
        },
        'Custom 2': 'My Custom value'
    }
});

Свойства в этом объекте соответствуют соответствующим свойствам сущности задачи. Проверьте список поддерживаемых свойств. Эти свойства могут быть фиксированными значениями или функциями, выполняемыми для каждой задачи во время экспорта.

  • data - (объект) Позволяет указать собственный источник данных для экспортируемой диаграммы Ганта.

Убедитесь, что start_date и end_date отформатированы так, чтобы включать как дату, так и время (%d-%m-%Y %H:%i).

const customData = {
    "data": [
        { "id": "10", "text": "Project #5", "start_date": "01-04-2025 00:00", 
            "duration": 3, "order": 10, "progress": 0.4, "open": true, 
            "end_date": "04-04-2025 00:00", "parent": 0 
        },
        { "id": "1", "text": "Task #67", "start_date": "02-04-2025 00:00", 
            "duration": 2, "order": 10, "progress": 0.6, "parent": "10", 
            "end_date": "04-04-2025 00:00" 
        },
        { "id": "2", "text": "Task #89", "start_date": "01-04-2025 00:00", 
            "duration": 2, "order": 20, "progress": 0.6, "parent": "10", 
            "end_date": "03-04-2025 00:00" 
        },
    ],
    "links": [
        { "id": 1, "source": 1, "target": 2, "type": "1" },
    ]
}
 
gantt.exportToPrimaveraP6({
    data: customData
});

Related sample:  Gantt. Экспорт пользовательских данных

  • callback - (функция) Если вы хотите получить URL для скачивания сгенерированного XML, используйте свойство callback. Оно получает JSON объект с url свойством.
gantt.exportToPrimaveraP6({
    callback: function(res){
        alert(res.url);
    }
});
  • resources - (массив) Позволяет включить список ресурсов в экспортируемый файл Primavera P6.
gantt.exportToPrimaveraP6({
    resources: [
        {"id":"1","name":"John","type":"work"},
        {"id":"2","name":"Mike","type":"work"},
        {"id":"3","name":"Anna","type":"work"}
    ]
});

Типы ресурсов могут быть "work", "cost" или "material". Вы можете указать назначения ресурсов через свойство ResourceAssignments в конфигурации задачи:

var users = [// ресурсы
    {key:'0', label: "N/A"},
    {key:'1', label: "John"},
    {key:'2', label: "Mike"},
    {key:'3', label: "Anna"}
];
 
gantt.exportToPrimaveraP6({
    resources: users
        .filter(function(u){
            return u.key !== '0'; // пропустить опцию по умолчанию
        })
        .map(function(u){
            return {
                id: u.key,
                name: u.label,
                type: "work"
            };
        }),
    tasks: {
        ResourceAssignments: function(task){              return task.user;                          }                                          }
});

Свойство ResourceAssignments должно быть функцией, которая принимает объект задачи и возвращает строку/число или массив из них.

tasks: {
    ResourceAssignments: function(task){
        return [task.user, task.office];
    }
}

Related sample:  Экспорт Gantt с ресурсами в Primavera P6

  • server - (строка) Указывает API-эндпоинт для запроса. Вы можете использовать это для локальной установки сервиса экспорта. Значение по умолчанию: https://export.dhtmlx.com/gantt.
gantt.exportToPrimaveraP6({
    server: "https://myapp.com/myexport/gantt"
});

Импорт из Primavera P6

Чтобы конвертировать XML или XER файл, отправьте следующий запрос на сервис экспорта:

  • URL запроса: https://export.dhtmlx.com/gantt
  • Метод запроса: POST
  • Content-Type: multipart/form-data

Параметры включают:

  • file: XER или XML файл Primavera P6.
  • type: "primaveraP6-parse".
  • data: (необязательно) JSON строка с настройками.

Пример:

<form action="https://export.dhtmlx.com/gantt" method="POST" 
    enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="hidden" name="type" value="primaveraP6-parse">
    <button type="submit">Получить</button>
</form>

Альтернативно, вы можете использовать API на стороне клиента:

gantt.importFromPrimaveraP6({
    data: file,
    taskProperties: ["Notes", "Name"],
    callback: function (project) {
        if (project) {
            gantt.clearAll();
            if (project.config.duration_unit) {
                gantt.config.duration_unit = project.config.duration_unit;
            }                    
            gantt.parse(project.data);
        }
     }
});

Related sample:  Import Primavera P6 file

Здесь file — это экземпляр File, содержащий XML или XER файл проекта.

gantt.importFromPrimaveraP6 требует поддержки HTML5 File API.


Ответ

Ответ включает JSON объект со следующей структурой:

{
    data: {},
    config: {},
    resources: [],
    worktime: {}
}
  • data: объект данных Gantt. Каждая задача включает такие свойства, как id, open, parent, progress, start_date, text и resource. Даты форматируются как "%Y-%m-%d %H:%i".
  • config: объект конфигурации Gantt с настройками из файла проекта.
  • resources: Массив объектов, представляющих ресурсы, каждый из которых содержит свойства id, name и type.
  • worktime: Объект с настройками рабочего времени из календаря проекта.

Настройки импорта

Установка единицы измерения длительности

Вы можете определить ожидаемую единицу измерения длительности, используя свойство durationUnit ("minute", "hour", "day", "week", "month", "year").

<form action="https://export.dhtmlx.com/gantt" method="POST" 
    enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="hidden" name="type" value="primaveraP6-parse">
    <input type="hidden" name="data" 
        value="{ \"durationUnit\": \"hour\" }" />
    <button type="submit">Получить</button>
</form>

или

gantt.importFromPrimaveraP6({
    data: file,
    durationUnit: "hour",
    callback: function(project){}
});

Получение свойств проекта

Чтобы получить поля проекта, включите параметр projectProperties с массивом желаемых полей. Эти поля извлекаются в свойство config ответа. Список поддерживаемых свойств находится здесь.

<form action="https://export.dhtmlx.com/gantt" method="POST" 
    enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="hidden" name="type" value="primaveraP6-parse">
    <input type="hidden" name="data" 
        value="{ \"projectProperties\": [\"Author\", \"Title\"] }" />
    <button type="submit">Получить</button>
</form>

или

gantt.importFromPrimaveraP6({
    data: file,
    durationUnit: "hour",
    projectProperties: ["Author", "Title"],
    callback: function(project){
        var config = project.config;
        alert(config.$custom_properties.Author);
    }
});

Получение свойств задач

Чтобы получить поля задач, используйте параметр taskProperties с массивом необходимых полей. Эти поля извлекаются в свойство data ответа. Поддерживаемые свойства перечислены здесь.

<form action="https://export.dhtmlx.com/gantt" method="POST" 
    enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="hidden" name="type" value="primaveraP6-parse">
    <input type="hidden" name="data" 
        value="{ \"taskProperties\": [\"Contact\", \"Priority\"] }" />
    <button type="submit">Получить</button>
</form>

или

gantt.importFromPrimaveraP6({
    data: file,
    durationUnit: "hour",
    taskProperties: ["Contact", "Priority"],
    callback: function(project){
        var config = project.config;
        alert(config.$custom_properties.Author);
        gantt.parse(project.data);
    }
});
gantt.attachEvent("onTaskLoading", function(task) {
    if (task.$custom_data) {
        task.contact = task.$custom_data["Contact"];
        task.priority = task.$custom_data["priority"];
        delete task.$custom_data;
    }
    return true;
});

Получение типов задач

Чтобы определить тип задачи, логика проста: задачи, отмеченные как Project, имеют свойство Summary: "1", а те, что отмечены как Milestone, имеют свойство Milestone: "1". Идея заключается в том, чтобы импортировать данные, содержащие эти свойства, и затем установить соответствующий тип задачи.

Вот как будет выглядеть вызов функции импорта:

gantt.importFromPrimaveraP6({
    data: file,
    taskProperties: [
        "Summary", 
        "Milestone",
    ],
    callback: function (project) {
        if (project) {
            console.log(project)
            gantt.clearAll();
            if (project.config.duration_unit) {
                gantt.config.duration_unit = project.config.duration_unit;
            }
            console.log('import: ', project.data);
            gantt.parse(project.data);
        }
    }
});

После импорта данных вы можете настроить типы задач в зависимости от полученных свойств. Вот пример:

gantt.attachEvent("onTaskLoading", function (task) {
    if (task.$custom_data) {
        if (task.$custom_data.Summary == "1") {
            task.type = "project";
        }
        if (task.$custom_data.Milestone == "1") {
            task.type = "milestone";
        }
        // delete task.$custom_data;
    }
    return true;
});

Related sample:  Gantt. Импорт файлов Primavera P6. Получение типа задачи из свойств

Ограничения по размеру запроса и импорт больших файлов

Существует два API-эндпоинта для обработки экспортных/импортных сервисов Primavera P6:

  • https://export.dhtmlx.com/gantt - это стандартный эндпоинт для всех методов экспорта (exportToPDF, exportToPNG, exportToPrimaveraP6 и т.д.). Максимальный размер запроса составляет 10 MB.
  • https://export.dhtmlx.com/gantt/project - этот эндпоинт предназначен для сервисов MSProject и Primavera P6 (exportToMSProject, importFromMSProject, exportToPrimaveraP6, importFromPrimaveraP6). Он поддерживает запросы до 40 MB.

Эндпоинт можно задать с помощью свойства server в объекте конфигурации экспорта:

gantt.importFromPrimaveraP6({
    server:"https://export.dhtmlx.com/gantt",
    data: file,
    callback: function(project){
       // некоторая логика
    }
});

Если эндпоинт не указан, используется стандартный эндпоинт https://export.dhtmlx.com/gantt. Например, следующий вызов работает так же, как и предыдущий:

gantt.importFromPrimaveraP6({
    data: file,
    callback: function(project){
       // некоторая логика
    }
});

Для обработки более крупных проектов (более 4MB) можно использовать второй эндпоинт:

gantt.importFromPrimaveraP6({
    server:"https://export.dhtmlx.com/gantt/project",
    data: file,
    callback: function(project){
       // некоторая логика
    }
});

Этот эндпоинт поддерживает запросы до 40MB и специально предназначен для экспорта и импорта Primavera P6. Учтите, что он применим только для операций, связанных с Primavera P6.

Использование этого эндпоинта для других методов, таких как gantt.exportToPDF({server:"https://export.dhtmlx.com/gantt/project"}), приведет к ошибке сервера.

К началу