Office2007で採用されているOpenXML形式についての解説。今回はExcel2007でのxlsx形式で
文字列がどのように扱われるかについてです。(※Word 2007のdocx形式では文字列はプールされません)
xlsxファイルを動的に書き出す場合、要件として数値や文字列を動的に書き出す必要があると思います。
数値の書き出しは比較的簡単なのですが、xlsx形式では文字列は/xl/sharedStrings.xmlファイルでプールされ
共有されるため非常に扱いにくくなっています。
文字列のプール、sharedStrings.xmlファイル
xlsx形式でブックを保存し、拡張子をzipに変更して解凍します。
解凍したフォルダの/xl/sharedStrings.xmlが文字列のプールとなるファイルです。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
count="1" uniqueCount="1">
<si>
<t>凪瀬悠輝</t>
<rPh sb="0" eb="2">
<t>ナギセ</t>
</rPh>
<rPh sb="2" eb="4">
<t>ユウキ</t>
</rPh>
<phoneticPr fontId="1" />
</si>
</sst>
Excel2007によって生成されるxmlファイルは改行やインデントがないので見やすいようにフォーマットしてあります。
si要素が文字列を表します。rPh要素はIME変換の情報でなくても構いません。t要素が実際の文字列の値ですね。
ワークシートsheetX.xmlファイル
これに対してExcelのワークシート側のファイル(/xl/worksheets/sheet1.xml)では
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet
xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<dimension ref="A1" />
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0">
<selection activeCell="A2" sqref="A2" />
</sheetView>
</sheetViews>
<sheetFormatPr defaultRowHeight="13.5" />
<sheetData>
<row r="1" spans="1:1">
<c r="A1" t="s">
<v>0</v>
</c>
</row>
</sheetData>
<phoneticPr fontId="1" />
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75"
header="0.3" footer="0.3" />
</worksheet>
といった記述になります。c要素がセルを表しており、r属性がExcel上での座標、t属性に"s"が設定されると
そのセルは文字列を値として取るという意味になります。数値項目の場合などはt属性はつきません。
そして、c要素の子要素であるv要素で実際の値を設定します。
文字列を設定する場合はsharedStrings.xml内のsi要素のインデックスを指定します。
そう、IDなどではなく、インデックスで指定しなければなりません。
インデックス指定の悪夢
文字列プールはブック全体で単一ですから、複数のシートがある場合、
各シートで用いる文字列をすべてsharedStrings.xmlに書き出す必要があります。
出力する行数が動的に変化する場合、例えばシート1で30行の出力を行い、
シート2で20行の出力をするなら、シート2ではシート1で利用した文字列のインデックスに加え
シート2でのインデックスを加味してsharedStrings.xml上の文字列のインデックスを算出しなければなりません。
このため、動的な文字列出力が非常に困難になっています。
なお、Excel2003でのxml形式での出力の場合は、文字列はそのままセルの値として書き出していました。
sharedStrings.xmlによるプール方式になったのはExcel2007からです。
国際化対応?いや、そんな機能はない
Microsoftから
Microsoft Office (2007) Open XML ファイル形式の概要というドキュメントが出されています。
ここではこの文字列プールについて以下のような記述があります。
このプロセスによって Excel XML 形式が最適化されると同時に、興味深いコンテンツ操作ソリューションが新たに実現します。多国籍企業の開発者は、共有文字列テーブルを使用して、多言語サポートを提供することができます。サポートされる言語ごとに異なるブックを作成する代わりに、1 つのブックで個々の言語に対応する文字列テーブルを使用することができます。また、文字列テーブルを使用して、ブックの集合内でキーワードを検索することもできます。テキストのみで構成された、文字列の 1 つの XML ドキュメントを処理する方が、多数のワークシートとブックで Excel オブジェクト モデルを操作するよりも、時間がかからず容易です。
なるほど、文字列を単一ファイルに集約することで、多言語対応が可能になるというのです。
確かに、システム構築する際に文字列を単一ファイルに集約して言語の切り替えを実装することがあります。
それと同じ機能性か―!
って、ちょっとまってください。Excelに言語の切り替え機能なんてそもそもありますか?
例えばこのExcelファイルはen、jpで提供されます、好きな言語で表示することができます、といった機能がありますか?
文字列プール方式で設計した人は多言語対応のようなことを構想していたかもしれませんが、
そのような機能が実際に提供されない以上は絵にかいた餅にすぎません。
また、例え多言語対応を構想していたとしても、文字列を要素のインデックスで扱う必然性はありません。
このようなフォーマットではExcelを用いたソリューションは実装に際して、また、
保守の際に工数がかさむため、積極的に採用しにくいものとなっています。
投稿日時 : 2008年1月25日 15:14