最終更新日: 2026年9月2日

MS Project (MPP) と Primavera (XER) ファイル向けの主要なオープンソースAPI
エンタープライズプロジェクト管理において、2つの独自ファイル形式が支配的です:Microsoft Project (.mpp) と Oracle Primavera P6 (.xer)。内部分析ダッシュボードの構築、建設スケジュールと ERP システムの同期、またはプロジェクトステータスパイプラインの自動化を行う場合でも、これらのスケジューリングファイルをプログラムで読み取り、操作できることは重要な要件です。
しかし、両方のフォーマットは悪名高いエンジニアリング上のハードルをもたらします:
- MPP files はバイナリで、文書化されていない OLE Structured Storage または独自の複合文書フォーマットで、ほぼすべての主要な MS Project リリース(2000、2003、2007、2010、2013、2016、2019、2021)でスキーマが変更されています。
- Primavera XER files はタブ区切りテキストエクスポートで、リレーショナルデータベーステーブル(
%Tテーブル、%Fフィールド、%Rレコード)として構造化されており、複雑な参照整合性制約、マルチカレンダー継承、クリティカルパスロジックが組み込まれています。
Aspose.Tasks のような商用 SDK は存在しますが、ライセンス費用とベンダーロックインにより、堅牢なオープンソース代替手段が不可欠です。本ガイドでは、Java、Python、C# 向けに利用可能なトップクラスのオープンソース API、ライブラリ、パーサーを分解し、MPP と XER ファイルをクリーンかつ効率的に処理する方法を紹介します。
オープンソースツールの簡易比較
| ライブラリ / ツール | 主要言語 | サポート形式 | 読み取り / 書き込み | 最適な使用ケース |
|---|---|---|---|---|
| MPXJ | Java(Python / .NET バインディング) | MPP, MPT, MPX, XER, PMXML, MSPDI | 読み取り (MPP/XER); 書き込み (MPX/MSPDI/PMXML) | エンタープライズ Java、マルチフォーマット変換、オールインワン スケジュール |
| xerparser | Python | XER | 読み取りと解析 | データサイエンス、pandas スケジューリング分析、ETL パイプライン |
| python-mpxj | Python | MPP, XER, XML | 読み取り / 変換 | JPype を使用した MPXJ の Pythonic ラッパー |
| netezza-xer / xer-to-csv | Shell / Python / Go | XER | ストリーム / エクスポート | 生のSQLライクなテーブルをリレーショナルDBに抽出する |
| OpenProj / ProjectLibre Core | Java | MPP(旧バージョン)、XML | 読み取り / レンダリング | ベースラインガントビューのためのデスクトップ/エンジン統合 |
1. MPXJ (Java 用 Microsoft Project eXchange)
スケジュール相互運用性の揺るぎない業界標準
オープンソースのスケジューリングライブラリにおいて金字塔があるとすれば、それは MPXJ です。Jon Iles によって20年以上にわたり積極的にメンテナンスされている MPXJ は、もともと Microsoft Project の MPX ファイルを処理するために作られましたが、プロジェクトスケジューリングフォーマット用の汎用翻訳エンジンへと拡張されています。
主な機能
- Direct MPP Extraction: ほぼすべての MS Project バージョン(Project 98 から最新の Project 2016/2019/2021/365)にわたる独自のバイナリ MPP ファイルを、Microsoft Project のインストールが不要で解析します。
- Primavera P6 XER & PMXML Parsing: テキストベースの
.xerダンプと最新の Primavera XML ファイルの両方をネイティブにサポートします。 - Normalized Data Model: 統一されたオブジェクトモデル(
ProjectFile、Task、Resource、ResourceAssignment、Relation、WorkCalendar)を提供します。入力が MPP であろうと XER であろうと、アプリケーションコードは全く同じ API とやり取りします。 - Multi-Language Distribution: Java で記述されているものの、MPXJ は IKVM/CoreCLR を介して .NET (C#) 用のネイティブコンパイル済み NuGet パッケージ、そして Python 用パッケージ(PyPI の
mpxj)を配布しています。
簡単コード例: 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());
}
}
}
}
MPXJ が優れる点
- 真のクロスフォーマット正規化(MPP を XER 互換の PMXML または MSPDI に変換)。
- 複雑なカレンダー ロジック(シフト、例外、複数カレンダーの作業時間)。
- 活発なコミュニティによる本番レベルの安定性。
2. xerparser (Python)
Primavera XER 用の軽量でネイティブな Python パーシング
MPXJ は Python バインディング経由で呼び出すことができますが、その場合は JVM バックエンド(JPype 経由)を実行する必要があります。Java 依存なしで実行できる純粋なネイティブ Python パーサが必要なときは、xerparser が最適なソリューションです。
XER ファイルは本質的にデータベースのスナップショットをフラットテキストにダンプしたものです。xerparser はこれらのテーブルを構造化された Python オブジェクトにデコードし、pandas とシームレスに統合します。
主な機能
- Java 依存なし:
pip install xerparserでインストール可能な純粋な Python 3 ライブラリです。 - リレーショナル インテグリティ:
TASK(アクティビティ)、PROJECT(プロジェクトメタデータ)、PROJWBS(WBS 階層)、TASKRSRC(割り当て)、TASKPRED(ロジック結合)など、主要な Primavera テーブルをマッピングします。 - 高速実行: コンテナ化されたマイクロサービス、AWS Lambda 関数、そして最新のデータオーケストレーションパイプライン(例:Apache Airflow、Prefect)に最適です。
クイックコード例: 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())
xerparser が優れる点
- データエンジニアリング、遅延請求分析、そしてスケジュールヘルスチェック(DCMA 14ポイント評価スクリプト)。
- 50MB以上のJavaランタイムをバンドルするのが非現実的なサーバーレスワークロード。
3. python-mpxj
Python と MPXJ のフルパワーを橋渡し
Pythonで作業していても、バイナリの .mpp ファイルを 必ず 処理しなければならない場合、xerparser は .xer のみを対象としているため役に立ちません。最も信頼できるオープンソースブリッジは python-mpxj です。
主な機能
jpype1を使用して、ヘッドレスの組み込みJVMを自動的に起動します。- MPXJ の完全な API を Python 開発者に直接公開します。
- 独自の
.mppから.jsonや.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. カスタムパーシングユーティリティとデータベース取り込みスクリプト
ストリーム処理で生の Primavera XER を処理
Primavera XER は予測可能なテーブル形式に従うため、多くのオープンソースエンジニアリングチームは高レベルの DOM スタイルのスケジュールライブラリよりも、カスタムのタブular ストリームデコーダ(Go、Python、または Rust で記述)を利用しています。
XER ファイル構造は次のようにフォーマットされます:
%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
GitHub 上のいくつかのオープンソーススクリプト(xer2sqlite や xer-to-csv など)は、この構造を直接 SQLite または PostgreSQL に変換します。このアプローチが最適なのは次の場合です:
- SQL で表形式のリレーションシップを照会するだけでよい場合。
- スケジュールが数百メガバイトのサイズで数万件のタスクがあり、オブジェクト指向のツリーローダーではメモリ不足エラーが発生する場合。
技術比較: どちらを選ぶべきですか?
MPXJ を選択する場合:
- プロプライエタリな商用ソフトウェアに費用をかけずに、バイナリの Microsoft Project
.mppファイルを読み取る必要がある場合。 - 深いスケジュールインテリジェンスが必要な場合:作業カレンダー、遅延期間の計算、クリティカルパスの算出、ベースラインのばらつきなど。
- 使用している技術スタックが Java、Kotlin、C# (.NET)、またはエンタープライズ向け Python の場合。
xerparser を選択する場合:
- Primavera P6
.xerファイルのみを扱う場合。 - パイプラインが ネイティブ Python で記述され、pandas、NumPy、または Dash / Streamlit のような可視化ツールに直接渡す場合。
- 軽量コンテナ環境またはサーバーレスのクラウドランナーにデプロイしています。
Direct DB / CSV ストリームインジェストを選択する場合:
- 大規模なマルチプロジェクト企業のXERエクスポート向けに、高スループットのデータベースステージングが必要です。
- メタデータ、コストアカウント、進捗曲線をSQL分析で抽出するだけで済みます。
概要とベストプラクティス
スケジュールデータ用のオープンソースパイプラインを構築する際は、次の点に注意してください:
- 決して
.mppを手動で解析しないでください: Microsoft のバイナリ仕様は複雑で文書化されていません。常に MPXJ のような実績のあるライブラリに依存してください。 - 日付とタイムゾーンに注意してください: Primavera のスケジュールは、プロジェクトカレンダーに依存し、タイムゾーンメタデータなしで作業期間を記録することがよくあります。インジェストパイプラインが 8 時間の作業日シフトと 24 時間のカレンダー日を正しく考慮するようにしてください。
- 参照整合性を検証してください: XER ファイルでは、手動で作成されたプロジェクトエクスポートで、削除された WBS ノードを指すタスクなどの孤立レコードが頻繁に発生します。ETL 中は常に外部キーを防御的に検証してください。
よくある質問
**Q1: 1. オープンソースライブラリはネイティブバイナリの .mpp ファイルを直接書き込んだり更新したりできますか?
A1: いいえ、Microsoft の独自バイナリ形式のため、オープンソースライブラリは .mpp ファイルを確実に読み取ることができますが、書き込みは通常、MSPDI(XML)や MPX などの標準フォーマットにエクスポートされます。
**Q2: これらのファイルを解析するために、サーバーに Microsoft Project または Primavera P6 をインストールする必要がありますか?
A2: いいえ、MPXJ や xerparser のようなライブラリはスタンドアロンのパーサーで、ホストソフトウェアのライセンスを必要とせずにファイルを直接処理します。
**Q3: Java 依存なしで Primavera P6 XER ファイルを解析するための最適なネイティブ Python ライブラリは何ですか?
A3: xerparser は、XER ダンプを直接ネイティブな辞書や pandas DataFrame に解析するための、最高の純粋 Python 選択肢です。
**Q4: MPXJ は Microsoft Project の MPP ファイルを Primavera P6 のフォーマットに変換できますか?
A4: はい、MPXJ は .mpp ファイルを読み取り、正規化されたスケジュールを Primavera 互換の PMXML フォーマットにエクスポートできます。
**Q5: Primavera XER ファイルは Microsoft Project の MPP ファイルよりも解析が容易な理由は何ですか?
A5: XER ファイルは人間が読みやすいタブ区切りのリレーショナルデータベースダンプであり、MPP ファイルは独自のバイナリ複合文書構造です。
ファイル形式リソース
ファイル形式ニュース – 世界中のファイル形式に関するすべてのニュースを網羅するワンストップサイト ファイル形式フォーラム – ファイル形式フォーラムで質問を投稿し、専門家やコミュニティユーザーから有益な情報を得ましょう ファイル形式ウィキ – さまざまなファイル形式に関する情報を提供するファイル形式カテゴリを探索してください オープンソース API とライブラリ(プロジェクト管理向け)