Excelの条件付き書式をExcel経由ではなく、XMLを直接いじって編集したくなり、ここ2週間ほどみっちと取り組んだ。
Open XML形式
Excel 2013以降は、Open XMLと呼ばれる規格が一般公開されている規格を使用して、データが維持・保存されるようになっている。
「.xlsx」の拡張子を「.zip」に変更して解凍するとXMLファイルの山がでてくる。つまり、XLSXは、XMLを一塊にしてZip圧縮したものといえる。
Excelシートの保存場所
Zipを解凍して、「xl\worksheets\」配下に、Sheet1.xmlのように1シート1XMLファイルで定義されている。
条件付き書式も、このファイルの末尾で定義されている。
条件付き書式
条件付き書式は大きき2種類の定義で構成されている。
- 条件付き書式を適用するセル範囲と適用する条件(5より大きい場合etc)定義
- 条件に当てはまったときにセルに適用する書式(背景色や文字色etc)
1の適用範囲と適用条件については、Excelシート「xl\worksheets\Sheet1.xml」のファイルで定義され、2の書式については、「xl\styles.xml」で定義される。
条件付き書式の適用範囲と適用条件の定義
XMLのルート直下で、<conditionalFormatting>タグで定義されます。ルート直下に、条件付き書式1つにつき、1つの<conditionalFormatting>……</conditionalFormatting>で定義されます。
<conditionalFormatting>の属性、sqrefで条件付き書式の適用範囲が定義されます。
<conditionalFormatting sqref="A1:D45">
<conditionalFormatting sqref="A1:D45 R4:U40">
上記のように範囲が定義され、複数の範囲を定義する場合には、半角スペースで区切る。
適用条件は、<conditionalFormatting>の子要素<cfRule>で定義される。<cfRule>の属性では、条件種類(type)、書式番号(dxfId)、優先順位(priority)が定義される。優先順位と条件種類は必ず定義されるが、書式番号は条件種類や書式未設定の場合には、定義されない。
<cfRule>は、次の種類のケースがある。
<cfRule>……………</cfRule>
<cfRule />
子要素がある場合と、子要素が無い場合の2パターンである。
<cfRule>の属性は次のようなケースがある。
<cfRule type = "hogehoge" dxfId = "3" priority = "5">……………</cfRule>
<cfRule type = "hogehoge" priority = "5">
typeで重複チェックなどが指定されると自動的に書式がさだまるので、dxfIdは指定されない。
条件付き書式の適用範囲は、各シート毎で記述される。
条件付き書式の書式の定義
条件付き書式の書式は、XMLのルート直下で、<dxfs>……………</dxfs>の間に定義される。個々の定義は、<dxf>で記述される。<dxf>で書式(背景色や文字色etc)を定義するが、書式番号は定義されていない。<dxf>の上からの順番で、1,2,3のように扱われる。
条件付き書式の定義で、dxfIdで示される。dxfId = "12" と記載されていると、<dxfs>タグの上から数えて12番を示す。条件付き書式の書式定義は全シート共通で、styles.xmlで定義される。
例えば、シート1でdxfIdが1,3,4,7とあり、シート2でdxfIdが2,5,6などとExcelファイル内で一意の連番がふられ、それの参照先は一ファイルで、ファイルの上から数えて何番目かで判定される。