MPXJをC\#で使いMicrosoft Projectのファイルを扱ってみた

photo credit: ArtBrom

MPXJというMicrosoft Projectのファイルへアクセスするためのライブラリを試してみました。MPXJは以下のファイル形式に対応しています。

  • Microsoft Project Exchange (MPX)
  • Microsoft Project (MPP,MPT)
  • Microsoft Project Data Interchange (MSPDI XML)
  • Microsoft Project Database (MPD),Planner (XML).

MPXJはJavaで書かれているのですがIKVMにより.NETからも使うことができます。

インストールと設定

  1. Browse MPXJ: Microsoft Project Exchange Files on SourceForge.netからmpxj-3.1.0.zipをダウンロードし、任意のディレクトリへ展開する。
  2. 展開後lib.netディレクトリにある以下のファイルをVisual Studioのプロジェクトから参照できるように設定する。
  • IKVM.OpenJDK.ClassLibrary.dll
  • IKVM.Runtime.dll
  • mpxj.dll
  • poi-3.2-FINAL-20081019.dll
  1. MPXJのクラスリファレンスはOverview (MPXJ API)を参照

これだけ。サンプルとしてこんなコードを書いてみました。

[csharp]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using net.sf.mpxj;
using net.sf.mpxj.reader;
using net.sf.mpxj.writer;

namespace MPXJTest
{
 public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 }

private void button1_Click(object sender, EventArgs e)
 {
 if (openFileDialog1.ShowDialog() == DialogResult.OK)
 OpenProjectFile(openFileDialog1.FileName);
 }

private void OpenProjectFile(string fileName)
 {
 ProjectReader reader = ProjectReaderUtility.getProjectReader(fileName);
 ProjectFile projectFile = reader.read(fileName);

ProjectHeader projectHeader = projectFile.getProjectHeader();

textBox1.Text = "プロジェクト名: " + projectHeader.getProjectTitle();
 textBox1.Text += "rnプロジェクト開始日: " + projectHeader.getStartDate();
 textBox1.Text += "rnプロジェクト終了日: " + projectHeader.getFinishDate();

textBox1.Text += "rn担当者";
 foreach (Resource resource in projectFile.getAllResources().toArray())
 textBox1.Text += "rn" + resource.getID() + ": " + resource.getName();

textBox1.Text += "rnタスク";
 foreach (Task task in projectFile.getAllTasks().toArray())
 textBox1.Text += "rn" + GetTaskLevelIndent(task) + task.getName();
 }

private string GetTaskLevelIndent(Task task)
 {
 string level = "";
 while ((task = task.getParentTask()) != null)
 level += "| — ";
 return level;
 }
 }
}
[/csharp]

このコードは指定されたMicrosoft Projectのファイルからプロジェクト名、プロジェクト開始日、プロジェクト終了日、担当者一覧、タスク一覧をテキストボックスへ出力するものです。

マイクロソフトのWebサイトで提供しているベンダーに対する提案依頼書の要請 — テンプレート — Microsoft Office Onlineを読み込んだ結果はこちら。

[text]
プロジェクト名: 
プロジェクト開始日: Mon Jan 01 08:00:00 GMT 2007
プロジェクト終了日: Thu Feb 01 12:00:00 GMT 2007
担当者
0: 
1: 購買マネージャ
2: ユーザー チーム
3: 評価委員会
4: 意思決定グループ
タスク
ベンダーに対する提案依頼書 (RFP) の要請
| — このテンプレートの目的を説明するメモを読む
| — RFP の基準
| — | — RFP 作成の正式なプロセスが必要かどうかを判断する基準のレビュー
| — | — 購買担当に RFP を作成する必要があることについて通知
| — RFP 要請プロセス
| — | — 要求の定義
| — | — | — 製品とサービスのニーズを理解するためにユーザーにインタビュー
| — | — | — 要求の文書化
| — | — | — 回答の評価基準の定義
| — | — | — 評価チームの特定
| — | — RFP の作成
| — | — | — 購買担当から RFP の書式のテンプレートを取得
| — | — | — RFP のドラフト作成
| — | — | — 購買担当、該当分野の専門家と RFP をレビュー
| — | — | — RFP の改良
| — | — | — RFP の内容の準備完了
| — | — 市場調査
| — | — | — 該当する製品またはサービスを提供するベンダー候補企業の特定
| — | — | — 事前の情報提供依頼書 (RFI) が必要かどうかを決定
| — | — | — RFI の回答の収集 (必要な場合)
| — | — | — RFP の対象企業の最終決定
| — | — 業界への RFP の送付
| — | — | — 特定の回答段階についての期限の決定
| — | — | — 期限と連絡先を記載した RFP の完成
| — | — | — RFP を対象企業に送付
| — | — | — RFP についての説明会の実施 (必要な場合)
| — | — RFP 収集プロセスの完了
| — 収集後のプロセス
| — | — "入札意思あり" の回答のまとめ
| — | — 質問回答プロセス
| — | — | — 入札企業からの質問のまとめ
| — | — | — 質問に対する正式な回答の準備
| — | — | — ‘入札意思あり’ と表明したすべての企業に回答を公開
| — | — 提案書のレビュー
| — | — | — 初期評価を実施して問題を明確化
| — | — | — 設定した基準に基づいて提案書を評価
| — | — | — 基準を満たしていない提案企業を除外
| — | — | — 残りの提案企業との話し合いの準備
| — | — 個別会議/交渉
| — | — | — 最終選考に残った企業にソリューションのプレゼンテーションを依頼
| — | — | — 最終選考に残った企業のソリューションとデモを分析
| — | — 選択の決定
| — | — | — 提案書の最終分析
| — | — | — ベンダーの選択
| — | — | — 契約の締結
| — | — | — 選ばれなかった提案企業からフィードバックを収集
| — | — 収集後のフェーズの完了
| — ベンダーからの提案依頼書 (RFP) の収集の完了
[/text]

必要な情報だけを抜いてCSV出力するようなプログラムは簡単に書けそうですね。

弊社のプロジェクト管理ソフトProjectscapeでMicrosoft Projectファイルインポート機能をサポートするのにも使えそうな感じが…もう少し評価してみたいと思います。

Edit(Admin)