Excel 2007では文字列はプールされブック全体で共有されるではxlsxファイル内で
文字列が/xl/sharedStrings.xmlファイルにプールされ、共有されることについて解説しましたが、
実は一部に例外があります。
グラフに使われる文字列はキャッシュされる
Excel上でのグラフは/xl/charts/chartX.xmlによって記述されます(Xは1からはじまり、グラフごとに1つ作られる)。
chartX.xmlを開くとわかりますが、<c:strCache>や<c:numCache>といった要素で
ラベルに使われる文字列や、グラフの参照先のデータのキャッシュなどが残されています。
このため、動的に書き出したデータを元にグラフを描画したい場合、
参照先のExcelシートの値を編集しただけではキャッシュの値が表示され、
うまくグラフを描画することができません。
数値やラベル名などが動的に変更される場合、これら<c:strCache>と<c:numCache>は
あらかじめchartX.xmlから削除しておきましょう。
キャッシュが存在しなければ実データを参照してくれます。
計算式で別のセルの値を参照した場合、値がキャッシュされる
通常のワークシート内でも計算式がある場合、計算結果がキャッシュされます。
<c r="B1" t="str">
<f>A1</f>
<v>Hoge</v>
</c>
f要素が計算式ですね。今の場合はB1セルに"=A1"という単純な計算式を入れています。
A1セルには文字列"Hoge"があり、これはsharedStrings.xmlに格納されています。
数値でも文字列でもそうなのですが、計算結果はキャッシュとしてv要素で保管されます。
このv要素は必須ではないので、動的に書き出したxlsxファイルで表計算を用いる場合、
あらかじめv要素を除去しておく必要があります。
言語の切り替えは容易ではない
Excel 2007が生成するxlsxファイルではこれらのキャッシュがしっかりと作られるため、
テンプレートとして使う場合はこれらのキャッシュの除去を最初に行う必要があります。
sharedStrings.xmlさえ切り替えれば簡単に言語が切り換えられるような気がしますが、
実際にはこれらのキャッシュを除去しないと切り替えが行えません。
システムとして動的に切り替えている場合はプログラムでなんとかするのでしょうが、
現実問題、zipで解凍してsharedStrings.xmlを差し替えてzipで圧縮するという手順では、
正しく文字列を切り替えられない場合があります。
保守フェーズにおける工数は多めに確保しましょう
xlsx形式はExcel 2007を用いて生成できるため、Excelで生成したxlsxファイルを
テンプレートに一部のデータを書き換えれば簡単にExcelファイルが作成できるように思うかもしれません。
しかし、実際にはこれらキャッシュなどを除去するなどの工程が必要となるため、
フォーマットの修正は想像以上に工数を食います。
システムでテンプレートとして用いる場合は加工が必要ですからExcelで開いてちょっと修正、というわけにはいかないのです。
文字列はインデックスで管理されていますので、うっかり文字列を挿入したりすると
全部のシートで文字列のインデックスが変更になるなどの影響があったりします。
なお、セルのスタイルについてもIDではなくインデックスで管理されているため、
スタイルの修正も同様に大きく工数を取られることがあります。
xlsx形式での出力は、フォーマットの保守性に難がありますので、
保守フェーズで頻繁に変更が想定される場合は相応の覚悟をしてください。
投稿日時 : 2008年1月25日 18:02