<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>OpenXML</title><link>http://blogs.wankuma.com/nagise/category/1625.aspx</link><description>OpenXML</description><managingEditor>凪瀬</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>凪瀬</dc:creator><title>IE上でExcelを開くとWebDAVで通信しにいく？</title><link>http://blogs.wankuma.com/nagise/archive/2008/06/09/142397.aspx</link><pubDate>Mon, 09 Jun 2008 17:29:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/06/09/142397.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/142397.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/06/09/142397.aspx#Feedback</comments><slash:comments>241</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/142397.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/142397.aspx</trackback:ping><description>&lt;p&gt;仕事で遭遇した現象なのですが、何か情報をお持ちの方はいらっしゃいませんでしょうか？&lt;/p&gt;

&lt;h4&gt;環境&lt;/h4&gt;

&lt;p&gt;クライアント&lt;ul&gt;
&lt;li&gt;Windows Vista Business SP1
&lt;li&gt;Internet Explorer 7.0
&lt;li&gt;Office2007
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;サーバ&lt;ul&gt;
&lt;li&gt;RedHat機およびWindows機で現象確認
&lt;li&gt;Tomcat 5.5
&lt;/ul&gt;&lt;/p&gt;

&lt;h4&gt;手順&lt;/h4&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;サーバに拡張子".xls"のファイルを置く。
&lt;li&gt;該当ファイルをIE上から「開く」。このときローカルに保存せず、ExcelのIEプラグインで開くようにする
&lt;/ul&gt;&lt;/p&gt;

&lt;h4&gt;現象&lt;/h4&gt;

&lt;p&gt;最初のxlsファイルのリクエストに201 OK の応答をしたのち、クライアント側からWebDAVのコマンドであるPROPFINDメソッドがサーバ側に送られます。
HTTPのOPTIONSメソッドが事前に呼ばれることもありますが、キャッシュされるのか複数回試していると呼ばれなくなるようです。&lt;/p&gt;

&lt;p&gt;この際、サーバ側で認証が掛かっており、PROPFINDコマンドに401 Unauthorized 返答がされていると、Excelファイルを開くことができません。最初の201の後に、もう一度WebDAVで取り直しに行くような挙動を示します。&lt;/p&gt;

&lt;p&gt;WindowsXP, Office2003の環境下から同様にアクセスした場合は、OPTIONSメソッドがサーバに送信されることが確認できますが、PROPFINDの送信は行われないようです。WindowsXP, Office2007の環境が用意できず、そちらは確認できていません。&lt;/p&gt;

&lt;p&gt;保存してからExcelファイルを開いた場合や、Firefoxの場合ではこれらのリクエストが投げられることはありません。IE上でExcelを開く場合のみの現象です。&lt;/p&gt;

&lt;p&gt;私の手元の環境下ではxlsxファイルの場合、IEがzipファイル扱いしてIE上で開くことができませんでした。ContentTypeに"application/vnd.ms-excel"を指定しています。&lt;/p&gt;

&lt;h4&gt;何のための機能なのか？&lt;/h4&gt;

&lt;p&gt;WebDAVはMicrosoftが推しているわけですし、ExcelはOA化には貢献したけどもIT化を阻害しているということから、
そこを打開するための仕込みなのかなぁ、と漠然と考えています。&lt;/p&gt;

&lt;p&gt;WebDAVでファイルを取得しなおすことで、Excelファイルをサーバサイドで一元管理するようなシステムを作ろうと企んでいるのかなぁ？&lt;/p&gt;

&lt;p&gt;しかし、そう考えるとOffice2007形式だとそもそも開くことすらできないというのが腑に落ちません。私のマシンの設定が妙なことになっているだけという可能性も考えられますが。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/142397.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>【OpenXML】行・列が可変なExcelシートの出力を阻むr属性</title><link>http://blogs.wankuma.com/nagise/archive/2008/01/29/119844.aspx</link><pubDate>Tue, 29 Jan 2008 17:29:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/01/29/119844.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/119844.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/01/29/119844.aspx#Feedback</comments><slash:comments>1881</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/119844.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/119844.aspx</trackback:ping><description>&lt;p&gt;システムからのExcelの動的出力では行・列が可変のものが多いと思いますが、
このようなExcelファイルはOpenXML形式での出力は容易ではありません。&lt;/p&gt;

&lt;h4&gt;セルの必須属性で座標が必要&lt;/h4&gt;

&lt;p&gt;セルはc要素で表現されますが、必須属性としてr属性があります。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&amp;lt;sheetData&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;row r="1" spans="1:1"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;c &lt;strong&gt;r="A1"&lt;/strong&gt; t="s"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;v&amp;gt;0&amp;lt;/v&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/c&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/row&amp;gt;&lt;br&gt;
&amp;lt;/sheetData&amp;gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;単一のセルに&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/01/25/119214.aspx"&gt;インデックス0の文字列&lt;/a&gt;が
表示される簡単な例なのですが、c要素にあるr属性に注目してください。&lt;strong&gt;A1と書いてあります&lt;/strong&gt;ね。&lt;/p&gt;

&lt;p&gt;このA1はExcelの座標系のA1です。&lt;strong&gt;A列1行目のA1です。これが必須属性となっている&lt;/strong&gt;のです。&lt;/p&gt;

&lt;p&gt;つまり、行や列を可変にしたい場合、インデックスがずれる個所はすべてr属性を適切に書き直さなくてはなりません。
ヘッダ＋可変の明細＋フッタという構成の場合、もれなくフッタのセルのr属性も動的に調整する必要があります。&lt;/p&gt;

&lt;h4&gt;ExcelのX座標は26進数ではない&lt;/h4&gt;

&lt;p&gt;Excelの横方向の座標はAから始まり、Zまで行くと次はAAと二桁になります。
Excel2007では横方向に扱える列数が増えたため、ZZを越えてAAA列も存在します。&lt;/p&gt;

&lt;p&gt;このアルファベットによる列表現は一見して26進数のように思えるかもしれません。
しかし、実際には26進数とはならないのです。つまり、&lt;strong&gt;Aは0ではない&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;Aは0ではなく、1を表します。ですから、二桁になるとAAというように、上位桁がAになりますね。
もし、Aが0を表現するのであれば、Zの次はBAになるはずです。&lt;/p&gt;

&lt;p&gt;この点は10進数表現からの変換の際にはまりやすいところなので注意してください。&lt;/p&gt;

&lt;h4&gt;X座標すべてがアルファベット表記ではない&lt;/h4&gt;

&lt;p&gt;X座標が全てアルファベット表記なのかというとそうでもなく、
たとえば列の横幅を設定するcol要素などでは、&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&amp;lt;col &lt;strong&gt;min="1" max="3"&lt;/strong&gt; width="14.625" customWidth="1" /&amp;gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;といったように、10進数表記で範囲指定がされていたりします。&lt;/p&gt;

&lt;h4&gt;Excel 2003でのXML出力では&lt;/h4&gt;

&lt;p&gt;参考までにExcel 2003でXML出力した場合のタグ構造も取り上げておきます。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&amp;lt;Row&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Cell ss:StyleID="s1"&amp;gt;&amp;lt;Data ss:Type="String"&amp;gt;Hoge&amp;lt;/Data&amp;gt;&amp;lt;/Cell&amp;gt;&lt;br&gt;
&amp;lt;/Row&amp;gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;行を表すRow要素にセルを表すCell要素がぶら下がる形となっています。
座標は要素のインデックスで決まり、絶対座標を記述するr属性のようなものはありません。&lt;/p&gt;

&lt;p&gt;可変な行・列を持つExcelファイルの出力はExcel 2003形式で行う方が遥かに容易に行えます。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/119844.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>【OpenXML】Excelでは計算結果がキャッシュされている</title><link>http://blogs.wankuma.com/nagise/archive/2008/01/25/119276.aspx</link><pubDate>Fri, 25 Jan 2008 18:02:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/01/25/119276.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/119276.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/01/25/119276.aspx#Feedback</comments><slash:comments>30</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/119276.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/119276.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/01/25/119214.aspx"&gt;
Excel 2007では文字列はプールされブック全体で共有される&lt;/a&gt;ではxlsxファイル内で
文字列が/xl/sharedStrings.xmlファイルにプールされ、共有されることについて解説しましたが、
実は一部に例外があります。&lt;/p&gt;

&lt;h4&gt;グラフに使われる文字列はキャッシュされる&lt;/h4&gt;

&lt;p&gt;Excel上でのグラフは/xl/charts/chartX.xmlによって記述されます(Xは1からはじまり、グラフごとに1つ作られる)。&lt;/p&gt;

&lt;p&gt;chartX.xmlを開くとわかりますが、&amp;lt;c:strCache&amp;gt;や&amp;lt;c:numCache&amp;gt;といった要素で
ラベルに使われる文字列や、グラフの参照先のデータのキャッシュなどが残されています。&lt;/p&gt;

&lt;p&gt;このため、動的に書き出したデータを元にグラフを描画したい場合、
参照先のExcelシートの値を編集しただけではキャッシュの値が表示され、
うまくグラフを描画することができません。&lt;/p&gt;

&lt;p&gt;数値やラベル名などが動的に変更される場合、これら&amp;lt;c:strCache&amp;gt;と&amp;lt;c:numCache&amp;gt;は
あらかじめchartX.xmlから削除しておきましょう。
キャッシュが存在しなければ実データを参照してくれます。&lt;/p&gt;

&lt;h4&gt;計算式で別のセルの値を参照した場合、値がキャッシュされる&lt;/h4&gt;

&lt;p&gt;通常のワークシート内でも計算式がある場合、計算結果がキャッシュされます。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&amp;lt;c r="B1" t="str"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;f&amp;gt;A1&amp;lt;/f&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;v&amp;gt;Hoge&amp;lt;/v&amp;gt;&lt;br&gt;
&amp;lt;/c&amp;gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;f要素が計算式ですね。今の場合はB1セルに"=A1"という単純な計算式を入れています。
A1セルには文字列"Hoge"があり、これはsharedStrings.xmlに格納されています。&lt;/p&gt;

&lt;p&gt;数値でも文字列でもそうなのですが、計算結果はキャッシュとしてv要素で保管されます。
このv要素は必須ではないので、動的に書き出したxlsxファイルで表計算を用いる場合、
あらかじめv要素を除去しておく必要があります。&lt;/p&gt;

&lt;h4&gt;言語の切り替えは容易ではない&lt;/h4&gt;

&lt;p&gt;Excel 2007が生成するxlsxファイルではこれらのキャッシュがしっかりと作られるため、
テンプレートとして使う場合はこれらのキャッシュの除去を最初に行う必要があります。&lt;/p&gt;

&lt;p&gt;sharedStrings.xmlさえ切り替えれば簡単に言語が切り換えられるような気がしますが、
実際にはこれらのキャッシュを除去しないと切り替えが行えません。&lt;/p&gt;

&lt;p&gt;システムとして動的に切り替えている場合はプログラムでなんとかするのでしょうが、
現実問題、zipで解凍してsharedStrings.xmlを差し替えてzipで圧縮するという手順では、
正しく文字列を切り替えられない場合があります。&lt;/p&gt;

&lt;h4&gt;保守フェーズにおける工数は多めに確保しましょう&lt;/h4&gt;

&lt;p&gt;xlsx形式はExcel 2007を用いて生成できるため、Excelで生成したxlsxファイルを
テンプレートに一部のデータを書き換えれば簡単にExcelファイルが作成できるように思うかもしれません。&lt;/p&gt;

&lt;p&gt;しかし、実際にはこれらキャッシュなどを除去するなどの工程が必要となるため、
フォーマットの修正は想像以上に工数を食います。
システムでテンプレートとして用いる場合は加工が必要ですからExcelで開いてちょっと修正、というわけにはいかないのです。&lt;/p&gt;

&lt;p&gt;文字列はインデックスで管理されていますので、うっかり文字列を挿入したりすると
全部のシートで文字列のインデックスが変更になるなどの影響があったりします。&lt;/p&gt;

&lt;p&gt;なお、セルのスタイルについてもIDではなくインデックスで管理されているため、
スタイルの修正も同様に大きく工数を取られることがあります。&lt;/p&gt;

&lt;p&gt;xlsx形式での出力は、フォーマットの保守性に難がありますので、
保守フェーズで頻繁に変更が想定される場合は相応の覚悟をしてください。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/119276.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>【OpenXML】Excel 2007では文字列はプールされブック全体で共有される</title><link>http://blogs.wankuma.com/nagise/archive/2008/01/25/119214.aspx</link><pubDate>Fri, 25 Jan 2008 15:14:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/01/25/119214.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/119214.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/01/25/119214.aspx#Feedback</comments><slash:comments>2363</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/119214.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/119214.aspx</trackback:ping><description>&lt;p&gt;Office2007で採用されているOpenXML形式についての解説。今回はExcel2007でのxlsx形式で
文字列がどのように扱われるかについてです。（※Word 2007のdocx形式では文字列はプールされません）&lt;/p&gt;

&lt;p&gt;xlsxファイルを動的に書き出す場合、要件として数値や文字列を動的に書き出す必要があると思います。
数値の書き出しは比較的簡単なのですが、xlsx形式では文字列は/xl/sharedStrings.xmlファイルでプールされ
共有されるため非常に扱いにくくなっています。&lt;/p&gt;

&lt;h4&gt;文字列のプール、sharedStrings.xmlファイル&lt;/h4&gt;

&lt;p&gt;xlsx形式でブックを保存し、拡張子をzipに変更して解凍します。
解凍したフォルダの/xl/sharedStrings.xmlが文字列のプールとなるファイルです。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;br&gt;
&amp;lt;sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"&lt;br&gt;
&amp;nbsp;&amp;nbsp;count="1" uniqueCount="1"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;si&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;t&amp;gt;凪瀬悠輝&amp;lt;/t&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;rPh sb="0" eb="2"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;t&amp;gt;ナギセ&amp;lt;/t&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/rPh&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;rPh sb="2" eb="4"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;t&amp;gt;ユウキ&amp;lt;/t&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/rPh&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;phoneticPr fontId="1" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/si&amp;gt;&lt;br&gt;
&amp;lt;/sst&amp;gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Excel2007によって生成されるxmlファイルは改行やインデントがないので見やすいようにフォーマットしてあります。&lt;/p&gt;
&lt;p&gt;si要素が文字列を表します。rPh要素はIME変換の情報でなくても構いません。t要素が実際の文字列の値ですね。&lt;/p&gt;

&lt;h4&gt;ワークシートsheetX.xmlファイル&lt;/h4&gt;

&lt;p&gt;これに対してExcelのワークシート側のファイル(/xl/worksheets/sheet1.xml)では&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;br&gt;
&amp;lt;worksheet&lt;br&gt;
&amp;nbsp;&amp;nbsp;xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"&lt;br&gt;
&amp;nbsp;&amp;nbsp;xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;dimension ref="A1" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;sheetViews&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;sheetView tabSelected="1" workbookViewId="0"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;selection activeCell="A2" sqref="A2" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/sheetView&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/sheetViews&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;sheetFormatPr defaultRowHeight="13.5" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;sheetData&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;row r="1" spans="1:1"&amp;gt;&lt;br&gt;
&lt;strong&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;c r="A1" t="s"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;v&amp;gt;0&amp;lt;/v&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/c&amp;gt;&lt;br&gt;
&lt;/strong&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/row&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/sheetData&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;phoneticPr fontId="1" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;header="0.3" footer="0.3" /&amp;gt;&lt;br&gt;
&amp;lt;/worksheet&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;といった記述になります。c要素がセルを表しており、r属性がExcel上での座標、t属性に"s"が設定されると
そのセルは文字列を値として取るという意味になります。数値項目の場合などはt属性はつきません。&lt;/p&gt;

&lt;p&gt;そして、c要素の子要素であるv要素で実際の値を設定します。
&lt;strong&gt;文字列を設定する場合はsharedStrings.xml内のsi要素のインデックスを指定&lt;/strong&gt;します。
そう、IDなどではなく、インデックスで指定しなければなりません。&lt;/p&gt;

&lt;h4&gt;インデックス指定の悪夢&lt;/h4&gt;

&lt;p&gt;文字列プールはブック全体で単一ですから、複数のシートがある場合、
各シートで用いる文字列をすべてsharedStrings.xmlに書き出す必要があります。&lt;/p&gt;

&lt;p&gt;出力する行数が動的に変化する場合、例えばシート1で30行の出力を行い、
シート2で20行の出力をするなら、シート2ではシート1で利用した文字列のインデックスに加え
シート2でのインデックスを加味してsharedStrings.xml上の文字列のインデックスを算出しなければなりません。&lt;/p&gt;

&lt;p&gt;このため、動的な文字列出力が非常に困難になっています。&lt;/p&gt;

&lt;p&gt;なお、Excel2003でのxml形式での出力の場合は、文字列はそのままセルの値として書き出していました。
sharedStrings.xmlによるプール方式になったのはExcel2007からです。&lt;/p&gt;

&lt;h4&gt;国際化対応？いや、そんな機能はない&lt;/h4&gt;

&lt;p&gt;Microsoftから&lt;a href="http://www.microsoft.com/japan/msdn/office/2007/ms406049.aspx"&gt;
Microsoft Office (2007) Open XML ファイル形式の概要&lt;/a&gt;というドキュメントが出されています。&lt;/p&gt;

&lt;p&gt;ここではこの文字列プールについて以下のような記述があります。&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
このプロセスによって Excel XML 形式が最適化されると同時に、興味深いコンテンツ操作ソリューションが新たに実現します。多国籍企業の開発者は、共有文字列テーブルを使用して、多言語サポートを提供することができます。サポートされる言語ごとに異なるブックを作成する代わりに、1 つのブックで個々の言語に対応する文字列テーブルを使用することができます。また、文字列テーブルを使用して、ブックの集合内でキーワードを検索することもできます。テキストのみで構成された、文字列の 1 つの XML ドキュメントを処理する方が、多数のワークシートとブックで Excel オブジェクト モデルを操作するよりも、時間がかからず容易です。
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;なるほど、文字列を単一ファイルに集約することで、多言語対応が可能になるというのです。
確かに、システム構築する際に文字列を単一ファイルに集約して言語の切り替えを実装することがあります。
それと同じ機能性か―！&lt;/p&gt;

&lt;p&gt;って、ちょっとまってください。Excelに言語の切り替え機能なんてそもそもありますか？
例えばこのExcelファイルはen、jpで提供されます、好きな言語で表示することができます、といった機能がありますか？&lt;/p&gt;

&lt;p&gt;文字列プール方式で設計した人は多言語対応のようなことを構想していたかもしれませんが、
そのような機能が実際に提供されない以上は絵にかいた餅にすぎません。&lt;/p&gt;

&lt;p&gt;また、例え多言語対応を構想していたとしても、文字列を要素のインデックスで扱う必然性はありません。
このようなフォーマットではExcelを用いたソリューションは実装に際して、また、
保守の際に工数がかさむため、積極的に採用しにくいものとなっています。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/119214.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>OpenXMLの角度はミリ分らしい</title><link>http://blogs.wankuma.com/nagise/archive/2008/01/24/119116.aspx</link><pubDate>Thu, 24 Jan 2008 22:47:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/01/24/119116.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/119116.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/01/24/119116.aspx#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/119116.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/119116.aspx</trackback:ping><description>&lt;p&gt;最近、Excel2007から採用されているOpenXMLフォーマットの動的出力機能を作ったりしています。&lt;/p&gt;
&lt;p&gt;このOpenXML、すでにISO標準のOpenDocumentという規格があるにもかかわらず、
Microsoftが独自に制定してECMAに標準として通したという曰くつきの代物なんですが、
技術的観点からしても、なかなか酷いフォーマットです。&lt;/p&gt;
&lt;p&gt;具体的に何が酷いかは今後何回かに分けてエントリを挙げていくつもりです。&lt;/p&gt;

&lt;h4&gt;グラフの軸の文字の傾きの設定&lt;/h4&gt;

&lt;p&gt;いきなりマニアックなセッティングで申し訳ないのですが、
グラフを書いた時に、軸の文字列を傾けて表示する機能があります。&lt;/p&gt;
&lt;img src="http://nagise.wankuma.com/image/Graph_01.png"&gt;
&lt;p&gt;横軸の日付が斜めに表示されているのが分かるでしょうか。
軸の書式設定 → 配置 → ユーザー設定の角度 で設定できます。&lt;/p&gt;
&lt;img src="http://nagise.wankuma.com/image/Graph_02.png"&gt;

&lt;p&gt;この部分のOpenXMLの記述は以下のとおり。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&amp;lt;c:txPr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;strong&gt;&amp;lt;a:bodyPr rot="-2700000" vert="horz" /&amp;gt;&lt;/strong&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;a:lstStyle /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;a:p&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a:pPr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a:defRPr sz="700" b="0" i="0" u="none"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strike="noStrike" baseline="0"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a:solidFill&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a:srgbClr val="000000" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/a:solidFill&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a:latin typeface="HGS創英角ｺﾞｼｯｸUB" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a:ea typeface="HGS創英角ｺﾞｼｯｸUB" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a:cs typeface="HGS創英角ｺﾞｼｯｸUB" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/a:defRPr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/a:pPr&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a:endParaRPr lang="ja-JP" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;/a:p&amp;gt;&lt;br&gt;
&amp;lt;/c:txPr&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;角度を表わすのはa:bodyPr要素のrot属性なのですが、-45度に対して数字は-2,700,000という値になっています。
1度あたり60,000という数値で、1度の60分の1である1分(いちふん。1'と記述する)あたり1000です。
角度を表わす単位としては「分」の60分の1の1秒(いちびょう。1"と記述する)というものもあり、
緯度経度などは秒単位で表現されますね。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E5%88%86_%28%E8%A7%92%E5%BA%A6%29"&gt;wikipedia&lt;/a&gt;によれば&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
分と秒が六十進法でありわかりにくいことから、度のみを用いて、度以下は小数によって値を示すことが好まれる。
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;とあります。度では精度が足りないのであれば、度の1000分の1などとするか、
もしくは、秒単位にすればよいのですが、Microsoftは分という半端な単位の1000分の1という珍妙な単位を選択したようです。
これを世界標準の規格に通そうというのですからたまりませんね。&lt;/p&gt;

&lt;p&gt;ともかく、OpenXMLでは角度をラジアンでもなく、度の1000分の1でもなく、秒でもなく
ミリ分という単位で扱っています。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/119116.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>