セルの前景色を16進コードの特定の色に設定したい。たとえば、赤に設定しようとすると:
style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());
デコード関数のパラメーターに設定した16進値に関係なく、getIndexed関数は常に黒色を返します。
何か間違ったことをしている可能性がありますか?バグだと思いますが、よくわかりません...
良いニュースは、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は、そのために使用できるメソッドを定義します。
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);
XSSFColor
にはXSSFWorkbook
を使用します。 XSSFColor
はbyte[] rgb
またはJava.awt.Color
。以下の例を参照してください。
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);
guenSevenの回答をご覧ください
XSSFColor myColor = new XSSFColor(new Java.awt.Color(242, 220, 219)); // #f2dcdb
cellStyle.setFillForegroundColor(myColor);
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
私はAWT Colorを使いたくありませんでしたし、最近ではバイト配列のみを受け入れるコンストラクターがないため(バージョン3.17を使用しています):コンストラクターpublic XSSFColor(byte[] rgb, IndexedColorMap colorMap)
があります。 :
byte[] byteColor = new byte[]{255,0,0};
XSSFColor color = new XSSFColor(byteColor, null);
XSSFCellStyleは、3.07を超えるpoiバージョンのメソッドsetFillForegroundColorで色を受け入れます...したがって、最初にバージョンを確認して、直面している問題が発生しないようにします...前のバージョンは引数として短く必要でした。