セルの前景色を 16 進数コードの特定の色に設定したいと考えています。たとえば、赤に設定しようとすると:
style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());
デコード関数のパラメーターに設定した 16 進値に関係なく、getIndexed 関数は常に黒色を返します。
私が何か間違ったことをしている可能性がありますか?バグだと思いますがよくわかりません…
セルの前景色を 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 に対しては、想定どおりに機能します。
幸いなことに、解決策があります。ここでは、カスタム カラーを使用するのではなく、デフォルト パレットのいずれかの色を使用して満足していると仮定します。その場合、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 では、そのために使用できるメソッドが定義されています。
に使用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);
XSSFCellStyle は、3.07 より上の poi バージョンのメソッド setFillForegroundColor で色を受け入れます...そのため、最初にバージョンを確認して、直面していた問題に巻き込まれないようにします...以前のバージョンでは引数として短い必要がありました。