15

POI を使用する場合、Excel ドキュメントのセルとフォントには色情報が含まれており、常に RGB 値を返すとは限らず、インデックス値のみを提供することがよくあります。色を取得するには、インデックス付きの値を何かに対して検索する必要があります。HSSFWorkbook (xls) には、パレットを取得するために使用できるメソッドがあります。

InputStream in = new FileInputStream("sheet.xls");
HSSFWorkbook wb = new HSSFWorkbook(in);
wb.getCustomPalette();

XSSFWorkbook (xlsx) にアクセスする場合、そのようなメソッドはありません。実際、関連するクラスのどこにもパレット情報が見つかりません。XSSFont と Cell からインデックス値を取得できますが、色の「名前」まで取得する唯一の方法は、それを IndexedColors 列挙型と照合することです。これにより、同じ元の問題に戻ります。使用するRGB値はまだありません。

InputStream in = new FileInputStream("sheet.xlsx");
XSSFWorkbook wb = new XSSFWorkbook (in);
wb.getCustomPalette(); <-- fail!

次のように、CellStyle を介して XSSFColor を取得しています。

CellStyle style = cell.getCellStyle();
XSSFColor color = style.getFillBackgroundColorColor();

IndexedColors を介して色名を取得するには:

for (IndexedColors c : IndexedColors.values()) { if (c.index == indexColor){ System.out.println("Color: " + c.name()); } }

同様の質問:特定のセルの (Java Apache POI HSSF) 背景色を取得するにはどうすればよいですか?

参照: http://poi.apache.org/spreadsheet/quick-guide.html#CustomColors

更新 1:ようやく機能するものを見つけました。XSSFColor のこのメソッドは ARGB 16 進コードを返し、それを使用して RGB 値を (明らかに) 判別できます。これにより、同じ問題を抱えている人が x 時間節約できることを願っています。

((XSSFColor) color).getARGBHex())

更新 2:残念なことに、一部のセルが ARGBHex データを含む背景の XSSFColor を返さないことがわかりました。これに対する回避策を探しています。

4

3 に答える 3

10

を使用wb.getStylesSource()すると、StylesTableすべてのCellStyleオブジェクトを取得できる を取得できます。XSSFCellStyleAPI には、カラー オブジェクトを取得するためのメソッドがいくつもありますXSSFColor。API は、そのXSSFCellStyleスタイル内のすべてのフォント (つまり、そこからその特定のフォントのオブジェクトをXSSFFont再度取得できる) にもアクセスできます。XSSFColor

にアクセスするとXSSFColor、 を呼び出すとgetRGB()、RGB 値のバイト配列が返されます。

于 2013-08-07T19:44:24.047 に答える
1

注意すべきことの 1 つは、Excel が通常のセルの塗りつぶしパターンの前景と背景の意味を逆にすることです*。getFillForegroundColorColor()そのため、ソリッド パターン タイプのセルにこのメソッドを使用する必要があるかもしれません。

また、前の質問を読み返すと、範囲が 0..63 であるため、64 は有効なカラー インデックスではありません。インデックス 64 は、セルのデフォルトの前景色を示すために使用されます。

(*) 条件付き書式のセルでは、これは行われません!!

于 2013-08-08T14:42:50.837 に答える
1

ここで探しているものを正確に取得することはできません。HSSFPalette の同等の XSSF バージョンはありません。HSSFWorkbook で使用できる色の数が非常に限られているため、その必要はありません。あなたが提供したリンクで与えられた指示は、あなたが得る最も近いものです. XSSFColor オブジェクトを取得したら、 getRGB() の戻り値が意味する色をどのように把握するかを単純に尋ねる場合は、いつでもこれを参照できますRGB値を入力して色を表示できるWebサイト。色の名前を探している場合は、基本的に、色の既知のRGB値を保存し、いくつかの方法で色に最も近い独自のユーティリティを作成する必要がありますRGBを返しました。それが私ができる最善のことです。私は、この機能をすぐに使えるようにするものを知りません。

于 2013-08-07T20:22:04.523 に答える