Ostatnia aktualizacja: 02 wrz, 2026

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 (
%Ttabele z polami%Fi 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ędzie | Główny język | Obsługiwane formaty | Odczyt / Zapis | Najlepszy przypadek użycia |
|---|---|---|---|---|
| MPXJ | Java (powiązania Python / .NET) | MPP, MPT, MPX, XER, PMXML, MSPDI | Odczyt (MPP/XER); Zapis (MPX/MSPDI/PMXML) | Enterprise Java, konwersja wieloformatowa, kompleksowe harmonogramy |
| xerparser | Python | XER | Odczytaj i parsuj | Data science, analiza harmonogramów pandas, potoki ETL |
| python-mpxj | Python | MPP, XER, XML | Odczyt / Konwersja | Pythonic wrapper around MPXJ using JPype |
| netezza-xer / xer-to-csv | Shell / Python / Go | XER | Strumień / Eksport | Ekstrahowanie surowych tabel podobnych do SQL do relacyjnych baz danych |
| OpenProj / ProjectLibre Core | Java | MPP (starsze wersje), XML | Odczyt / Renderowanie | Integracja 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 (
mpxjna 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) orazTASKPRED(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
.mppdo nowoczesnych otwartych formatów, takich jak.jsonlub.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:
- Potrzebujesz jedynie zapytań o relacje tabelaryczne przy użyciu SQL.
- 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
.mppbez 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:
- Nigdy nie parsuj
.mppręcznie: Specyfikacja binarna Microsoft jest skomplikowana i nieudokumentowana. Zawsze korzystaj z sprawdzonych bibliotek, takich jak MPXJ. - 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.
- 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