Экспорт и импорт из MS Project

Библиотека dhtmlxGantt позволяет без труда работать с данными диаграммы Ганта и MS Project. Вы можете экспортировать данные из диаграммы Ганта в MS Project, а также импортировать данные в диаграмму Ганта из MS Project.

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

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

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

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

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

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

Error: Timeout trigger 20 seconds

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

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

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

Для экспорта/импорта, специфичного для MS Project, существует выделенный эндпоинт https://export.dhtmlx.com/gantt/project. Этот эндпоинт поддерживает файлы размером до 40 МБ и также работает для услуг Primavera P6.

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

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

Подробнее об использовании модуля экспорта с MS Project читайте в этом руководстве.

Экспорт в MS Project

Компонент Gantt поддерживает экспорт задач, связей и ресурсов в MS Project.

Чтобы экспортировать данные из диаграммы Ганта в MS Project:

  • Активируйте плагин export_api, используя метод gantt.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>

  • Используйте метод gantt.exportToMSProject для экспорта данных.
gantt.exportToMSProject();

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

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

Ответ

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

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

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

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

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

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

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

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

  • data: (object) Позволяет задать источник данных для экспорта.

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.exportToMSProject({
    data: customData
});

Related sample:  Gantt. Export custom data

  • callback: (function) Используйте это, чтобы получить URL для загрузки сгенерированного XML. Callback получает JSON-объект с свойством url.
gantt.exportToMSProject({
    callback: function(res){
        alert(res.url);
    }
});
  • resources: (array) Экспортирует список ресурсов в файл MS Project.
gantt.exportToMSProject({
  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.exportToMSProject({
  resources: users
     .filter(u => u.key !== '0')
     .map(u => ({
           id: u.key,
           name: u.label,
           type: "work"
     })),
  tasks: {
     ResourceAssignments: (task) => task.user
  }
});

Свойство ResourceAssignments может возвращать строку/число или массив таких значений:

tasks: {
    ResourceAssignments: (task) => [task.user, task.office]
}
  • server: (string) Указывает API-эндпоинт для запроса. Используйте это для локальных установок сервиса экспорта. По умолчанию https://export.dhtmlx.com/gantt.
gantt.exportToMSProject({
   server: "https://myapp.com/myexport/gantt"
});

Импорт из MS Project

Чтобы преобразовать XML или MPP файл MS Project, отправьте запрос в сервис экспорта:

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

Параметры:

  • file: MPP или XML файл MS Project.
  • type: "msproject-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="msproject-parse">
    <button type="submit">Get</button>
</form>

Или используйте клиентский API:

gantt.importFromMSProject({
    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 MS Project file

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

gantt.importFromMSProject требует поддержки 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="msproject-parse">
    <input type="hidden" name="data" 
        value="{ \"durationUnit\": \"hour\" }" />
    <button type="submit">Get</button>
</form>

Или с помощью JavaScript:

gantt.importFromMSProject({
    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="msproject-parse">
    <input type="hidden" name="data" 
        value="{ \"projectProperties\": [\"Author\", \"Title\"] }" />
    <button type="submit">Get</button>
</form>

Или с помощью JavaScript:

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

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

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

Пример с HTML:

<form action="https://export.dhtmlx.com/gantt" method="POST" 
    enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="hidden" name="type" value="msproject-parse">
    <input type="hidden" name="data" 
        value="{ \"taskProperties\": [\"Contact\", \"Priority\"] }" />
    <button type="submit">Get</button>
</form>

Или с помощью JavaScript:

gantt.importFromMSProject({
    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.importFromMSProject({
        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 MSP files. Get task type from properties

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

Существует два API-эндпоинта для услуг экспорта/импорта MS Project:

  • https://export.dhtmlx.com/gantt: Эндпоинт по умолчанию для всех методов экспорта (exportToPDF, exportToPNG, exportToMSProject и т.д.). Максимальный размер запроса: 10 МБ.
  • https://export.dhtmlx.com/gantt/project: Специфично для услуг экспорта/импорта MSProject и Primavera P6. Максимальный размер запроса: 40 МБ.

Укажите эндпоинт, используя свойство server в конфигурации экспорта:

gantt.importFromMSProject({
    server:"https://export.dhtmlx.com/gantt",
    data: file,
    callback: function(project){
       // some logic
    }
});

По умолчанию используется эндпоинт https://export.dhtmlx.com/gantt. Для больших файлов, превышающих 4МБ, используйте второй эндпоинт:

gantt.importFromMSProject({
    server:"https://export.dhtmlx.com/gantt/project",
    data: file,
    callback: function(project){
       // some logic
    }
});

Этот эндпоинт поддерживает запросы до 40МБ и ограничен импортами/экспортами MS Project. Другие методы, такие как gantt.exportToPDF({server:"https://export.dhtmlx.com/gantt/project"}), приведут к ошибке сервера.

Различия в расчетах времени

Расчеты времени в dhtmlxGantt и MS Project отличаются из-за их подходов. Эти различия могут привести к различным результатам. Вы можете настроить параметры gantt для более точного выравнивания результатов:

  1. Преобразование длительности: Укажите HoursPerDay и MinutesPerDay при экспорте в MS Project для устранения несоответствий:
gantt.exportToMSProject({
    project: {
        HoursPerDay: function () {
            return 24;
        },
        MinutesPerDay: function () {
            return 24 * 60;
        }
    }
});

Related sample:  Export to MSProject without the "work_time" settings

  1. Настройки рабочего времени: Если рабочее время отключено в gantt, по умолчанию календарь (8-часовые рабочие дни, рабочая неделя с понедельника по пятницу) все равно отправляется в MS Project. Чтобы избежать несоответствий, очистите календарь по умолчанию:
gantt.setWorkTime({day:0, hours:[0,24]});
gantt.setWorkTime({day:1, hours:[0,24]});
gantt.setWorkTime({day:2, hours:[0,24]});
gantt.setWorkTime({day:3, hours:[0,24]});
gantt.setWorkTime({day:4, hours:[0,24]});
gantt.setWorkTime({day:5, hours:[0,24]});
gantt.setWorkTime({day:6, hours:[0,24]});
  1. Даты элементов сводки: Если gantt.config.duration_unit установлен на "day", длительности округляются до целых дней. MS Project, однако, сохраняет дробные длительности. Переход на единицы "hour" может помочь:
gantt.config.duration_unit = "hour";

Related sample:  Export to MSProject without the "work_time" settings

К началу