Office XPのXML度を探る

ExcelのXML機能は使えるか?

 Excelはいわずと知れた代表的な表計算アプリケーションだ。Office XPのXML機能の中で、最も多くのXML機能が実装されたのがExcelである。

 表計算の用途をあらためて考えてみると、数値や文字などの「値」や「式」を、スプレッドシートを構成している「セル」に入力し、計算や集計、シミュレーションなどを行っていく。そして、それぞれのセルには書式や色などの「属性」がついている。こうして考えると、表計算のデータは比較的XML文書化がしやすいのではないかと思えてくる。

<numeric> 123 </numeric>
<numeric> <red> -456 </red> </numeric>
<vchar> 顧客名 </vchar>
<vchar> 山田太郎 </vchar>
表計算のデータはXML文書化しやすいのではないか……
(右のXML文書は仮想のもので、実際に入出力できるXML文書ではありません)

 マイクロソフトのエンジニアも、これと同じ考えを持ったのかどうかは不明だが、Excelに実装されたXML機能の中心は、ExcelによるXML文書の読み込みと出力にある。

Excel以外のアプリケーションでExcelのデータ分析ができる

 Excelのファイル入出力がXML化されるとどのようなメリットがあるのだろうか。答えは、Excelをシステムの一部に組み込むことが容易になる、という点にある。

 いままでExcelは企業システムの中で、比較的孤立した存在だった。例えば、企業システムの中の特定のデータを、手元のExcelに持ってきて分析しようとしても、通常の企業システムではExcelのワークシート形式のデータを出力することはできないため(また、そのデータフォーマットも公開されていなかったため)、いったん単純なテキストデータなどに変換してからExcelに持ってきてデータ分析をすることが多かった。Excelにため込んだデータを別のシステムに渡したいときも、テキスト形式で保存することが多いはずだ。こうした変換の過程では、せっかく設定した書式などの情報がすっかり失われてしまうため、Excelとそれ以外のシステムとの間でのデータのやりとりは、それなりに面倒なものだったはずだ。

 もちろん、ODBCドライバなどを組み込めばExcelを企業システムに直接結合することは可能だが、これでは逆にあまりにもタイトにシステムと結び付きすぎており、特定のPCからしか利用できないなどの制限が生じてしまう。

 しかし今回のXMLサポートで、ExcelのワークシートをXML文書として記述できるようになった。XML文書として、Excelのワークシートが持つ機能、セルの高さ、色、書式、値、罫線など、ほとんどすべてを記述できることになる。こうなれば、企業のバックエンドシステムが帳票代わりにXML文書でExcelのワークシートを出力したり、セル内の特定のデータだけを探し出し、そこだけを操作、変更することも可能になる。また、XML文書として保存されたExcelのワークシートの情報を、値だけでなく書式なども含めて企業システム内に取り込むことも可能になる。

 XMLのサポートによって、Excelとほかのシステムとの間でシームレスなデータのやりとりが可能になるわけだ。

 では、ExcelのXML文書の読み込み機能について解説していこう。

XML文書にスタイルシートを適用する場合

 ExcelのXML文書の読み込みは、スタイルシートに対応している。もしも、XML文書にスタイルシートが関連付けられていると、XML文書を読み込んだときに、スタイルシートを適応させたうえで読み込むか、それともスタイルシートを無視してXML文書を読み込むかを選択するダイアログボックスが表示される。

スタイルシートに関連づけられたXML文書を開くときには、このダイアログボックスが表示される

 「スタイルシートを適用してファイルを開く」、という方を選択すると、読み込む前に、XML文書にスタイルシートが適用される。

 XML文書にスタイルシートが適用された場合、その結果がXML文書になるとは限らない。プレーンテキストになる場合もあれば、HTMLになることもあり、まったく異なるフォーマットの文書になることもある。いずれにせよ、スタイルシートが適用された場合には、その結果として生成されるデータを開こうとする。この場合、そのファイルがExcelで読み込める形式であれば読み込むし、そうでなければ読み込みには失敗することになる。

 また、スタイルシートを適用した結果、また新たなXML文書が生成され、そのXML文書がスタイルシートに関連付けされている場合には、あらためて最初の手順に戻り、そのスタイルシートを適用するかどうかを選択するダイアログボックスが再び表示される。

XML文書を読み込む

 今度は、XML文書をそのまま読み込むケースについて解説していこう。このケースは、XML文書にスタイルシートを適用しないで読み込むケースのほか、スタイルシートを適用した結果XML文書が生成された場合や、そもそもスタイルシートがないXML文書を読み込む場合などを含む。

 Excelはまず、読み込む文書がXML文書として正しいかどうかを確認する。もし不正な場合には、読み込みに失敗する。XML文書は、整形式なXML文書であればよく、妥当なXML文書である必要はない。

 ただし、あらゆるXML文書が読み込めるわけではなく、読み込み時にある程度の変換が行われる。これをマイクロソフトの資料では「XMLのフラット化」と呼んでおり、フラット化を行うモジュールを「XML Flattener」と呼んでいる。

 XML Flattenerでは、XML文書の内容によって「シェープツリーの作成」「属性のタグへの分解」「#id列の追加」「#agg列の追加」といった変換を行う。このとき、フラット化されたXML文書が元のXML文書を上書きしてしまわないように、元のXML文書は上書き禁止モードでオープンされる。

−シェープツリーの作成

 通常のXML文書では、あるノードが同じ名前の子ノードを複数持つことができる。例えば、下記の例は、ノードAは、子であるノードBを2つ持っている。

<A>
  <B>
    <C/>
  </B>
  <B>
    <D/>
  </B>
</A>
ノードAの子ノードとして、ノードBが2つ存在している

 XML Flattenerでは、この複数の子ノードを次のように1つにまとめる働きをする。

<A>
  <B>
    <C/>
  </B>
  <B>

    <D/>
  </B>
</A>
<A>
  <B>
    <C/>
    <D/>

  </B>
</A>
ノードAの子ノードとして、ノードBが2つ存在する状態(左)を変換して、ノードBを1つにまとめる

−属性のノードへの分解

 XMLのタグは属性を持つことができるが、ワークシートでは属性を表現することができない。そのため、あるタグ(によって表現されるノード)の属性は、そのノードの子ノードとして追加される。ノード名には属性名が使われるが、そのノードが属性を表していることを明示するために、属性名の前に「@」が付加される。

<nodename attribute="value" /> <nodename>
  <@attribute>value</@attribute>
</nodename>
あるノードが属性を含んでいる場合、属性は子ノードへと分解される

−id列の追加

 シェープツリーによってノードをまとめると、どのノードがどの子ノードだったのか、という情報が失われて問題になることがある。例えば下記の例をまとめてしまうと、名前とメールアドレスの明示的な関係が失われてしまう。

<Contact>
  <Name>山田太郎</Name>
  <Email>taro@yamada.com</Email>
  <Email>tyamada@atmarkit.co.jp</Email>

</Contact>
<Contact>
  <Name>鈴木次郎</Name>
  <Email>jsuzuki@abc.com</Email>

</Contact>
  
2つのノードContactが存在している

<Contact>
  <Name>山田太郎</Name>
  <Email>taro@yamada.com</Email>
  <Email>tyamada@atmarkit.co.jp</Email>

  <Name>鈴木次郎</Name>
  <Email>jsuzuki@abc.com</Email>

</Contact>
  
ノードContactがまとまってしまうと、名前とメールアドレスの関連が失われてしまう

 この関連が失われてしまわないように、別の方法で関連を示すのがid列だ。同じid列の値を持つデータは、同じノードの下に存在していたことを示す。下記の画面を見ていただけば分かるだろう。

id列が付与されて番号付けが行われたワークシート。id列の値が同じ場合、同じ親ノードを持つことを示している

−agg列の追加

 agg列も、id列と似たような役割を担っている。XML文書をワークシートに展開するとき、まれに数値がどちらのノードに属しているのか、それとも両方にかかる合計なのか判別できない場合がある。例えば以下のようなケースだ。

<Order>
  <Product>CPU</Product>
</Order>
<Order>
  <Product>Memory</Product>
</Order>
<Price>29.99</Price>
<Total>59.98</Total> 
 
<Price>と<Total>は、どちらか片方の<Order>にかかるのか、両方にかかるのかが、これでははっきりしない

 このときには、便宜的にagg列を用いて、どちらか片方にかかる場合と、両方にかかる場合を、同時に表現する。

id列が付与されて番号付けが行われたワークシート。id列の値が同じ場合、同じ親ノードを持つことを示している

 このように、ExcelではXML文書にいくつかの変換を行ったうえで読み込むような機能を備えているわけだ。

■Excelで読み込めるXML文書を作ってみる
この記事のサンプルで作成した、Excelで読み込めるXML文書の例を紹介してみよう。とはいっても、普通のXML文書を作れればまったく簡単な作業だ。しかも整形式であればいいため、DTDも不要で実に簡単である。サンプルとして、下記のXML文書の書式を整えてみよう。

<Contact>
  <Name>山田太郎</Name>
  <Email>taro@yamada.com</Email>
  <Email>tyamada@atmarkit.co.jp</Email>
</Contact>
<Contact>
  <Name>鈴木次郎</Name>
  <Email>jsuzuki@abc.com</Email>
</Contact>
  

ポイントは2つだ。1つはXML宣言である。通常のテキストエディタでXML文書を作成すると、漢字コードはシフトJISになる。そのため、XML文書に漢字コードの指定を入れる必要がある。でないと、デフォルトの漢字コードであるユニコードのUTF-8だと見なされ、全角文字が含まれているデータの読み込みに失敗する。もう1つのポイントは、ドキュメントルートだ。上記のXML文書には、ドキュメントルートとなれるノードが2つある。この上に1つ、ドキュメントルートをおいてやる必要がある。すると、下記のようになる。

<?xml version="1.0" encoding="Shift_JIS" ?>
<Document>
  <Contact>
    <Name>山田太郎</Name>
    <Email>taro@yamada.com</Email>
    <Email>tyamada@atmarkit.co.jp</Email>
  </Contact>
  <Contact>
    <Name>鈴木次郎</Name>
    <Email>jsuzuki@abc.com</Email>
  </Contact>
</Document>
  

 

XML文書の出力

 Excelでは、「XML Spreadsheet Schema」(XML-SS)というXML文書のスキーマに対応したXML文書によって、XML文書でExcelのワークシートを記述することを実現した。XML-SSではグラフ、ピボットテーブル、ビボットグラフ、Visual Basic for Applicationsのコード、およびそのほかの埋め込みオブジェクトの情報はワークシートに含まれないが、逆に言うとそれ以外のワークシートの情報はすべて含めることができる。XML-SS形式で保存するには、「名前を付けて保存」ダイアログボックスから「ファイルの種類」で「XMLスプレッドシート」を選択する。

 Excelには以前のバージョンから、ワークシートを「Webページ」として保存することが可能だった。ワークシートをWebページとして保存すると、Internet Explorerからそのファイルを開いたときに、Internet Explorer上でほぼ同じワークシートの表示が可能になる。

 しかし、XML-SSはこのWebページで保存するフォーマットとは異なる。試しに、XML-SS形式で保存したワークシートをInternet Explorerで表示させてみたが、単純にXML文書として表示されただけだった。

同じワークシートを、左は「Webページ」形式で保存し、右は「XML-SS」形式で保存したうえで、それぞれInternet Explorerで表示してみた

 XML-SSには、Excelの機能にを表現するための多くのタグなど、複雑なスキーマが定義されているはずだ。しかし、筆者が探した限りでは、それぞれのタグの種類や意味を解説したドキュメントはまだマイクロソフトから提供されてはいないようだった。ただ、実際に出力されたXML文書のタグを見れば、それがどんな意味かは容易に想像がつくため、必要な部分だけなら解析は可能だろう。

 上記のサンプル画面に表示されている簡単なワークシートを、XML-SS形式で保存したサンプルを用意した。興味のある方は参照してみるとよいだろう。ただし、漢字コードはUTF-8であるため、通常のエディタでは漢字が文字化けすることに注意が必要だ。

そのほかのXML機能

 ここで解説した以外にも、Excelでは「XML Webクエリ」機能や、「Range.Value()のXML対応」が行われている。

 XML Webクエリ機能は、Excelから、Webサーバ上のXML文書に対して直接クエリを発行できる機能だ。いままでは、Webページのテーブル部分を対象にしたクエリを発行し、そのテーブルをワークシートにロードすることができた。この機能をXMLにまで拡張し、WebサーバのXML文書の中から、条件に該当する部分を切り取ってワークシート上に展開することができる。これにより、インターネット上のXML文書化されたデータを直接Excelで分析可能になる。

 Range.Value()のXML対応とは、Visual Basic for Applications(VBA)などから利用できるオブジェクトであるRangeのValueプロパティに対してXML形式のデータでの入出力が可能になったということだ。これで、XML文書化されたデータがあった場合に、それをファイルにしてExcelで読み込んだりしなくても、XMLデータをVBAのプログラムが受け取って、直接ワークシート上に書き込むことが可能になる。ファイルの入出力だけでなく、アプリケーションが扱うデータもXML化できることになるわけだ。

 以上がExcelのXML機能の概要である。Office XPのXML機能についてはまだ資料が少なく、筆者も製品を試したり、あちこちのドキュメントの意味をつないだりしながらこの記事を執筆してきた。その経験からすると、デベロッパーが本格的にExcelのXML機能を活用するには、まだまだ資料の充実が必要だと思われる。

 次回の後編では、AccessのXML機能と、Office XP Developerに含まれるXMLデザイナについて紹介していく予定だ。

参考文献
■「Office XP ExcelにおけるXMLサポート」ホワイトペーパー マイクロソフト発行

 

XML Schemaに早くも対応したAccess

Index
Office XPのXML度を探る
  Office XP各製品のXML機能概要
  XML機能の核、「MSXML3」
MSXML3が自動的にインストールされる
Internet Exlorerはバージョンアップしないが……
XML普及の弾みがつくか
ExcelのXML機能は使えるか
Excel以外のアプリケーションでExcelのデータ分析ができる
XML文書にスタイルシートを適用する場合
XML文書を読み込む
コラム Excelで読み込めるXML文書を作ってみる
XML文書の出力
そのほかのXML機能
  XML Schemaに早くも対応したAccess
テーブルの内容をエクスポート
スキーマ情報をXML Schemaで記述
フォームやレポートもXML形式で出力
XML文書をインポートでテーブル化
AccessのXML機能のまとめ
  開発環境もXML対応へ
IntelliSenseがXML対応
Office XP:どれもすぐ使えるXML機能
 

 



XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間