EN · DE · RU · FR · ES

#454: ExportMSProject.java

projectforge-business/src/main/java/org/projectforge/business/gantt/ExportMSProject.java Тип: Java · Роль: Диаграмма Ганта · Источник: projectforge-business/src/main/java/org/projectforge/business/gantt/ExportMSProject.java 231 строка · 151 код · 60 комментариев · 20 пустых
Утилита экспорта в Excel/CSV для данных MSProject. Настраивает заголовки столбцов (i18n), форматтеры полей (валюта, дата) и заполняет строки из коллекций данных.

Структура кода

Пакет: org.projectforge.business.gantt

Классы: ExportMSProject

Методы (3): addTask, setPredecessors, getRelationType

Импорты: 15 пакетов

Исходный код (сокращён)

package org.projectforge.business.gantt;

import net.sf.mpxj.*;
import net.sf.mpxj.mpx.MPXWriter;
import net.sf.mpxj.mspdi.MSPDIWriter;
import net.sf.mpxj.writer.ProjectWriter;
import org.projectforge.framework.calendar.Holidays;
import org.projectforge.framework.time.PFDateTime;
import org.projectforge.framework.time.PFDayUtils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Использует реализацию http://mpxj.sourceforge.net/, распространяемую на условиях GNU LGPL.
 *
 * @author Kai Reinhard (k.reinhard@micromata.de)
 */
public class ExportMSProject {
  private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ExportMSProject.class);

  public static byte[] exportXml(final GanttChart ganttChart) {
    return export(new MSPDIWriter(), ganttChart);
  }

  public static byte[] exportMpx(final GanttChart ganttChart) {
    return export(new MPXWriter(), ganttChart);
  }

  private static byte[] export(final ProjectWriter result, final GanttChart ganttChart) {
    final ProjectFile file = new ProjectFile();

    //
    // Настройка файла для автоматической генерации идентификаторов задач.
    //
    file.setAutoTaskID(true);
    file.setAutoTaskUniqueID(true);

    //
    // Настройка файла для автоматической генерации идентификаторов ресурсов.
    //
    file.setAutoResourceID(true);
    file.setAutoResourceUniqueID(true);

    //
    // Настройка файла для автоматической генерации уровней и номеров структуры.
    //
    file.setAutoOutlineLevel(true);
    file.setAutoOutlineNumber(true);

    //
    // Настройка файла для автоматической генерации меток WBS
    //
    file.setAutoWBS(true);

    //
    // Настройка файла для автоматической генерации идентификаторов календарей
    // (не строго обязательно здесь, но требуется при генерации файлов MSPDI)
    //
    file.setAutoCalendarUniqueID(true);

    //
    // Получение заголовка проекта и установка даты начала. Обратите внимание, что Microsoft
    // Project, по-видимому, пересчитывает все даты задач относительно этой даты, поэтому эта
    // дата должна совпадать с датой начала самой ранней задачи для получения
    // ожидаемых результатов. Если это значение не задано, по умолчанию будет использоваться
    // сегодняшняя дата.
    //
    ganttChart.recalculate();
    final ProjectHeader header = file.getProjectHeader();
    header.setStartDate(PFDayUtils.convertToUtilDate(ganttChart.getCalculatedStartDate()));

    //
    // Добавление календаря по умолчанию с названием "Стандартный"
    //
    final ProjectCalendar calendar = file.addDefaultBaseCalendar();
    calendar.setWorkingDay(Day.SATURDAY, false);
    calendar.setWorkingDay(Day.SUNDAY, false);
    PFDateTime dt = PFDateTime.from(ganttChart.getCalculatedStartDate()); // не null
    for (int i = 0; i < 3000; i++) { // Защита от бесконечного цикла (паранойя)
      dt = dt.plusDays(1);
      Holidays holidays = Holidays.getInstance();
      if (!holidays.isWorkingDay(dt.getDateTime()) && holidays.isHoliday(dt) && !dt.isWeekend()) {
        // Добавление этого праздника в календарь:
        final Date date = dt.getSqlDate();
        calendar.addCalendarException(date, date);
        if (log.isDebugEnabled()) {
          log.debug("Добавлен праздник: " + date);
        }
      }
      PFDateTime dtEnd = PFDateTime.from(ganttChart.getCalculatedEndDate()); // не null
      if (!dt.isBefore(dtEnd)) {
        break;
      }
    }

    final List<GanttTask> children = ganttChart.getRootNode().getChildren();
    if (children != null) {
      final Map<Serializable, Task> taskMap = new HashMap<>();
      for (final GanttTask child : children) {
        addTask(file, taskMap, null, child);
      }
      for (final GanttTask child : children) {
        setPredecessors(taskMap, child);
      }
    }

    //
    // Запись файла
    //
    final ByteArrayOutputStream ba = new ByteArrayOutputStream();
    try {
// ... (сокращено, всего 209 строк)

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024-> 2025.
b6092df09 Авторские права 2023 -> 2024
ab45d51fa Авторские права 2001-2022 -> 2001-2023.
5f7ef41b8 Авторские права 2021 -> 2022