web-dev-qa-db-ja.com

16進コードからのApache POI XSSFColor

セルの前景色を16進コードの特定の色に設定したい。たとえば、赤に設定しようとすると:

style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());

デコード関数のパラメーターに設定した16進値に関係なく、getIndexed関数は常に黒色を返します。

何か間違ったことをしている可能性がありますか?バグだと思いますが、よくわかりません...

35
Neets

良いニュースは、HSSFではなくXSSFを使用している場合、問題の解決は非常に簡単です。スタイル変数をXSSFCellStyleにキャストするだけです。使用する場合、XSSFColor引数を取るsetFillForegroundColorのバージョンがあるため、getIndexed()を呼び出す必要はありません。コードの例を次に示します。

XSSFCellStyle style = (XSSFCellStyle)cell.getCellStyle();
XSSFColor myColor = new XSSFColor(Color.RED);
style.setFillForegroundColor(myColor);

ただし、HSSFを使用している場合は、事態はさらに難しくなります。 HSSFは、単に色の配列であるカラーパレットを使用します。 setFillForegroundColorに渡す短い値は、パレットへのインデックスです。

あなたが持っている問題は、rgb値をパレットインデックスに変換することです。 getIndexed()を使用して提案したソリューションは論理的ですが、残念ながら、XSSFColorに対しては想定どおりに機能します。

幸いなことに、解決策があります。とりあえず、カスタムカラーを使用するのではなく、デフォルトパレットの色の1つを使用して満足すると仮定します。その場合、HSSFPaletteクラスとHSSFColorクラスを使用して問題を解決できます。コードの例を次に示します。

HSSFWorkbook hwb = new HSSFWorkbook();
HSSFPalette palette = hwb.getCustomPalette();
// get the color which most closely matches the color you want to use
HSSFColor myColor = palette.findSimilarColor(255, 0, 0);
// get the palette index of that color 
short palIndex = myColor.getIndex();
// code to get the style for the cell goes here
style.setFillForegroundColor(palIndex);

デフォルトのパレットにないカスタムカラーを使用する場合は、それらをパレットに追加する必要があります。 HSSFPaletteのjavadocは、そのために使用できるメソッドを定義します。

87

4.0より前のApache POIの場合、次のことを簡単に行うことができます。

 XSSFColor grey = new XSSFColor(new Java.awt.Color(192,192,192));
 cellStyle.setFillForegroundColor(grey);

POI 4.0以降、ワークベンチIndexedColorMapを提供する必要があります。

 IndexedColorMap colorMap = workbook.getStylesSource().getIndexedColors();
 XSSFColor grey = new XSSFColor(new Java.awt.Color(192,192,192), colorMap);
 cellStyle.setFillForegroundColor(grey);
20
TheByeByeMan

XSSFColorにはXSSFWorkbookを使用します。 XSSFColorbyte[] rgbまたはJava.awt.Color。以下の例を参照してください。

  1. XSSFWorkbook wb = new XSSFWorkbook();
    XSSFCellStyle cellStyle = wb.createCellStyle();
    byte[] rgb = new byte[3];
    rgb[0] = (byte) 242; // red
    rgb[1] = (byte) 220; // green
    rgb[2] = (byte) 219; // blue
    XSSFColor myColor = new XSSFColor(rgb); // #f2dcdb
    cellStyle.setFillForegroundColor(myColor);
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
    
  2. guenSevenの回答をご覧ください

    XSSFColor myColor = new XSSFColor(new Java.awt.Color(242, 220, 219)); // #f2dcdb
    cellStyle.setFillForegroundColor(myColor);
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
    
16
Jonathan L

私はAWT Colorを使いたくありませんでしたし、最近ではバイト配列のみを受け入れるコンストラクターがないため(バージョン3.17を使用しています):コンストラクターpublic XSSFColor(byte[] rgb, IndexedColorMap colorMap)があります。 :

byte[] byteColor = new byte[]{255,0,0};
XSSFColor color = new XSSFColor(byteColor, null);
0
lher

XSSFCellStyleは、3.07を超えるpoiバージョンのメソッドsetFillForegroundColorで色を受け入れます...したがって、最初にバージョンを確認して、直面している問題が発生しないようにします...前のバージョンは引数として短く必要でした。

0
Fabrice Khedadi