Библиотека dhtmlxGantt поддерживает экспорт данных из Gantt-диаграммы в Primavera P6, а также импорт данных из Primavera P6 в Gantt-диаграмму.
Этот сервис предоставляется бесплатно, однако экспортируемый файл будет содержать водяной знак библиотеки по лицензии GPL. Покупка лицензии удаляет водяной знак на период действия поддержки (12 месяцев для всех PRO-лицензий).
Доступно несколько экспортных сервисов для локальной установки на вашем компьютере, что позволяет экспортировать Gantt-диаграмму напрямую в Primavera P6. Обратите внимание, что экспортные сервисы не входят в комплект поставки Gantt. Подробную информацию об условиях использования смотрите в соответствующей статье.
Сервис экспорта имеет ограничения по времени обработки и размеру запроса.
Если процесс экспорта занимает более 20 секунд, он будет отменён и появится следующая ошибка:
Error: Timeout trigger 20 seconds
Когда несколько пользователей одновременно экспортируют Gantt-диаграммы, обработка может занять больше времени, чем обычно. Однако время обработки каждого запроса считается отдельно для каждого пользователя — это ожидаемое поведение.
Общий API-эндпоинт https://export.dhtmlx.com/gantt обрабатывает все методы экспорта (exportToPDF, exportToPNG, exportToMSProject и др.) с максимальным размером запроса 10 МБ.
Существует также отдельный API-эндпоинт https://export.dhtmlx.com/gantt/project для сервисов экспорта/импорта MSProject и Primavera P6 (exportToMSProject / importFromMSProject / exportToPrimaveraP6 / importFromPrimaveraP6). Этот эндпоинт поддерживает максимальный размер запроса 40 МБ.
Для экспорта больших диаграмм доступен отдельный экспортный модуль. Этот модуль бесплатен, если у вас есть лицензия Commercial, Enterprise или Ultimate, либо может быть приобретён отдельно по этой ссылке.
Более подробную информацию об использовании экспортного модуля с MS Project можно найти в этом руководстве. Модуль поддерживает экспорт/импорт для MS Project и Primavera P6.
Компонент Gantt может экспортировать связи, задачи и ресурсы в Primavera P6.
Чтобы экспортировать данные из Gantt-диаграммы в Primavera P6, выполните следующие шаги:
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: Custom properties for WBS tasks (PrimaveraP6's Summary tasks)
Ответ от сервиса экспорта будет JSON-объектом следующей структуры:
{
data: {},
config: {},
resources: [],
worktime: {}
}
Метод exportToPrimaveraP6() принимает объект с несколькими необязательными свойствами:
gantt.exportToPrimaveraP6({
name:'custom.xml'
});
gantt.exportToPrimaveraP6({
auto_scheduling: false
});
gantt.exportToPrimaveraP6({
skip_circular_links: false
});
gantt.exportToPrimaveraP6({
project: {
'Author': 'I am!',
'MinutesPerDay': function () {
return gantt.config.hours_per_day * 60;
}
}
});
Эти свойства соответствуют свойствам проекта. Список поддерживаемых свойств доступен здесь. Значения могут быть как фиксированными, так и функциями, выполняемыми во время экспорта.
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'
}
});
Эти свойства относятся к сущности задачи; список поддерживаемых свойств доступен. Значения могут быть фиксированными или функциями, вызываемыми для каждой задачи при экспорте.
Ожидается, что 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. Export custom data
gantt.exportToPrimaveraP6({
callback: function(res){
alert(res.url);
}
});
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){
if(u.key === '0')//пропустить вариант по умолчанию
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];
}
}
Related sample: Export Gantt with resources to Primavera P6
gantt.exportToPrimaveraP6({
server:"https://myapp.com/myexport/gantt"
});
Для преобразования XML или XER-файла отправьте POST-запрос к сервису экспорта со следующими параметрами:
Параметры запроса:
Пример:
<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);
}
}
});
Related sample: Import Primavera P6 file
Здесь file должен быть объектом File, содержащим XML или XER-файл проекта.
gantt.importFromPrimaveraP6 требует поддержки HTML5 File API.
Ответ возвращает JSON-объект со следующей структурой:
{
data: {},
config: {},
resources: [],
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">Get</button>
</form>
или
gantt.importFromPrimaveraP6({
data: file,
durationUnit: "hour",
callback: function(project){}
});
Чтобы получить определённые поля проекта, отправьте на сервер параметр projectProperties с массивом нужных полей. Это извлечёт свойства из Project entity в свойство 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">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 entities. Доступные свойства перечислены в документации.
<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;
});
Определить тип задачи можно следующим образом: задачи с пометкой 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. Import Primavera P6 files. Get task type from properties
Существует два API-эндпойнта для сервисов экспорта/импорта Primavera P6:
Указать эндпойнт можно через свойство server в объекте конфигурации экспорта:
gantt.importFromPrimaveraP6({
server:"https://export.dhtmlx.com/gantt",
data: file,
callback: function(project){
// some logic
}
});
Если эндпойнт не указан, по умолчанию используется https://export.dhtmlx.com/gantt. Следующий вызов работает аналогично:
gantt.importFromPrimaveraP6({
data: file,
callback: function(project){
// some logic
}
});
Для обработки больших проектов, превышающих лимит в 4 МБ, используйте второй эндпойнт:
gantt.importFromPrimaveraP6({
server:"https://export.dhtmlx.com/gantt/project",
data: file,
callback: function(project){
// some logic
}
});
Этот эндпойнт принимает запросы до 40 МБ и поддерживает как экспорт, так и импорт для Primavera P6. Он предназначен специально для экспорта и импорта Primavera P6.
Обратите внимание, что другие методы, например gantt.exportToPDF({server:"https://export.dhtmlx.com/gantt/project"}), приведут к ошибке сервера.
К началу