Skip to main content

MPXJ

MPXJ is a Java library which allows a variety of project file formats and databases to be read and written. This Python package uses the JPype Java bridge to allow direct access from Python to the MPXJ library. You can find details of the Java classes and methods in the Javadocs, and more general documentation on the MPXJ website.

After installing this package you can either work with some of the simple built-in utilities provided by MPXJ for tasks like file format conversion:

import jpype
import mpxj

jpype.startJVM()
from org.mpxj.sample import MpxjConvert
MpxjConvert().process('example.mpp', 'example.mpx')
jpype.shutdownJVM()

or you can interact directly with the object model exposed by MPXJ to extract data:

import jpype
import mpxj

jpype.startJVM()
from org.mpxj.reader import UniversalProjectReader
project = UniversalProjectReader().read('example.mpp')

print("Tasks")
for task in project.getTasks():
	print(task.getID().toString() + "\t" + task.getName())

jpype.shutdownJVM()

or finally you can generate your own schedule:

import jpype
import mpxj

jpype.startJVM()

from java.lang import Double
from java.time import LocalDate, LocalDateTime
from org.mpxj import ProjectFile, TaskField, Duration, TimeUnit, RelationType, Availability, Relation
from org.mpxj.common import LocalDateTimeHelper
from org.mpxj.writer import UniversalProjectWriter, FileFormat

# The helper class we use later to actually write the file
# uses an enumeration to determine the output format.
file_name = "test.xml"
file_format = FileFormat.MSPDI

# Create a ProjectFile instance
file = ProjectFile()

# Add a default calendar called "Standard"
calendar = file.addDefaultBaseCalendar()

# Add a holiday to the calendar to demonstrate calendar exceptions
calendar.addCalendarException(LocalDate.of(2006, 3, 13), LocalDate.of(2006, 3, 13))

# Retrieve the project properties and set the start date. Note Microsoft
# Project appears to reset all task dates relative to this date, so this
# date must match the start date of the earliest task for you to see
# the expected results. If this value is not set, it will default to
# today's date.
properties = file.getProjectProperties()
properties.setStartDate(LocalDateTime.of(2003, 1, 1, 8, 0))

# Set a couple more properties just for fun
properties.setProjectTitle("Created by MPXJ")
properties.setAuthor("Jon Iles")

# Let's create an alias for TEXT1
customFields = file.getCustomFields()
field = customFields.getOrCreate(TaskField.TEXT1)
field.setAlias("My Custom Field")

# Add resources
resource1 = file.addResource()
resource1.setName("Resource1")

resource2 = file.addResource()
resource2.setName("Resource2")
# This resource is only available 50% of the time
resource2.getAvailability().add(Availability(LocalDateTimeHelper.START_DATE_NA, LocalDateTimeHelper.END_DATE_NA, Double.valueOf(50.0)));


# Create a summary task
task1 = file.addTask()
task1.setName("Summary Task")

# Create the first sub task
task2 = task1.addTask()
task2.setName("First Sub Task")
task2.setDuration(Duration.getInstance(10.5, TimeUnit.DAYS))
task2.setStart(LocalDateTime.of(2003, 1, 1, 8, 0))
task2.setText(1, "My Custom Value 1")

# We'll set this task up as being 50% complete. If we have no resource
# assignments for this task, this is enough information for MS Project.
# If we do have resource assignments, the assignment record needs to
# contain the corresponding work and actual work fields set to the
# correct values in order for MS project to mark the task as complete
# or partially complete.
task2.setPercentageComplete(Double.valueOf(50.0))
task2.setActualStart(LocalDateTime.of(2003, 1, 1, 8, 0))

# Create the second sub task
task3 = task1.addTask()
task3.setName("Second Sub Task")
task3.setStart(LocalDateTime.of(2003, 1, 11, 8, 0))
task3.setDuration(Duration.getInstance(10, TimeUnit.DAYS))
task3.setText(1, "My Custom Value 2")


# Link these two tasks
task3.addPredecessor(Relation.Builder().targetTask(task2))

# Add a milestone
milestone1 = task1.addTask()
milestone1.setName("Milestone")
milestone1.setStart(LocalDateTime.of(2003, 1, 21, 8, 0))
milestone1.setDuration(Duration.getInstance(0, TimeUnit.DAYS))
milestone1.addPredecessor(Relation.Builder().targetTask(task3))

# This final task has a percent complete value, but no
# resource assignments. This is an interesting case it it requires
# special processing to generate the MSPDI file correctly.
task4 = file.addTask()
task4.setName("Next Task")
task4.setDuration(Duration.getInstance(8, TimeUnit.DAYS))
task4.setStart(LocalDateTime.of(2003, 1, 1, 8, 0))
task4.setPercentageComplete(Double.valueOf(70.0))
task4.setActualStart(LocalDateTime.of(2003, 1, 1, 8, 0))

# Assign resources to tasks
assignment1 = task2.addResourceAssignment(resource1)
assignment2 = task3.addResourceAssignment(resource2)

# As the first task is partially complete, and we are adding
# a resource assignment, we must set the work and actual work
# fields in the assignment to appropriate values, or MS Project
# won't recognise the task as being complete or partially complete
assignment1.setWork(Duration.getInstance(80, TimeUnit.HOURS))
assignment1.setActualWork(Duration.getInstance(40, TimeUnit.HOURS))

# If we were just generating an MPX file, we would already have enough
# attributes set to create the file correctly. If we want to generate
# an MSPDI file, we must also set the assignment start dates and
# the remaining work attribute. The assignment start dates will normally
# be the same as the task start dates.
assignment1.setRemainingWork(Duration.getInstance(40, TimeUnit.HOURS))
assignment2.setRemainingWork(Duration.getInstance(80, TimeUnit.HOURS))
assignment1.setStart(LocalDateTime.of(2003, 1, 1, 8, 0))
assignment2.setStart(LocalDateTime.of(2003, 1, 11, 8, 0))

# Write a 100% complete task
task5 = file.addTask()
task5.setName("Last Task")
task5.setDuration(Duration.getInstance(3, TimeUnit.DAYS))
task5.setStart(LocalDateTime.of(2003, 1, 1, 8, 0))
task5.setPercentageComplete(Double.valueOf(100.0))
task5.setActualStart(LocalDateTime.of(2003, 1, 1, 8, 0))

# Write a 100% complete milestone
task6 = file.addTask()
task6.setName("Last Milestone")
task6.setDuration(Duration.getInstance(0, TimeUnit.DAYS))
task6.setStart(LocalDateTime.of(2003, 1, 1, 8, 0))
task6.setPercentageComplete(Double.valueOf(100.0))
task6.setActualStart(LocalDateTime.of(2003, 1, 1, 8, 0))

# Write the file
writer = UniversalProjectWriter(file_format).write(file, file_name)

jpype.shutdownJVM()

Metadata

Release files for mpxj 16.10.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mpxj 16.10.0
File Size Uploaded
mpxj-16.10.0.tar.gz 31.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for mpxj 16.10.0
File Interpreter ABI Platform
mpxj-16.10.0-py3-none-any.whl Python 3 none any Details

Total release size: 62.6 MB

Release files / mpxj-16.10.0.tar.gz

Download URL mpxj-16.10.0.tar.gz
Size 31.3 MB
Tags Source
SHA-256 checksum
How to use checksums
12f34e5ce80d56a9804ea40c70e50ed5cc4043e71cb0816d9c13622551116b93
BLAKE2b-256 checksum
How to use checksums
577057675b68b4fc39bfef57fbe1b4d83163fd6d15198e0541855d69b0678e37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.9

Release files / mpxj-16.10.0-py3-none-any.whl

Download URL mpxj-16.10.0-py3-none-any.whl
Size 31.3 MB
Tags Python 3
SHA-256 checksum
How to use checksums
5cc44621b58c9d218afd26f4a4a6baa614b41d207a69f8f4ff16a8f6d6f2e5cd
BLAKE2b-256 checksum
How to use checksums
b3c8f8e5e9a3dcda9f0cc078714f64e8d5f73ba62a45d9b95d5bc41f5c5ee839
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.9

Release history Release notifications | RSS feed

This release

16.10.0 This release

2 release files

16.9.0

2 release files

16.8.0

2 release files

16.4.1

2 release files

16.4.0

2 release files

16.2.0

2 release files

16.0.0

2 release files

15.2.0

2 release files

15.0.0

2 release files

14.5.2

2 release files

14.4.0

2 release files

14.3.5

2 release files

14.3.4

2 release files

14.3.3

2 release files

13.8.0

2 release files

13.7.0

2 release files

13.5.1

2 release files

13.5.0

2 release files

13.4.0

2 release files

13.3.1

2 release files

13.3.0

2 release files

13.2.1

2 release files

13.2.0

2 release files

13.1.0

2 release files

13.0.0

2 release files

12.9.3

2 release files

12.9.2

2 release files

12.9.1

2 release files

12.9.0

2 release files

12.8.1

2 release files

12.6.0

2 release files

12.5.0

2 release files

12.4.0

2 release files

12.2.0

2 release files

12.1.3

2 release files

12.1.2

2 release files

12.1.1

2 release files

12.0.2

2 release files

12.0.1

2 release files

12.0.0

2 release files

11.5.4

2 release files

11.5.3

2 release files

11.5.1

2 release files

11.5.0

2 release files

11.3.2

2 release files

11.3.1

2 release files

11.3.0

2 release files

11.2.0

2 release files

11.1.0

2 release files

10.9.1

2 release files

10.9.0

2 release files

10.8.0

2 release files

10.6.2

2 release files

10.6.1

2 release files

10.5.0

2 release files

10.3.0

2 release files

10.1.0

2 release files

10.0.5

2 release files

10.0.3

2 release files

10.0.2

2 release files

10.0.1

2 release files

9.8.3

2 release files

9.8.2

2 release files

9.8.1

2 release files

9.8.0

2 release files

9.7.0

2 release files

9.6.0

2 release files

9.5.2

2 release files

9.5.1

2 release files

9.5.0

2 release files

9.4.0

2 release files

9.3.1

2 release files

9.3.0

2 release files

9.2.6

2 release files

9.2.5

2 release files

9.2.4

2 release files

9.2.3

2 release files

9.2.2

2 release files

9.2.1

2 release files

9.2.0

2 release files

9.1.0

2 release files

9.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page