Skip to content

MS Project Import / Export

TruePPM can import project schedules from Microsoft Project XML (.xml) and binary (.mpp) files, and export any project back to MS Project XML. This page documents which MS Project fields are mapped, which are silently ignored, and what warnings to expect for edge-case inputs.

FormatExtensionParserNotes
MS Project XML (2003+).xmlparse_xmlPreferred path; human-readable; supported by MS Project 2003–365, ProjectLibre, GanttProject, Primavera interop
MS Project XML (pre-2003).xmlparse_xmlSame parser; handles missing XML namespace
MS Project binary.mppparse_mppparse_xmlConverted to XML by MPXJ CLI before parsing; requires Java 11+ and MPXJ_JAR_PATH
MS Project XML fieldTruePPM fieldStatus
<Name>Project.name✅ Mapped
<StartDate>Project.start_date✅ Mapped
<Title>⬜ Ignored
<CreationDate>⬜ Ignored
<FinishDate>⬜ Ignored
<DefaultStartTime>⬜ Ignored
<DefaultFinishTime>⬜ Ignored
<MinutesPerDay>⬜ Ignored
<MinutesPerWeek>⬜ Ignored
<DaysPerMonth>⬜ Ignored
<Calendars>⬜ Ignored
<ExtendedAttributes>⬜ Ignored
<OutlineCodes>⬜ Ignored
MS Project XML fieldTruePPM fieldStatusNotes
<UID>internal mapping key✅ RequiredUID 0 (project summary) is always skipped
<Name>Task.name✅ RequiredTasks missing a name are skipped with a warning
<Duration>Task.duration✅ MappedISO 8601 duration; converted to working days at 8 h/day
<OutlineNumber>Task.wbs_path✅ MappedDot-separated WBS code (e.g. 1.2.3)
<OutlineLevel>hierarchy depth✅ MappedUsed for parent/child detection
<Milestone>Task.is_milestone✅ Mapped1is_milestone=True; milestone duration is always imported as 0
<PercentComplete>Task.percent_complete✅ MappedInteger 0–100 → decimal 0.0–1.0
<Notes>Task.notes✅ MappedFree-text notes
<Start>Task.planned_start✅ MappedDate portion only; time component ignored
<PredecessorLink>/<PredecessorUID>Dependency.predecessor✅ Mapped
<PredecessorLink>/<Type>Dependency.dep_type✅ Mapped0→FF, 1→FS, 2→SF, 3→SS
<PredecessorLink>/<LinkLag>Dependency.lag✅ MappedTenths-of-minutes → working days (4800 = 1 day)
<ID>⬜ Ignored
<Summary>⬜ IgnoredSummary status derived from WBS hierarchy
<Finish>⬜ IgnoredDerived from start + duration after CPM
<WBS>⬜ IgnoredModern WBS field; OutlineNumber is used instead
<GUID>⬜ Ignored
<CalendarUID>⬜ Ignored
<LagFormat>⬜ IgnoredLag always interpreted as tenths-of-minutes
<ExtendedAttribute> values⬜ IgnoredCustom fields are not imported
MS Project XML fieldTruePPM fieldStatus
<UID>internal mapping key✅ Required
<Name>Resource.name✅ Required
<MaxUnits>Resource.max_units✅ Mapped
<GUID>⬜ Ignored
<EmailAddress>⬜ Ignored
<NTAccount>⬜ Ignored
<CalendarUID>⬜ Ignored
MS Project XML fieldTruePPM fieldStatus
<TaskUID>TaskResource.task✅ Required
<ResourceUID>TaskResource.resource✅ Required
<Units>TaskResource.units✅ Mapped

MS Project XML stores duration as ISO 8601 strings. TruePPM converts to whole working days using an 8-hour working day:

MS Project durationWorking daysNotes
PT0H0M0S0Milestone (zero-duration task)
PT8H0M0S1Standard 1-day task
PT16H0M0S22-day task
P3D3PnD format (less common)
P1DT8H0M0S2Mixed days + hours
MS Project <Type>TruePPM dep_typeDescription
0FFFinish-to-Finish
1FSFinish-to-Start (default)
2SFStart-to-Finish
3SSStart-to-Start

Unrecognized type values default to FS.

When importing resources, TruePPM first searches for an existing Resource record with a name that matches case-insensitively. If a match is found the existing record is reused (no duplicate created). If no match exists, a new Resource record is created.

The import summary includes a warnings list for non-fatal issues:

ConditionWarning message
Task has no name"Task UID {n}: missing name, skipped"
Dependency references an unknown predecessor"Predecessor UID {n} not found, skipping dependency"
No tasks found in the file"No tasks found in MS Project file"

TruePPM exports projects to MS Project XML 2003+ format. All tasks, dependencies, resources, and assignments are written. Fields exported per task:

UID, ID, Name, Duration (hours), Start, Finish, OutlineNumber, OutlineLevel, Milestone, PercentComplete, Notes, PredecessorLink (with Type and LinkLag).

Resources: UID, ID, Name, MaxUnits. Assignments: UID, TaskUID, ResourceUID, Units.

Binary .mpp import requires Java 11+ and the MPXJ CLI JAR:

Terminal window
# Default path (matches Docker image default)
MPXJ_JAR_PATH=/opt/mpxj/mpxj-cli.jar
# Override via Django settings or environment variable

See Configuration for full environment-variable reference.