XMLをOfficeで扱う: XMLスプレッドシート(XMLSS)形式 (1)

2004年05月23日(日)更新


■XMLスプレッドシート(XMLSS)形式

たけち: 前回はExcelとXML Schemaファイルを使って、CSVをXMLデータへ変換したけれど、その際に「XMLデータ」とは別にXMLスプレッドシートという形式で【kajin2_XMLSS.xml】というファイルを保存したよね。

さらら: そうね。「XMLデータ」の方はよくわかったけれど、この「XMLスプレッドシート」ってよくわからなかったわ。

たけち: うん。今回は、「XMLスプレッドシート」について説明するね。まず前回も気づいたことだけれど、【kajin2.xml】と【kajin2_XMLSS.xml】では、アイコンのデザインが違ったよね。

さらら: えぇ。【kajin2.xml】は普段見慣れたXMLファイルのアイコンだけれど、「XMLスプレッドシート」である【kajin2_XMLSS.xml】はそうではないわ。

アイコン


■【kajin2.xml】を表示

たけち: ここでは【kajin2.xml】と【kajin2_XMLSS.xml】の違いを見てみようね。まず、通常の「XMLデータ」である【kajin2.xml】のアイコンをダブルクリックしたらどうなると思う?

さらら: え〜と、スタイルシート処理命令はなかったから、単にInternet Explorer上でこの内容が表示されるだけだと思うわ。

たけち: そうだね。このアイコンをダブルクリックするとそうなるね。

【kajin2.xml】の表示
【kajin2.xml】の表示


■【kajin2_XMLSS.xml】を表示

たけち: じゃあ、次にXMLスプレッドシートの【kajin2_XMLSS.xml】アイコンをダブルクリックしたらどうなるか見てみよう。

さらら: は〜い。。。。。。あ、普通にExcelが立ち上がって、前回見たのと同じスプレッドシートの画面になったわ。

【kajin2_XMLSS.xml】の表示
【kajin2_XMLSS.xml】の表示

たけち: そう。今までWindows上でXMLファイルをダブルクリックしたらInternet Explorerが立ち上がってXMLファイルを階層構造がわかるような表示がされたよね。

さらら: えぇ。。。

たけち: ところがこのXMLスプレッドシートの【kajin2_XMLSS.xml】、ダブルクリックするとExcelが立ち上がるんだよね。

さらら: えぇ。。。ということは、Excel本来のxsl・・・・じゃなかった、xls形式のファイルと変わらないんじゃないの?


■【kajin2_XMLSS.xml】の内容

たけち: そうだよね、とても似ているよね。でも、xls形式のファイルとの違いは、これがやっぱりXMLファイルだということなんだ。このことを確認してみるために、このファイルをテキストエディタで開いてみようね。

さらら: あっ、テキストエディタで開けるの?

たけち: XMLファイルだからね。

さらら: そっか。(^ ^;

たけち: ちょっと長いんだけどね。。。

XMLスプレッドシートの例 【kajin2_XMLSS.xml】

  1: <?xml version="1.0"?>
  2: <?mso-application progid="Excel.Sheet"?>
  3: <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  4:  xmlns:o="urn:schemas-microsoft-com:office:office"
  5:  xmlns:x="urn:schemas-microsoft-com:office:excel"
  6:  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  7:  xmlns:html="http://www.w3.org/TR/REC-html40"
  8:  xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml">
  9:  <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
 10:   <LastAuthor>TAKECHI</LastAuthor>
 11:   <Created>2004-04-22T08:44:17Z</Created>
 12:   <Version>11.5606</Version>
 13:  </DocumentProperties>
 14:  <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
 15:   <WindowHeight>6750</WindowHeight>
 16:   <WindowWidth>12780</WindowWidth>
 17:   <WindowTopX>240</WindowTopX>
 18:   <WindowTopY>75</WindowTopY>
 19:   <ProtectStructure>False</ProtectStructure>
 20:   <ProtectWindows>False</ProtectWindows>
 21:   <FutureVer>11</FutureVer>
 22:  </ExcelWorkbook>
 23:  <Styles>
 24:   <Style ss:ID="Default" ss:Name="Normal">
 25:    <Alignment ss:Vertical="Center"/>
 26:    <Borders/>
 27:    <Font ss:FontName="MS Pゴシック" x:CharSet="128" x:Family="Modern" ss:Size="11"/>
 28:    <Interior/>
 29:    <NumberFormat/>
 30:    <Protection/>
 31:   </Style>
 32:   <Style ss:ID="s21">
 33:    <Font ss:FontName="MS Pゴシック" x:CharSet="128" x:Family="Modern" ss:Size="11"
 34:     ss:Bold="1"/>
 35:   </Style>
 36:   <Style ss:ID="s22">
 37:    <NumberFormat/>
 38:   </Style>
 39:   <Style ss:ID="s23">
 40:    <NumberFormat ss:Format="@"/>
 41:   </Style>
 42:  </Styles>
 43:  <Worksheet ss:Name="kajin">
 44:   <Names>
 45:    <NamedRange ss:Name="_FilterDatabase" ss:RefersTo="=kajin!R1C1:R4C4"
 46:     ss:Hidden="1"/>
 47:   </Names>
 48:   <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="4" x:FullColumns="1"
 49:    x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="13.5">
 50:    <Column ss:Width="30.75"/>
 51:    <Column ss:Width="66"/>
 52:    <Column ss:Width="40.5"/>
 53:    <Column ss:Width="134.25"/>
 54:    <Row>
 55:     <Cell ss:StyleID="s21"><Data ss:Type="String">id</Data><NamedCell
 56:       ss:Name="_FilterDatabase"/></Cell>
 57:     <Cell ss:StyleID="s21"><Data ss:Type="String">name</Data><NamedCell
 58:       ss:Name="_FilterDatabase"/></Cell>
 59:     <Cell ss:StyleID="s21"><Data ss:Type="String">age</Data><NamedCell
 60:       ss:Name="_FilterDatabase"/></Cell>
 61:     <Cell ss:StyleID="s21"><Data ss:Type="String">address</Data><NamedCell
 62:       ss:Name="_FilterDatabase"/></Cell>
 63:    </Row>
 64:    <Row>
 65:     <Cell ss:StyleID="s22"><Data ss:Type="Number">1</Data><NamedCell
 66:       ss:Name="_FilterDatabase"/></Cell>
 67:     <Cell ss:StyleID="s23"><Data ss:Type="String">大伴家持</Data><NamedCell
 68:       ss:Name="_FilterDatabase"/></Cell>
 69:     <Cell ss:StyleID="s22"><Data ss:Type="Number">36</Data><NamedCell
 70:       ss:Name="_FilterDatabase"/></Cell>
 71:     <Cell ss:StyleID="s23"><Data ss:Type="String">yakamochi@example.com</Data><NamedCell
 72:       ss:Name="_FilterDatabase"/></Cell>
 73:    </Row>
 74:    <Row>
 75:     <Cell ss:StyleID="s22"><Data ss:Type="Number">2</Data><NamedCell
 76:       ss:Name="_FilterDatabase"/></Cell>
 77:     <Cell ss:StyleID="s23"><Data ss:Type="String">額田王</Data><NamedCell
 78:       ss:Name="_FilterDatabase"/></Cell>
 79:     <Cell ss:StyleID="s22"><Data ss:Type="Number">28</Data><NamedCell
 80:       ss:Name="_FilterDatabase"/></Cell>
 81:     <Cell ss:StyleID="s23"><Data ss:Type="String">nukata@example.com</Data><NamedCell
 82:       ss:Name="_FilterDatabase"/></Cell>
 83:    </Row>
 84:    <Row>
 85:     <Cell ss:StyleID="s22"><Data ss:Type="Number">3</Data><NamedCell
 86:       ss:Name="_FilterDatabase"/></Cell>
 87:     <Cell ss:StyleID="s23"><Data ss:Type="String">柿本人麻呂</Data><NamedCell
 88:       ss:Name="_FilterDatabase"/></Cell>
 89:     <Cell ss:StyleID="s22"><Data ss:Type="Number">45</Data><NamedCell
 90:       ss:Name="_FilterDatabase"/></Cell>
 91:     <Cell ss:StyleID="s23"><Data ss:Type="String">hitomaro@example.com</Data><NamedCell
 92:       ss:Name="_FilterDatabase"/></Cell>
 93:    </Row>
 94:   </Table>
 95:   <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
 96:    <PageSetup>
 97:     <Header x:Margin="0.51200000000000001"/>
 98:     <Footer x:Margin="0.51200000000000001"/>
 99:     <PageMargins x:Bottom="0.98399999999999999" x:Left="0.78700000000000003"
100:      x:Right="0.78700000000000003" x:Top="0.98399999999999999"/>
101:    </PageSetup>
102:    <Selected/>
103:    <Panes>
104:     <Pane>
105:      <Number>3</Number>
106:      <RangeSelection>R1C1:R5C4</RangeSelection>
107:     </Pane>
108:    </Panes>
109:    <ProtectObjects>False</ProtectObjects>
110:    <ProtectScenarios>False</ProtectScenarios>
111:   </WorksheetOptions>
112:  </Worksheet>
113:  <x2:MapInfo x2:HideInactiveListBorder="false">
114:   <x2:Schema x2:ID="Schema1" x2:Namespace="">
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
115: 	<xsd:element name="meibo" type="MeiboType">
116: 		<xsd:key name="person-id">
117: 			<xsd:selector xpath="person"/>
118: 			<xsd:field xpath="@id"/>
119: 		</xsd:key>
120: 	</xsd:element>
121: 	<xsd:complexType name="MeiboType">
122: 		<xsd:sequence>
123: 			<xsd:element ref="person" maxOccurs="unbounded"/>
124: 		</xsd:sequence>
125: 	</xsd:complexType>
126: 	<xsd:element name="person" type="PersonType"/>
127: 	<xsd:complexType name="PersonType">
128: 		<xsd:sequence>
129: 			<xsd:element name="name" type="xsd:string"/>
130: 			<xsd:element name="age" type="xsd:positiveInteger"/>
131: 			<xsd:element name="address" type="xsd:string"/>
132: 		</xsd:sequence>
133: 		<xsd:attribute name="id" type="xsd:positiveInteger" use="required"/>
134: 	</xsd:complexType>
135:    </xsd:schema>
       </x2:Schema>
136:   <x2:Map x2:ID="meibo_対応付け" x2:SchemaID="Schema1" x2:RootElement="meibo">
137:    <x2:Entry x2:Type="table" x2:ID="1" x2:ShowTotals="false">
138:     <x2:Range>kajin!R2C1:R4C4</x2:Range>
139:     <x2:HeaderRange>R1C1</x2:HeaderRange>
140:     <x:FilterOn>True</x:FilterOn>
141:     <x2:XPath>/meibo/person</x2:XPath>
142:     <x2:Field x2:ID="id">
143:      <x2:Range>RC</x2:Range>
144:      <x2:XPath>@id</x2:XPath>
145:      <x2:XSDType>positiveInteger</x2:XSDType>
146:      <ss:Cell>
147:      </ss:Cell>
148:      <x2:Aggregate>None</x2:Aggregate>
149:     </x2:Field>
150:     <x2:Field x2:ID="name">
151:      <x2:Range>RC[1]</x2:Range>
152:      <x2:XPath>name</x2:XPath>
153:      <x2:XSDType>string</x2:XSDType>
154:      <ss:Cell>
155:      </ss:Cell>
156:      <x2:Aggregate>None</x2:Aggregate>
157:     </x2:Field>
158:     <x2:Field x2:ID="age">
159:      <x2:Range>RC[2]</x2:Range>
160:      <x2:XPath>age</x2:XPath>
161:      <x2:XSDType>positiveInteger</x2:XSDType>
162:      <ss:Cell>
163:      </ss:Cell>
164:      <x2:Aggregate>None</x2:Aggregate>
165:     </x2:Field>
166:     <x2:Field x2:ID="address">
167:      <x2:Range>RC[3]</x2:Range>
168:      <x2:XPath>address</x2:XPath>
169:      <x2:XSDType>string</x2:XSDType>
170:      <ss:Cell>
171:      </ss:Cell>
172:      <x2:Aggregate>None</x2:Aggregate>
173:     </x2:Field>
174:    </x2:Entry>
175:   </x2:Map>
176:  </x2:MapInfo>
177: </Workbook>

さらら: なっ、長い・・・・・(^ ^; 何がどうなっているのか分かんないわ!!

たけち: そうなんだよね。ぼくも全部理解しているわけじゃないんだけれど、実際に必要なのはよく見るとわかる部分だけだから、そこだけ見てゆこうね。

さらら: そっ、そう? (^ ^*

たけち: 例えば、27行目あたりに「MS Pゴシック」と書いてあるということは、使う文字のフォントの種類だってわかるよね。

さらら: そういえば、そうね。

たけち: それから、114行目からは前回使ったXML Schemaがそのまま入っているよね。

さらら: あら、本当だわ。


■XMLスプレッドシート(XMLSS)形式が便利な場合

たけち: つまりこのXMLスプレッドシート(XMLSS)形式のファイルというのは、Excel本来のxls形式に準じるような多くの情報をXMLとして保存し、そしてまたxls形式と同様にアイコンをダブルクリックすればExcelが立ち上がるようなファイル形式なんだ。

さらら: なるほど、そうなのね! でも、こんな複雑なXMLファイルって使い道があるのかしら? 要はxls形式に準じるような情報がXMLの形になっただけでしょ。XMLとして使うなら前回のXMLデータファイルの方が便利そうだし。

たけち: 必ずしもそうとは言えないよ。例えば今までのファイルにデータを追加することを考えてみようか。XMLデータとして保存されていた場合は、いったんExcelを立ち上げて、XML Schema情報をもとに形を規定し、XMLデータを読み込み、それから追加データを入力し、最後にXMLデータとして保存しないといけないよね。

さらら: そうね。XMLファイルととxlsファイルでは形式が違うものね。

たけち: ところがXMLスプレッドシート(XMLSS)形式は、この形式のファイルをダブルクリックしてExcelを立ち上げ、追加データを入力してから、上書き保存してしまえばそれで終了なんだよね。つまりxls形式と同様の易しさで使えるんだよ。

さらら: それって、たいした手間の違いじゃないんじゃないの?

たけち: う〜ん。それは、さららがパソコンに慣れてきたせいだよね。

さらら: えへっ (^ ^;

たけち: ところが世の中はそう思う人ばかりじゃないんだ。例えば、さららのお付の女官にデータを入力してもらおうと思ったら、XMLデータを扱うような手間をとってもらえるかな?

さらら: う〜ん、ちょっと大変だわね。パソコンに詳しくなさそうだし・・・・・

たけち: そうだよね。世の中はパソコンに詳しい人ばかりとは限らないし、みんな忙しいし。。。だから、立ち上げにデータのファイルをダブルクリックすればいいだけなのか、そうでないのかは大きな違いだね。

さらら: なるほど。でも、どんな使い方があるのかしら?

たけち: そうだね、例えば組織が出しているWebページを考えてみようか。

さらら: えぇ。

たけち: 例えばさららが、この国の法律や国からのお知らせ情報を扱ったWebページを作ったとするよね。最初はさららがデザインしてもいいかもしれないね。ところがそういう情報は、どんどん増えたり、廃止されたり、変更されたりするよね。そういう情報が追加・変更・廃止されるたびに、さららがエディタでHTMLファイルを書き換えていたら大変だよね。

さらら: それはそうだわ。不比等(ふひと)ならやれるだろうけど、彼って忙しいから・・・

たけち: えっ?

さらら: あっ、独り言(^ ^;

たけち: このようなWebページ内のデータを追加・変更・削除ができれば良くって、他に用途を想定していない場合ってあるよね。そんな時には、Excelでデータを追加・変更・削除すれば、Webページが変更できるようにするといいよね。そうすると、さららが自分でやらなくってもいいよね。

さらら: えぇ。それは分かるけど。

たけち: さっきのExcelのXMLスプレッドシート(XMLSS)形式のファイルと、XSLTを組み合わせればいいんだよ。

さらら: あ、そうか! ExcelとXSLTを組み合わせてWebページを作るのね。

たけち: そういうことだね。じゃあ、次回は、実際に【kajin2_XMLSS.xml】を使ってXSLTでHTMLに変換してみよう。。

さらら: あっ、はい。 (^ ^* 

→次回はXMLスプレッドシート(XMLSS)形式 (2)です。 (^ ^;


このコーナーは、TAKABEさま(XSLT登竜門)の全面的なご協力をいただいて作成しています。