Перейти к основному содержимому

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

Библиотека dhtmlxGantt позволяет экспортировать данные из диаграммы Ганта в Primavera P6. Также вы можете импортировать данные в Gantt из Primavera P6.

заметка

Онлайн-сервис экспорта бесплатный. Условия лицензии см. в разделе Лицензия и водяной знак.

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

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

заметка

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

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

Чтобы экспортировать большие диаграммы, экспортировать без ограничений онлайн-сервиса экспорта или хранить данные в своей сети, установите модуль экспорта на собственный сервер. Подробнее об использовании модуля экспорта для MS Project и Primavera P6.

Экспорт в Primavera P6​

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

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

  • Чтобы использовать функциональность экспорта/импорта, включите плагин export_api через метод plugins:
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>
  • Вызовите метод exportToPrimaveraP6() для экспорта данных из диаграммы Gantt.
gantt.exportToPrimaveraP6();

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

Связанный пример: Export data : MS Project, PrimaveraP6, Excel & iCal

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

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

Связанный пример: Custom properties for WBS tasks (PrimaveraP6's Summary tasks)

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

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

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

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

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

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

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

Ожидается, что свойства 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
});

Связанный пример: Gantt. Export custom data

  • callback - (function) Если вы хотите получить URL для загрузки сгенерированного XML, можно использовать свойство callback. Он принимает JSON-объект с свойством url:
gantt.exportToPrimaveraP6({
callback: function(res){
alert(res.url);
}
});
  • resources - (array) позволяет экспортировать список ресурсов в файл 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 = [// resources
{ key: '0', label: "N/A" },
{ key: '1', label: "John" },
{ key: '2', label: "Mike" },
{ key: '3', label: "Anna" }
];

gantt.exportToPrimaveraP6({
resources: users
.filter(function(u){
if(u.key === '0')//skip the default option
return false;
return true;
})
.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];
}
}

Связанный пример: Export Gantt with resources to Primavera P6

Можно указать параметр units для назначений ресурсов, возвращая следующий объект в свойстве ResourceAssignments:

{
resource_id: "id",
units: "units value"
}
  • resource calendars

По умолчанию каждому заданию добавляется некоторый календарь. Если используются календари ресурсов, необходимо указать -1 для задачи в свойстве CalendarUID во время экспорта (в объекте tasks). Затем задача будет использовать календарь ресурса.

При экспорте resource calendars можно указать календарь ресурса в объекте массива resources:

gantt.exportToPrimaveraP6({
resources: [
{
id: "10",
name: "John",
type: "work",
calendar: gantt.config.resource_calendars[10]
}
]
});
  • server - (string) конечная точка 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 - файл Primavera P6 в формате XER или XML
  • 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">Get</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);
}
}
});

Связанный пример: Import Primavera P6 file

Где file — это экземпляр File, который должен содержать либо XML- или XER-проект.

заметка

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

Ответ​

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

{
data: {},
config: {},
resources: [],
worktime: {},
calendars: []
}
  • data - (object) gantt data object. У каждой задачи есть следующие свойства: id, open, parent, progress, start_date, text, resource. Даты сериализованы в формате "%Y-%m-%d %H:%i".
  • config - (object) объект configuration Gantt со настройками, полученными из файла проекта.
  • resources - (array) массив объектов (у каждого из которых следующие свойства: (id: string, name: string, type: string, calendar: string)), представляющих список ресурсов из файла проекта.
  • worktime - (object) объект, содержащий настройки рабочего времени из календаря проекта. Может содержать следующие атрибуты:
    • id - (string | number) необязательно, идентификатор календаря
    • hours - (array) массив с глобальными рабочими часами, задает начало и конец часов задачи
    • dates - (array) массив дат, который может содержать:
      • 7 дней недели (от 0 — воскресенье до 6 — суббота), где 1/true означает рабочий день, 0/false — нерабочий день
      • другие записи — даты
  • calendars - (array) массив объектов конфигурации календаря для создания нового календаря.
    • calendarConfig - (object) объект конфигурации календаря, который может содержать следующие атрибуты:
      • id - (string | number) необязательно, идентификатор календаря
      • name - (string) имя календаря
      • hours - (array) массив с глобальными рабочими часами, задает начало и конец часов задачи
      • dates - (array) массив дат, который может содержать:
        • 7 дней недели (от 0 — воскресенье до 6 — суббота), где 1/true означает рабочий день и 0/false — нерабочий день
        • другие записи — даты

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

Настройка единицы продолжительности​

Чтобы задать ожидаемую единицу продолжительности, строка 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">Get</button>
</form>

или

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

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

Чтобы получить поля проекта, на сервер можно отправить входной параметр projectProperties с массивом необходимых полей. Он извлекает произвольные свойства сущности Project в свойство config выходного файла. Ниже приведен список поддерживаемых свойств.

  • projectProperties - задает массив свойств проекта, которые должны попасть в ответ.
<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">Get</button>
</form>

или

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

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

Чтобы получить поля задач, можно отправить на сервер входной параметр taskProperties с массивом необходимых полей. Он извлекает произвольные свойства сущностей Task. Ниже приведен список поддерживаемых свойств:

  • taskProperties - указывает массив дополнительных свойств задач для импорта.
<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">Get</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;
});

Связанный пример: Gantt. Import and export Primavera P6 files with additional project, task and resource properties and entities

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

В диаграмме Ганта есть три предопределённых типа задач: обычные задачи (по умолчанию), проекты и вехи. Кроме того, можно определить пользовательские типы в объекте types. Подробное описание см. в соответствующем руководстве Типы задач.

Следующая логика позволяет получить тип задачи: задачи типа 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;
});

Связанный пример: Gantt. Import Primavera P6 files. Get task type from properties

Экспорт/импорт типов активностей Primavera P6​

Primavera P6 использует типы задач, отличающиеся от типов задач, используемых в Gantt и MS Project. Чтобы сохранить информацию об исходном типе Primavera P6, используйте свойство задачи ActivityType при импорте/экспорте файлов. Поскольку ActivityType — это пользовательское свойство для Gantt, оно не влияет на тип задачи на стороне Gantt.

Свойство ActivityType поддерживает полный список типов активностей Primavera P6. Значение, возвращаемое при импорте, задается в PascalCase, а при экспорте принимаются как форма PascalCase, так и UPPER_SNAKE_CASE:

ЗначениеОписание
TaskDependent / TASK_DEPENDENTОбычная задача, планируемая на основе своих предшествующих задач
ResourceDependent / RESOURCE_DEPENDENTОбычная задача, планируемая на основе календаря ресурса (используется по умолчанию, если ActivityType не указан)
StartMilestone / START_MILESTONEВеха, отмечающая начало активности
FinishMilestone / FINISH_MILESTONEВеха, отмечающая завершение активности
WbsSummary / WBS_SUMMARYСуммарная задача WBS
LevelOfEffort / LEVEL_OF_EFFORTЗадача, продолжительность которой определяется поддерживаемыми ею активностями
Hammock / HAMMOCKЗадача, продолжительность которой охватывает период от начала первой связанной активности до завершения последней
StartFlag / START_FLAGФлаг-активность, отмечающая определённую точку в начале проекта
FinishFlag / FINISH_FLAGФлаг-активность, отмечающая определённую точку в конце проекта
Поддержка типов вех Primavera P6​

Примечательно, что перечисленные выше типы Start Milestone и Finish Milestone не имеют отдельных соответствий на стороне Gantt. Библиотека dhtmlxGantt поддерживает только один тип задачи-вехи, эквивалентный типу Finish Milestone в Primavera P6. Таким образом, при импорте проекта Primavera P6 в Gantt все вехи (независимо от того, являются ли они начальными или конечными вехами в исходном файле) преобразуются в задачи типа milestone.

Чтобы сохранить информацию об исходном типе вехи Primavera P6, используйте свойство задачи ActivityType при импорте, добавив его в массив taskProperties. Это свойство возвращается в объекте $custom_data каждой задачи, поэтому скопируйте его в саму задачу в событии onTaskLoading:

gantt.importFromPrimaveraP6({
data: file,
taskProperties: ["ActivityType"],
callback: function (project) {
if (project) {
gantt.clearAll();
gantt.parse(project.data);
}
}
});

gantt.attachEvent("onTaskLoading", function (task) {
if (task.$custom_data) {
task.ActivityType = task.$custom_data.ActivityType;
}
return true;
});

Для вех это свойство хранит исходный тип Primavera P6 в виде строки, например "StartMilestone" или "FinishMilestone". Поскольку ActivityType не влияет на тип задачи на стороне Gantt, задача по-прежнему имеет тип milestone. Это свойство можно использовать, например, для настройки внешнего вида начальных и конечных вех в диаграмме Gantt.

Чтобы сохранить исходный тип задачи при экспорте данных обратно в Primavera P6, верните его из свойства ActivityType в объекте tasks вызова exportToPrimaveraP6(). Поскольку ActivityType описывает все активности Primavera P6, а не только вехи, укажите значение и для остальных типов задач:

gantt.exportToPrimaveraP6({
tasks: {
ActivityType: function (task) {
if (task.type == "milestone") {
return task.ActivityType == "StartMilestone" ? "START_MILESTONE" : "FINISH_MILESTONE";
}
if (task.type == "project") {
return "WBS_SUMMARY";
}
return "TASK_DEPENDENT";
}
}
});

Таким образом, экспортированный файл будет содержать тот же тип Start Milestone / Finish Milestone, что и исходный файл Primavera P6, вместо того чтобы каждая веха экспортировалась как Finish Milestone по умолчанию.

Связанный пример: Gantt. Import and export Primavera P6 files with the ActivityType to get Start and Finish Milestones

Добавление и настройка календарей​

Обратите внимание, что календари не добавляются автоматически во время импорта. Их нужно добавить с помощью метода addCalendar(). После этого следует задать настройки календаря через метод setWorkTime(). Например:

gantt.importFromPrimaveraP6({
data: file,
taskProperties: ["Notes", "Name"],
callback: function (project) {
if (project) {
// настройки для добавления календарей
project.calendars.forEach(function (calendar) {
let addedCalendar;
// добавление настроек рабочего времени для глобального календаря
if (calendar.id == project.config.global_calendar_id) {
addedCalendar = gantt.getCalendar("global");
}
else {
// Gantt не добавляет календарь,
// если параметр `hours` пустой массив
let calendarHours = calendar.hours;
if (!calendarHours.length) {
calendarHours = undefined
}
gantt.addCalendar({
id: calendar.id,
hours: calendarHours,
name: calendar.name
});

addedCalendar = gantt.getCalendar(calendar.id);
}
const worktimeDates = calendar.dates;
for (let element in worktimeDates) {
const date = new Date(+element)
if (element < 10) {
addedCalendar.setWorkTime({
day: element,
hours: worktimeDates[element]
})
}
else {
addedCalendar.setWorkTime({
date: date,
hours: worktimeDates[element]
})
}
}
})
}
}
});

Связанный пример: Gantt. Calendars settings for export/import in MSProject and Primavera P6

Календари ресурсов​

Если есть календари ресурсов, их нужно задать через свойство gantt.config.resource_calendars:

gantt.importFromPrimaveraP6({
data: file,
taskProperties: ["Notes", "Name"],
callback: function (project) {
if (project) {
// настройки календарей
project.calendars.forEach(function (calendar) {
// добавление календарей и настроек рабочего времени для них
})

// настройки календарей ресурсов
gantt.config.resource_calendars = {}

project.resources.forEach(function (resource) {
if (resource.calendar) {
gantt.config.resource_calendars[resource.id] = resource.calendar;
}
})
}
}
});

Связанный пример: Gantt. Resource calendars settings for export/import in MSProject and Primavera P6

Ресурсы и назначения ресурсов​

Если в файле есть ресурсы, они приходят в массиве resources во время импорта. параметр calendar свойства resources задает календарь ресурса:

{
resources: [
{ id: 6, name: "John", type: "work", calendar: "8" },
// more resources
]
}

Если есть назначения ресурсов, они будут импортированы в массиве assignments, где объект назначения содержит параметры resource_id: string и value: number. Например:

{
tasks: [
{
id: 5,
text: "Interior office",
type: "task",
start_date: "03-04-2024 00:00",
duration: 7,
parent: "2",
priority: 1
},
// more tasks
],
links: [],
assignments: [
{ id: 1, task_id: 5, resource_id: 6, value: 3},
// more assignments
],
resources: [
{ id: 6, text: "John", unit: "hours/day" },
{ id: 7, text: "Mike", unit: "hours/day" },
// more resources
]
}

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

В онлайн-сервисе экспорта есть отдельный эндпойнт для больших файлов Primavera P6: https://export.dhtmlx.com/gantt/project. Он принимает запросы размером до 40 МБ, тогда как эндпойнт по умолчанию https://export.dhtmlx.com/gantt принимает запросы до 10 МБ. См. Ограничения онлайн-сервиса экспорта.

Чтобы экспортировать или импортировать проект, превышающий ограничение в 10 МБ, укажите эндпойнт в свойстве server объекта конфигурации:

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

Эндпойнт поддерживает только экспорт и импорт MS Project и Primavera P6. Любые другие методы, например, gantt.exportToPDF({server:"https://export.dhtmlx.com/gantt/project"}), должны возвращать ошибку сервера.

Чтобы импортировать большие файлы с помощью собственного модуля экспорта, см. Импорт больших файлов.

Need help?
Got a question about the documentation? Reach out to our technical support team for help and guidance. For custom component solutions, visit the Services page.