Open XML SDK 備忘録

おもにExcelファイル (.xlsx) を扱います。

P-SPACE
就学奨励費システム

マイナンバー対応 特別支援教育 就学奨励費 支給業務支援システム

詳細...

P-SPACE
就学奨励費ソフトウェア

特別支援教育 就学奨励費 支給業務支援ソフトウェア

詳細...

開発室
(備忘録そのほか)

システム開発にまつわる(かもしれない)調査・実験結果など

詳細...

セルの書式設定 - その3

xfId属性

xfId属性にはセルのスタイル定義のID番号が指定されています。

上記のシートでセルB1の定義を確認すると、s属性の値は"1"となっています。

<x:sheetData>
【中略】
  <x:row r="1" spans="1:4" ht="19.5" thickBot="1" x14ac:dyDescent="0.45">
    <x:c r="B1" s="1" t="s">
      <x:v>0</x:v>
    </x:c>
    【中略】
  </x:row>
【中略】
</x:sheetData>

cellXfs要素の1番目(最初のxf要素を0として数えるので正しくは2番目)の xf要素(CellFormat) を確認すると、xfId属性は"3"となっています。

<x:xf numFmtId="0" fontId="4" fillId="4" borderId="0" xfId="3">
  <x:alignment vertical="center" />
</x:xf>

xfIdは /xl/style.xmlのcellStyleXfs要素における xf要素(CellFormat) のインデックス番号です。

cellStyleXfs要素の3番目のxf要素を見ると

<x:xf numFmtId="0" fontId="4" fillId="4" borderId="0" applyNumberFormat="0" applyBorder="0" applyAlignment="0" applyProtection="0">
  <x:alignment vertical="center" />
</x:xf>

となっています。

ここまででセルB1についてxf要素が2つ登場しました。一つは「cellXfs要素の子要素であるxf要素」で、もう一つは「cellStyleXfs 要素の子要素であるxf要素」です。

cellXfs要素はセルB1の書式をあらわしており、また cellStyleXfs要素はセルのスタイル定義の書式をあらわしています。

セルB1はセルのスタイルを適用したので、cellXfs要素だけでなく、cellStyleXfs要素の書式も同時に適用されます。
たまたま今回はいずれのxf要素とも「 numFmtId="0" fontId="4" fillId="4" borderId="0" 」となっていますが、
2つのxf要素の間で値が異なる場合は 「cellXfs要素の子要素であるxf要素」 が優先されます。

例えばセルのスタイルを適用した後にセルのB1についてフォントの色を赤にし、セル内容を右寄せにすると 「cellXfs要素の子要素としてのxf要素」 は以下のようになります

<x:xf numFmtId="0" fontId="9" fillId="4" borderId="0" xfId="3" applyFont="1" applyAlignment="1">
  <x:alignment horizontal="right" vertical="center" />
</x:xf>

結果としてセルB1については「 fontId="9" fillId="4" 」 「<x:alignment horizontal="right" vertical="center" />」が適用されることになります。

なお、このファイルに適用されている「セルのスタイル」の定義 は/xl/style.xmlのcellStyles要素にあります。

Excelでセルに「セルのスタイル」を適用すると、 それに対応するcellStyle要素が(Excelによって)追加されます。

セルのスタイル定義(cellStyle要素)はそれぞれxfId属性を持っています。xfId属性が"3"となっている要素は

<x:cellStyle name="どちらでもない" xfId="3" builtinId="28" />

となっており、スタイルの名前とbuiltinIdを知ることがわかります。

 「apply」で始まるxfの属性(applyFont, applyBorder等)は「そのxf要素において指定されたId属性(fontIdやborderId)が適用されるべきかどうか」を示す属性です。

これがExcel 2016によってどのように解釈されるのか、applyFont属性の値を変えながら実験してみました。

「cellXfs要素の子要素であるxf要素」 と 「cellStyleXfs 要素の子要素であるxf要素」 では 「cellXfs要素の子要素であるxf要素」 のほうが優先される、と書きましたが、
厳密にはapplyで始まる属性が同一の場合にのみ優先されるようです。

cellXfsのxf要素 cellStyleXfsのxf要素 適用されたフォント
applyFont="0" applyFont="0" cellXfsのxf要素のフォント
applyFont="1" applyFont="0" cellXfsのxf要素のフォント
applyFont="0" applyFont="1" cellStyleXfsのxf要素のフォント
applyFont="1" applyFont="1" cellXfsのxf要素のフォント