ExportMSProject.javaПакет: 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 строк)
868d6abb7 2025 -> 2026 63081666f Заголовки исходных файлов: 2024-> 2025. b6092df09 Авторские права 2023 -> 2024 ab45d51fa Авторские права 2001-2022 -> 2001-2023. 5f7ef41b8 Авторские права 2021 -> 2022