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

Arnage 2
Creative Commons License 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
  3. MPXJのクラスリファレンスはOverview (MPXJ API)を参照

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

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;
        }
    }
}

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

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

プロジェクト名:
プロジェクト開始日: 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) の収集の完了

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

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

関連する記事:

データを見ないプロマネ

she burns
Creative Commons License photo credit: stars.alive

isologue – by 磯崎哲也事務所: データを見ない人々(「オープン化」する社会での「分析」の価値)より。

マスコミの人って、データを全く見ないんですよね。代理店の人ですら。さすがにマーケの人は別だけど。
例えば、子供向け出版物の売れ行きが落ちている説明として、会議で担当者が、
「少子化が進んでいるので」
なんて説明をしたりするけど、調べてみるとここ数年、実は小学生の数はほぼ横ばいなんですよ。
今やインターネットで政府の統計なんか簡単にタダで調べられるのに、調べない。
データがいくらオープンになって、タダでインターネットで見られるようになっても、見ない人は見ないんじゃないでしょうか。

マスコミや投資家といったインテリ層に属する人たちですら、大半はデータを見ずに「少子化が進んでいる」というような(データの裏付けが無い)前提に基づいて判断を下していることが多く「データを分析する機能」は今後も価値を持ち続けるだろうという内容です。

読んでいてプロジェクトマネジメントも同じだなと思いました。

ソフトウェアの開発プロジェクトでは課題やバグ数、テストケース数、生産物の出来高、コストと利益率など多くのメトリクスを扱います。

ほとんどのプロジェクトではこれらのデータを一定期間毎に集計し、社内や顧客への報告資料としてまとめていると思いますが、単に集計するだけで、それらの数値をきちんと分析していないプロマネが意外に多い。

収集したデータの特異値や傾向をきちんと分析することで、大きな問題になる前に早めのアクションが打てるようになります。PDCAサイクルのC(Check)とA(Act)ですね。

そんなの当たり前じゃないかと思いますよね。ですが、トラブルになるプロジェクトは経験上、

  • プロジェクトデータを継続的に収集できる仕掛けがない
  • メトリクスの分析とフィードバックが不十分(集計して眺めているだけ…)

のいずれかが該当するはず。こういうプロジェクトは個人的にPDDD(Plan-Do-Do-Death)プロジェクトと呼んでます(^^)

オープンソースのプロマネツールも数多く存在する現状を考えると「プロジェクトデータを継続的に収集できる仕掛けがない」プロジェクトは減ってくでしょうから、プロジェクトデータを分析して、早めに適切なアクションを打つことができるプロマネの価値はさらに高まっていくのではないでしょうか。

関連する記事:

オープンソースのテスト管理ツールTestLinkを使ってみての雑感

30 Days of Gratitude- Day 13
Creative Commons License photo credit: aussiegall

前から気になっていたオープンソースのテスト管理ツールTestLinkをインストールして使ってみました。

好ましいと感じたポイント

  • テスト仕様とテスト計画が独立しており、テスト計画でどのテストを実行するかを選択することができる。特定機能だけの再テスト計画を作成するなど、柔軟に使えそう。
  • テストケースにキーワードを設定し横串で検索できる。(境界・限界、異常系、追加テスト、顧客受入テスト…)
  • 簡単な要件管理機能がありテストケースと関連付けてテストカバレジを参照できる。
  • テスト計画やテストレポートをHTML、Word、Excel、OpenOffice形式で出力することができる。顧客や社内向けに簡単に「紙で」状況を報告できる仕掛けがあるのは嬉しい。弊社のプロジェクト管理ソフトProjectscapeのレポート機能、印刷機能と同じ思想。と、少し宣伝(^^;
  • 失敗したテストケース、ブロックされたテストケースのみを出力したり、担当者がアサインされていないテストケースを抽出したりなど、実際の現場で役立ちそうな機能がある。
  • 「要件に基づくレポート」機能はスケジュール遅延や品質が悪い場合ケースで、事前に顧客へ制約事項を提示するのに便利そう。

こうだったら良いのに…と感じたポイント

  • ユーザインタフェースが直感的でなくテスト計画・テストスイート・テストケース・要件仕様ドキュメント・要件・ビルドなどのTestLink用語の意味と関係性を事前に理解しておかないと、どう操作して良いかわかりにくい。
  • 要件管理機能がシンプル(要件を階層的に管理できない、要件IDがツリーに表示されない、要件からテストケースを作成できないなど)OSRMTなど他の要件管理ツールとの連携ができないか。

好ましいと感じたポイントが6つ、こうだったら良いのに…と感じたポイントが2つということで、個人的にはかなりのポテンシャルを感じるツールです。
実際のプロジェクトで使い込んでみたいと思います。

最後にインストールして動かすまでにハマったポイントについてまとめておきます。

テストケースと要件を関連付けを行うと以下のエラーが表示される。

Fatal error: require_once() [function.require]: Failed opening required 'tlAttachmentRepository.class.php' (include_path='.:/usr/share/php:/usr/share/pear:.:/var/www/testlink/lib/functions/') in /var/www/testlink/lib/functions/common.php on line 109

TestLink :: View topic – Error while assiging reuirements to test casesにある通り、/var/www/testlink/lib/functions/common.phpへ以下の行を追加。

require_once("testproject.class.php");

グラフに日本語が表示されない。

こちらを参考に日本語フォントをインストールして設定ファイルを変更。

関連・参考リンク

関連する記事: