MPXJ Explained: Read, Write, and Transform Project Schedules
What MPXJ Is
MPXJ is an open-source library for reading, writing, and converting project schedule files across many formats (Microsoft Project, Primavera, Primavera P6 XML, MSPDI, XER, MPP, MPX, and others). It exposes a consistent API for accessing project data—tasks, resources, assignments, calendars, rates, and custom fields—so tools and integrations can interoperate without depending on a single vendor format.
Why Use MPXJ
- Interoperability: Converts between formats so teams using different PM tools can share schedules.
- Automation: Enables batch processing, validation, and transformation of many project files.
- Data Access: Lets developers extract structured schedule data for reporting, analytics, migration, or archival.
- Extensibility: Supports custom fields and preserves most metadata across conversions.
Core Concepts
- ProjectFile: The in-memory representation of a schedule containing tasks, resources, assignments, calendars, and project-level properties.
- Task: Represents work items with attributes like start, finish, duration, predecessors, successors, percent complete, and constraints.
- Resource: People, equipment or materials with availability, cost rates, and calendars.
- Assignment: Links tasks and resources, holds units and work.
- Calendar: Defines working and non-working times, exceptions, and day patterns.
- Field Mapping: MPXJ maps proprietary fields from each format into a standardized set; unmappable fields are preserved where possible.
Reading Project Files
- Choose the reader for the file type (e.g., MPPReader, PrimaveraReader, XERReader).
- Load the file into a ProjectFile object.
- Access tasks, resources, and assignments via provided collections or iterators.
- Handle custom fields and extended attributes using the ProjectFile’s field APIs.
Example (pseudocode):
Code
reader = new MPPReader() project = reader.read(“schedule.mpp”) for task in project.getAllTasks():print(task.getName(), task.getStart(), task.getFinish())
Writing and Converting Files
- Create or modify a ProjectFile in memory.
- Use the appropriate writer (e.g., MSPDIWriter, XERWriter) to serialize.
- When converting formats, inspect field mappings and calendar differences to ensure fidelity.
- Preserve custom fields and resource/cost data explicitly if target format supports them.
Example (pseudocode):
Code
writer = new MSPDIWriter() writer.write(project, “schedule.xml”)
Transforming Schedules
- Normalization: Convert durations, calendars, and working time to a baseline before transformations.
- Bulk edits: Programmatically update task dates, durations, or assignments across many files.
- Merging/Splitting: Combine multiple ProjectFile instances or split large projects into subprojects.
- Validation & Cleanup: Detect cycles, missing predecessors, or invalid dates and correct them automatically.
- Analytics-ready data: Export to CSV/JSON/DB after flattening hierarchical tasks and resolving calendars.
Common Challenges and Tips
- MPP Format Complexity: MPP is a binary proprietary format; MPXJ does a best-effort mapping—some vendor-specific features may not transfer exactly.
- Calendars & Timezones: Differences in calendar definitions and timezones can shift dates; normalize to UTC or a project baseline when converting.
- Custom/Extended Fields: Map and document custom