Ostatnia aktualizacja: 02 wrz, 2026

Best Open Source APIs for Parsing MS Project MPP & Primavera XER Files

Wiodące otwarte API do pracy z plikami MS Project (MPP) i Primavera (XER)

W zarządzaniu projektami w przedsiębiorstwie dwa własnościowe formaty plików królują: Microsoft Project (.mpp) i Oracle Primavera P6 (.xer). Niezależnie od tego, czy tworzysz wewnętrzny pulpit analityczny, synchronizujesz harmonogramy budowy z systemami ERP, czy automatyzujesz przepływy statusów projektów, odczytywanie i manipulowanie tymi plikami harmonogramów programowo jest kluczowym wymogiem.

Jednak oba formaty stawiają poważne wyzwania inżynieryjne:

  • Pliki MPP są binarnymi, nieudokumentowanymi formatami OLE Structured Storage lub własnościowymi formatami dokumentów złożonych, z zmianami schematu w praktycznie każdej głównej wersji MS Project (2000, 2003, 2007, 2010, 2013, 2016, 2019, 2021).
  • Pliki Primavera XER są eksportami tekstowymi rozdzielanymi tabulacjami, ustrukturyzowanymi jako tabele relacyjnej bazy danych (%T tabele z polami %F i rekordami %R), napełnionymi złożonymi ograniczeniami integralności referencyjnej, dziedziczeniem wielokalendarzowym oraz logiką ścieżki krytycznej.

Komercyjne SDK, takie jak Aspose.Tasks, istnieją, ale koszty licencji i uzależnienie od dostawcy sprawiają, że solidne alternatywy open-source są niezbędne. W tym przewodniku przedstawiamy najważniejsze otwarte API, biblioteki i parsery dostępne dla Javy, Pythona i C#, które umożliwiają czyste i wydajne obsługiwanie plików MPP i XER.

Szybkie porównanie narzędzi open-source

Biblioteka / NarzędzieGłówny językObsługiwane formatyOdczyt / ZapisNajlepszy przypadek użycia
MPXJJava (powiązania Python / .NET)MPP, MPT, MPX, XER, PMXML, MSPDIOdczyt (MPP/XER); Zapis (MPX/MSPDI/PMXML)Enterprise Java, konwersja wieloformatowa, kompleksowe harmonogramy
xerparserPythonXEROdczytaj i parsujData science, analiza harmonogramów pandas, potoki ETL
python-mpxjPythonMPP, XER, XMLOdczyt / KonwersjaPythonic wrapper around MPXJ using JPype
netezza-xer / xer-to-csvShell / Python / GoXERStrumień / EksportEkstrahowanie surowych tabel podobnych do SQL do relacyjnych baz danych
OpenProj / ProjectLibre CoreJavaMPP (starsze wersje), XMLOdczyt / RenderowanieIntegracja Desktop/Engine dla podstawowych widoków Gantta

1. MPXJ (Microsoft Project eXchange w Javie)

Niezaprzeczalny standard branżowy dla interoperacyjności harmonogramów

Jeśli istnieje złoty standard w otwarto‑źródłowych bibliotekach planowania, jest nim MPXJ. Aktywnie utrzymywany od ponad dwóch dekad przez Jona Ilesa, MPXJ został pierwotnie stworzony do przetwarzania plików MPX Microsoft Project, ale rozwinął się w uniwersalny silnik tłumaczeń formatów harmonogramów projektów.

Kluczowe możliwości

  • Bezpośrednie wyodrębnianie MPP: Analizuje własnościowe binarne pliki MPP we wszystkich prawie wersjach MS Project (Project 98 aż po nowoczesne Project 2016/2019/2021/365) bez konieczności posiadania zainstalowanej kopii Microsoft Project.
  • Parsowanie Primavera P6 XER i PMXML: Natychmiastowe wsparcie zarówno dla tekstowych zrzutów .xer, jak i nowoczesnych plików XML Primavera.
  • Znormalizowany model danych: Udostępnia zunifikowany model obiektowy (ProjectFile, Task, Resource, ResourceAssignment, Relation, WorkCalendar). Niezależnie od tego, czy Twoje dane wejściowe to MPP, czy XER, kod aplikacji korzysta z tego samego API.
  • Wielojęzyczna dystrybucja: Choć napisana w Javie, MPXJ udostępnia natywnie skompilowane pakiety NuGet dla .NET (C#) poprzez IKVM/CoreCLR, a także pakiet Python (mpxj na PyPI).

Szybki przykład kodu: Java

import net.sf.mpxj.ProjectFile;
import net.sf.mpxj.Task;
import net.sf.mpxj.reader.UniversalProjectReader;

public class ScheduleReader {
    public static void main(String[] args) throws Exception {
        // UniversalProjectReader automatically detects whether it's MPP, XER, or XML
        UniversalProjectReader reader = new UniversalProjectReader();
        ProjectFile project = reader.read("capital_project_schedule.xer");

        System.out.println("Project Name: " + project.getProjectProperties().getProjectTitle());

        for (Task task : project.getTasks()) {
            if (task.getName() != null) {
                System.out.printf("Task ID: %d | WBS: %s | Name: %s | Early Start: %s%n",
                    task.getID(), task.getWBS(), task.getName(), task.getEarlyStart());
            }
        }
    }
}

Gdzie MPXJ się wyróżnia

  • Prawdziwa normalizacja międzyformatowa (konwersja MPP do kompatybilnego z XER PMXML lub MSPDI).
  • Złożona logika kalendarza (zmiany, wyjątki, wielokalendarzowe godziny pracy).
  • Stabilność klasy produkcyjnej z aktywną społecznością.

2. xerparser (Python)

Lekka, natywna analiza w Pythonie dla Primavera XER

Chociaż MPXJ można wywołać za pomocą powiązań Pythona, wymaga to uruchomienia zaplecza JVM (przez JPype). Gdy potrzebujesz w pełni natywnego parsera Pythona, który działa bez zależności Java, xerparser jest rozwiązaniem numer jeden.

Plik XER to w zasadzie migawka bazy danych zrzucona do płaskiego tekstu. xerparser dekoduje te tabele do ustrukturyzowanych obiektów Pythona i integruje się bezproblemowo z pandas.

Kluczowe możliwości

  • Zero zależności Java: Czysta biblioteka Python 3 instalowalna za pomocą pip install xerparser.
  • Integralność relacyjna: Mapuje podstawowe tabele Primavera, takie jak TASK (działania), PROJECT (metadane projektu), PROJWBS (hierarchie WBS), TASKRSRC (przydziały) oraz TASKPRED (powiązania logiczne).
  • Szybkie wykonanie: Idealne dla konteneryzowanych mikrousług, funkcji AWS Lambda oraz nowoczesnych potoków orkiestracji danych (np. Apache Airflow, Prefect).

Szybki przykład kodu: Python

from xerparser.reader import Reader
import pandas as pd

# Load XER file
xer = Reader("plant_expansion.xer")

# Access projects inside the XER dump
for project in xer.projects:
    print(f"Project Code: {project.short_name}, Description: {project.name}")

# Convert activities into a Pandas DataFrame for downstream analytics
tasks_data = []
for act in xer.activities:
    tasks_data.append({
        "Task_Code": act.task_code,
        "Name": act.task_name,
        "Status": act.status_code,
        "Early_Start": act.early_start_date,
        "Early_Finish": act.early_end_date,
        "Total_Float": act.total_float_hr_cnt
    })

df = pd.DataFrame(tasks_data)
print(df.head())

Gdzie xerparser się wyróżnia

  • Inżynieria danych, analiza roszczeń opóźnieniowych i kontrole zdrowia harmonogramu (skrypty oceny 14-punktowej DCMA).
  • Obciążenia serverless, w których pakowanie środowiska Java o rozmiarze ponad 50 MB jest niepraktyczne.

3. python-mpxj

Łączenie Pythona z pełną mocą MPXJ

Jeśli pracujesz w Pythonie, ale musisz przetwarzać binarne pliki .mpp, xerparser nie może Ci pomóc, ponieważ obsługuje tylko .xer. Najbardziej niezawodnym mostem open-source jest python-mpxj.

Kluczowe możliwości

  • Automatycznie uruchamia bezgłową wbudowaną JVM przy użyciu jpype1.
  • Udostępnia pełne API MPXJ bezpośrednio programistom Pythona.
  • Umożliwia bezpośrednią konwersję z własnościowego formatu .mpp do nowoczesnych otwartych formatów, takich jak .json lub .csv.
pip install mpxj
import mpxj

# MPXJ provides high-level helper utilities
from net.sf.mpxj.reader import UniversalProjectReader

reader = UniversalProjectReader()
project = reader.read("commercial_tower.mpp")

for task in project.getTasks():
    if task.getName():
        print(f"{task.getUniqueID()}: {task.getName()} -> {task.getDuration()}")

4. Niestandardowe narzędzia parsowania i skrypty wprowadzania danych do bazy

Obsługa surowego pliku Primavera XER przy użyciu przetwarzania strumieniowego

Ponieważ Primavera XER stosuje przewidywalny format tabelaryczny, wiele zespołów inżynierskich open-source korzysta z własnych dekoderów strumieni tabelarycznych (pisanych w Go, Pythonie lub Rust), zamiast bibliotek harmonogramów wysokiego poziomu w stylu DOM.

Struktura pliku XER jest sformatowana jako:

%T  TASK
%F  task_id  proj_id  wbs_id  task_code  task_name  status_code
%R  10182    120      45      A1000      Mobilization TK_Complete
%R  10183    120      45      A1010      Excavation   TK_Active
%E

Kilka otwarto‑źródłowych skryptów na GitHubie (takich jak xer2sqlite i xer-to-csv) parsuje tę strukturę bezpośrednio do SQLite lub PostgreSQL. To podejście jest optymalne, jeśli:

  1. Potrzebujesz jedynie zapytań o relacje tabelaryczne przy użyciu SQL.
  2. Harmonogramy mają rozmiar setek megabajtów i zawierają dziesiątki tysięcy zadań, przy czym obiektowo‑zorientowane ładowarki drzew mogą wywołać błędy braku pamięci.

Porównanie techniczne: Co wybrać?

Wybierz MPXJ, jeśli:

  • Musisz odczytywać binarne pliki Microsoft Project .mpp bez płacenia za zamknięte oprogramowanie komercyjne.
  • Potrzebujesz zaawansowanej analizy harmonogramu: kalendarzy roboczych, obliczeń opóźnień, wyznaczania ścieżki krytycznej oraz wariancji bazowej.
  • Twój stos technologiczny to Java, Kotlin, C# (.NET) lub korporacyjny Python.

Wybierz xerparser, jeśli:

  • Obsługujesz wyłącznie pliki Primavera P6 .xer.
  • Twój potok jest napisany w czystym Pythonie i bezpośrednio zasilany do pandas, NumPy lub wizualizatorów takich jak Dash / Streamlit.
  • Wdrażasz do lekkich środowisk kontenerowych lub bezserwerowych uruchamianek w chmurze.

Wybierz bezpośrednie wprowadzanie strumienia DB / CSV, jeśli:

  • Potrzebujesz wysokoprzepustowego etapowania bazy danych dla masowych wieloprojektowych eksportów XER w przedsiębiorstwie.
  • Potrzebujesz jedynie wyodrębnić metadane, konta kosztowe i krzywe postępu za pomocą analiz SQL.

Podsumowanie i najlepsze praktyki

Podczas budowania otwarto‑źródłowych potoków dla danych harmonogramu:

  1. Nigdy nie parsuj .mpp ręcznie: Specyfikacja binarna Microsoft jest skomplikowana i nieudokumentowana. Zawsze korzystaj z sprawdzonych bibliotek, takich jak MPXJ.
  2. Uważaj na strefy czasowe dat: Harmonogramy Primavera często zapisują czas trwania pracy bez metadanych strefy czasowej, opierając się na kalendarzach projektu. Upewnij się, że Twój potok ingestujący uwzględnia 8‑godzinne zmiany robocze w porównaniu do 24‑godzinnych dni kalendarzowych.
  3. Sprawdzaj integralność referencyjną: W plikach XER często występują osierocone rekordy (np. zadania wskazujące na usunięte węzły WBS) w ręcznie tworzonych eksportach projektów. Zawsze defensywnie weryfikuj klucze obce podczas ETL.

FAQ

**Q1: 1. Czy biblioteki open‑source mogą bezpośrednio zapisywać lub aktualizować natywne pliki binarne .mpp?

A1: Nie, ze względu na własnościowy format binarny Microsoftu, biblioteki open‑source mogą wiarygodnie odczytywać pliki .mpp, ale zapisy są zazwyczaj eksportowane do standardowych formatów, takich jak MSPDI (XML) lub MPX.

**Q2: Czy muszę mieć zainstalowany Microsoft Project lub Primavera P6 na moim serwerze, aby analizować te pliki?

A2: Nie, biblioteki takie jak MPXJ i xerparser są samodzielnymi parserami, które przetwarzają pliki bezpośrednio, nie wymagając licencji na oprogramowanie hosta.

**Q3: Jaka jest najlepsza natywna biblioteka Pythona do parsowania plików Primavera P6 XER bez zależności od Javy?

A3: xerparser jest wiodącym czysto‑Pythonowym wyborem do parsowania zrzutów XER bezpośrednio do natywnych słowników i DataFrames pandas.

**Q4: Czy MPXJ może konwertować pliki Microsoft Project MPP na formaty Primavera P6?

A4: Tak, MPXJ może odczytać plik .mpp i wyeksportować znormalizowany harmonogram do formatu PMXML kompatybilnego z Primavera.

**Q5: Dlaczego pliki Primavera XER są łatwiejsze do parsowania niż pliki Microsoft Project MPP?

A5: Pliki XER są czytelne dla człowieka, są zrzutami relacyjnych baz danych oddzielonymi tabulacjami, natomiast pliki MPP są własnościowe, binarnymi strukturami dokumentów złożonych.

Zasoby dotyczące formatów plików

News o formatach plików – Twoje jedyne miejsce na wszystkie wiadomości związane z formatami plików z całego świata Fora formatów plików – Zamieść swoje pytania na forach formatów plików, aby uzyskać przydatne informacje od ekspertów i użytkowników społeczności Wiki formatów plików – Przeglądaj kategorie formatów plików, aby uzyskać informacje o różnych formatach Open Source API i biblioteki dla zarządzania projektami