Ark SiteColumn & Report Arkアーキテクチャ
TOP 開発の現場から 第9回

このページでは、JustArkの様々な面に焦点を当てて、Ark開発スタッフ自らがメッセージを発信します。

第9回 XMLデータの分析とグラフ化 〜CalcArkでXMLデータの分析に挑戦〜

 ・はじめに ・XML関数プラグインの概要とインストール ・集計、グラフ化 ・外部参照 ・テンプレート ・おわりに ・付録

はじめに

みなさんこんにちは。CalcArk ワークシート関数担当のHです。

さて、皆さんは XML のデータを集計したりグラフ化したりする場合、どうしていますか?
XSLT、そして SVG が勧告になった現在、XSLT ファイルを用意して、データを集計したり SVG で出力したりしている 方も多いのではないでしょうか。
しかしながら、XSLT や SVG の仕様は必ずしも容易に理解できるものではないため、理解している方でも XSLT ファイルを 作成するのを面倒に思ったことはあるはずです。 そして、もっと手軽に、目で確認しながら、集計したりグラフ化したりしたいなぁと思ったことが・・・

CalcArk と XML関数プラグインがそれを解決してくれます。

  • XSLT ファイルは要りません。
  • SVG の仕様を知らなくても、グラフが作成できます。
  • CalcArk には、XSLT を遙かに上回る数の関数が用意されています。関数は、必要になればプラグインで追加できます。
  • 表形式なので、XML をデータベース的に扱うのに適しています。
  • 勿論、ソートもできます。
  • そして何よりも、目で確認しながら結果を得ることができます。
XML関数プラグインの概要とインストール

今回は、「XML のデータを取得する」という課題に、「ワークシート関数」でアプローチしてみました。
何故、ワークシート関数なのか、については後述します。

現在の XML 関数プラグインは大きく2つの機能を提供しています。
1つは、XPath による XML データの取得で、もう1つは、CalcArkXHTML 内のセルデータ取得(一般に言うところの「外部参照」)です。
どのような関数があるかについては、[ツール−プラグイン−設定]のUIで「プロパティ」ボタンを押下すれば、関数の一覧が表示されます。 また、Javadoc形式のドキュメントも用意していますので、参考にしてください。

何はともあれ、まずは動かしてみましょう。
以下の手順に従って、インストール、動作確認を行ってください。

  1. XML関数プラグインを、プラグインダウンロードページからダウンロードして、plugins ディレクトリにコピーする。
  2. JAXP1.1 に対応した XML パーサーと、Xalan2 をクラスパスの通った場所にコピーする。
    Xalan2 が必要なのは、XML関数プラグインが XPath の機能を利用しているからです。 Xalan2 はApache XML Projectからダウンロードできます。
    因みに、筆者は XML パーサーに Xerces1 を使いました。
    参考までに、動作確認したモジュールのバージョンは Xerces1.4.4 と Xalan2.3.1 です。 JAVA_HOME/jre/lib/ext に xalan.jar(886KB), xerces.jar(1770KB), xml-apis.jar(106KB) をコピーしました。
  3. CalcArk を起動する。
  4. [ツール−プラグイン−設定] のUIで、「プラグイン」のところに「XMLワークシート関数」があることを確認します。
これで、インストールは完了です。

集計、グラフ化

ある機関から、各都道府県の面積と人口のデータが XML で提供されているとします。 (この類のデータは、近い将来、自治体等からXMLで提供されるようになるかもしれませんね。)
この XML データから、CalcArk で日本の総人口を求めて(集計)、また上位の5県をグラフ化(分析)してみましょう。

この集計結果をファイルにしたものが http://www.justsystem.co.jp/ark/genba/files09/samples/population.html にありますので、CalcArk で読み込んでみてください。
CalcArk を起動して、[ファイル−URLを開く]UIの URL 欄に、上記 URL をコピーし、ファイル形式を XHTML1.0 にしてOKボタンを押下します。
(※プロキシの設定が必要な場合は、それも忘れずに)

シート「一覧」の A 列には各都道府県の名前が入力されており、その名前を元に B〜D 列の数式が先ほどの XML データを取得しています。
例えば、C5 セルには、以下の数式が入力されています。

=VALUE(SelectSingleNodeValue($F$2,G5,TRUE))

(XML関数プラグインが提供している)SelectSingleNodeValue 関数は、第1引数に「XMLファイルのURI」を、第2引数に 「XPath式」をとり、XPath式で指定されたノードの値を返します。 第3引数は、パースしたXML(DOM)をキャッシュしておくかどうかのフラグです。
参照先の F2 セルや G5 セルを再表示すると、F2 セルには、先ほどの XML ファイルの URL が入力されていて、 G5 セルは

//prefecture[@name='北海道']/population/man/text()

という XPath 式であることが分かります。これは「name 属性が北海道である prefecture 要素の、子要素 population の さらに子要素 man のテキストノード」を取得しなさい、という式です。 先ほどの XML で確認すると、2726996 となっています。
SelectSingleNodeValue 関数は、データを文字列で返しますので、VALUE 関数を使って数値に変換しています。 他の B5:D51 範囲内のセルも同様です。
そして、最終的に 52 行目で SUM 関数を使って集計しています。

また、その結果を元にして、シート「ランク」で上位5県をグラフ化しています。

画面イメージ 画面イメージ
外部参照

CalcArk を使えば、申請書や見積書等の帳票は簡単に作成でき、しかも、そのまま Web に公開することができます。

今、社内の各部署から、毎日のように様々な購入申請が作成され、それが一カ所に集められていっているとしましょう。 経理であるあなたは四半期分の経費を計算しなければいけません。 CalcArkで作成された購入申請書は、決まったフォーマットで作成されているため、 この場合、セル C13 の値(予定合計金額欄)の合計を計算すればいいことになります。

さて、どうするか。
XSLT ファイルを用意するのは面倒です。CalcArk を使いましょう。

CalcArk の標準の機能では、他ブック(外部ファイル)への参照式を入力することはできないため、

=[foo.html]Sheet1!A1

のようにして、foo.html の Sheet1 のセル A1 の値を参照することはできませんが、今回、XML関数プラグインが提供する XCell 関数を使えば、それが可能になります。この例であれば

=XCell("foo.html","Sheet1",1,1)

となります。第1引数に「CalcArkXHTMLファイルのURI」、第2引数に「シート名文字列」、第3引数と第4引数にそれぞれ 「行番号」「列番号」を指定すると、目的のセルデータの値を返します。

今までと同様に、 http://www.justsystem.co.jp/ark/genba/files09/samples/shinseisho_total.html を CalcArk で読み込んでみてください。
それぞれのデータを取得するのに XCell 関数を利用し、セル F8 で合計を計算しています。

画面イメージ 画面イメージ
テンプレート

ここまで見てきて、何か気がつかれたことはありませんか?
population.xml のデータを集計、グラフ化する population.html、shinseisho1/2/3.html を 集計する shinseisho_total.html
これらは全て、あるデータを集計、分析、グラフ化する「テンプレート」になっています。

そして、これが XML のデータ抽出を、関数プラグインとして提供した理由の1つでもあるのです。

  • 抽出方法を数式としてファイルに埋め込めるので、テンプレート化できる。
  • 抽出結果がセルなので、カスタマイズ(テンプレート化)し易い。
  • ファイルを読み込むだけで、分析(グラフ化)が可能。つまりは、一連のUIの操作が不要。
  • データの形式を問わない。今回は XML でしたが、データの形式が何であれ、それに特化したプラグインを作成すればいい。
  • 元データが変更されても、dynamic に追従できる。
    例えば population.xml のデータの一部が変更されても、population.html を読み込めば、最新の情報が得られます。
おわりに

ちょっとまとめると

  • クライアントには CalcArk だけがあれば十分です。勿論、OS の種類は問いません。
  • サーバーに、元データと集計ファイル(テンプレートファイル)を置きましょう。
    元データが変わっても、自動的に集計結果、グラフも変わります。
  • URL から読み込んで、必要になれば、IDisk Tool for Java で(WebDAVサーバーに)更新しましょう。
  • 一太郎Ark や PrezArk の文書も、勿論 XML(XHTML) なので、集計・グラフ化したいデータがあれば、CalcArk に任せましょう。

XML関数プラグインはソースも公開していますので、参考にしてください。
プラグインに関して、不具合・要望などありましたら、Ark Developers メーリングリストまでお寄せください。

付録

●プラグイン
●サンプルファイル
●関数の説明(Javadoc)

TOP 開発の現場から 第9回