#author("2017-03-17T05:54:34+09:00","","")
//このページでは、JustArkの様々な面に焦点を当てて、Ark開発スタッフ自らがメッセージを発信します。
 
&size(24){XMLデータの分析とグラフ化 ~CalcArkでXMLデータの分析に挑戦~};

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

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

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

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

***XML関数プラグインの概要とインストール [#mb2dd707]

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

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

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

XML関数プラグインを、プラグインダウンロードページからダウンロードして、plugins ディレクトリにコピーする。
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) をコピーしました。
CalcArk を起動する。
[ツール-プラグイン-設定] のUIで、「プラグイン」のところに「XMLワークシート関数」があることを確認します。
これで、インストールは完了です。

***集計、グラフ化 [#g74c06d1]
ある機関から、各都道府県の面積と人口のデータが 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県をグラフ化しています。
|&ref(./screen1.gif,25%);|&ref(./screen2.gif,25%);|

 画面イメージ  画面イメージ
		
***外部参照 [#f8f8381d]

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 で合計を計算しています。

 画面イメージ
|&ref(./screen3.gif,25%);|&ref(./screen4.gif,25%);|
画面イメージ

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

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

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

***ちょっとまとめると [#h7fbc648]
クライアントには CalcArk だけがあれば十分です。勿論、OS の種類は問いません。
サーバーに、元データと集計ファイル(テンプレートファイル)を置きましょう。
元データが変わっても、自動的に集計結果、グラフも変わります。
URL から読み込んで、必要になれば、IDisk Tool for Java で(WebDAVサーバーに)更新しましょう。
一太郎Ark や PrezArk の文書も、勿論 XML(XHTML) なので、集計・グラフ化したいデータがあれば、CalcArk に任せましょう。
XML関数プラグインはソースも公開していますので、参考にしてください。
//プラグインに関して、不具合・要望などありましたら、Ark Developers メーリングリストまでお寄せください。

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS