MZ Platformの機能開発記録

Excelファイルと色変換

MZ Platformは「Excelファイルアクセス」コンポーネントを提供しています。 このコンポーネントを用いると、Excelファイルからのデータ取得やExcelファイルの編集が可能です。 なお、MZ Platformではこの機能を実現するためにApache POIを利用しています。

Excelファイルアクセスコンポーネントを作成するときに色変換の課題が生じたので、それに関する作業記録を載せます。 コンポーネントを作成したときはPOIのバージョンが3.6だったので、そのときの情報に基づいています。 その後のバージョンアップで状況が変化する可能性もあるのでご留意ください。

Excel 2003と2007の色の違い

Excelは2003までと2007からで対象とする色の範囲に違いがあります。 【関連情報:Microsoftサポートより

下図は2003でのセルの塗りつぶし色を選択する画面です。 2003では、ここに見えている色からしか選択できません。 これは塗りつぶし色だけでなく、フォントの色と罫線の色でも同様です。 ただし、オートシェイプの図形の色はこの制限がなくて、RGBの範囲ですべての色が選択できます。

一方、下図は2007でのセルの塗りつぶし色を選択する画面です。 一番下に、「その他の色」とあって、こちらからRGBの範囲ですべての色が指定できます。 これはフォントと罫線でも同様です。

Excelは2003までと2007以降でファイル形式にも変更があります。 2003まではファイルの拡張子で「.xls」形式でしたが、2007からは「.xlsx」形式となっています。 2007以降で互換性を保って「.xls」形式として保存することは可能ですが、色については警告などが表示されず、 そのまま保存されるようです。結果として、2003で表現できない色がファイルに含まれている場合は、 「近い色」に変換されて表示されるようです。 ただし、この「近い色」がどのように決められているかは資料がないのでわかっていません。

POIで扱うファイル形式

POIでは、Excel 2003形式に対応するAPIとして「HSSF」を、2007形式に対応するAPIとして「XSSF」を提供しています。 また、これらの形式を統一して扱うためのAPIとして「SS」を提供しています。 MZのExcelファイルアクセスコンポーネントでは、内部的にSSを用いて両方のファイル形式を統一的に扱うことを選択しました。

そのため、MZのExcelファイルアクセスコンポーネントでExcelファイルの色にアクセスすると、 Excel 2003形式の色数に制限された色として扱うことしかできません。 (厳密に言うと、POIが扱える色の範囲に限定されるので、 2003形式で表現できるはずの色でも「近い色」に変換される場合があるかもしれません。)

これが問題となるのは、MZ側からExcelファイル内の色を設定するときです。 MZ側(Java)で表現できるRGBの色が与えられたとき、 Excelファイル(.xls)で表現できる限られた色のいずれかに変換する処理を記述する必要が生じたので、 次項に示すような色の距離計算と変換処理を実装しました。

なお、POIの開発経緯にも関係しますが、SSでは表データにアクセスする場合にほとんど問題ありませんが、 他にExcelファイルに含まれるデータ(画像・テキストボックス・図形)を扱うことに関してはまだ開発の余地があるようです。 POIでExcelファイルに画像とテキストボックスを配置することはできますが、 Excelファイルからの画像取得では位置が取れないという問題と、 テキストボックスのデータは取得できないという問題がありました。 また、図形の書き込みは一部可能という程度で、図形の取得はできないという問題がありました。 さらに、図形に関する機能はSSで部分的に未実装となっている場合があり、 MZのコンポーネント内で処理を分岐してHSSFとXSSFを用いた記述が必要なところもありました。 このような問題はPOIのバージョンが上がれば解決するのかもしれません。

以上のようにいろいろ制限はありますが、 MZでのコンポーネント開発では二種類のExcelファイル形式を統一的に扱うことができ、 表データへのアクセスに関して問題がないSSを選択して実装をしたという経緯です。

色の距離計算と変換

Javaで表現できる二種類の色について距離を計算し、POIで表現できる最も近い色に変換する処理について述べます。 色の距離計算にはCIELAB均等色空間の色差を用いて、下記の書籍を参考にしました。

参考文献:色彩工学入門,篠田,藤枝,森北出版,2007.

まずRGBの値を用いて、三刺激値XYZを求めるために次式を用います。 これは参考文献P186のsRGB値から三刺激値への変換となります。

続いて、CIELAB均等色空間での値を次式で求めます。 これらは参考文献P119およびP122の式となります。 ただし、(X0,Y0,Z0)は基準白色を(R,G,B)=(255,255,255)として、上式で計算した値を用います。

以上のような計算を、比較したい二色について実施して、その差を用いて色の距離を次式で計算します。 これは参考文献P123の式となります。

変換したい色が指定されたとき、POIが提供するすべての色について距離を計算し、 その距離が最も近い色で元の色を置き換えると色の変換となります。

作成日 2012-10-09

最終更新日 2012-10-09