usermodel setfillforegroundcolor poi org hssfcolor font color cellstyle java apache-poi

java - poi - setfillforegroundcolor



Apache POI XSSFColor del código hexadecimal (5)

Quiero establecer el color de primer plano de una celda a un color dado en código hexadecimal. Por ejemplo, cuando trato de configurarlo en rojo:

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

No importa qué valor hexadecimal establezca en el parámetro para la función de decodificación, la función getIndexed siempre devolverá el color negro.

¿Podría ser que podría estar haciendo algo mal? Creo que es un error pero no estoy seguro ...


La buena noticia es que, si está utilizando XSSF, a diferencia de HSSF, la solución a su problema es bastante sencilla. Simplemente tienes que lanzar tu variable de estilo a XSSFCellStyle. Si lo hace, entonces hay una versión de setFillForegroundColor que toma un argumento XSSFColor, por lo que no necesita llamar a getIndexed (). Aquí hay un código de ejemplo:

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

Sin embargo, si está utilizando HSSF, entonces las cosas son más difíciles. HSSF utiliza una paleta de colores, que es simplemente una gama de colores. El valor corto que pasa a setFillForegroundColor es un índice en la paleta.

Entonces, el problema que tiene es convertir un valor rgb en un índice de paleta. La solución que propusiste, usando getIndexed (), es lógica, pero, desafortunadamente, funciona para XSSFColor de la manera que puedes suponer que debería.

Afortunadamente, hay una solución. Por el momento, supongamos que quedará satisfecho con uno de los colores en la paleta predeterminada, en lugar de usar un color personalizado. En ese caso, puede utilizar las clases HSSFPalette y HSSFColor para resolver el problema. Aquí hay un código de ejemplo:

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);

Si desea utilizar colores personalizados que aún no estén en la paleta predeterminada, debe agregarlos a la paleta. El javadoc para HSSFPalette define los métodos que puede utilizar para hacerlo.


No quise usar AWTs Color, y como no hay un constructor que solo acepte una matriz de bytes hoy en día (estoy usando la versión 3.17): hay un constructor public XSSFColor(byte[] rgb, IndexedColorMap colorMap) , que sí el truco para mi

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


Para Apache POI anterior a 4.0, simplemente puede hacer lo siguiente:

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

Desde POI 4.0, debe proporcionar el banco de trabajo IndexedColorMap:

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


Utilice XSSFColor para XSSFWorkbook . XSSFColor puede tomar un byte[] rgb o un java.awt.Color . Vea los ejemplos a continuación:

  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. ver la respuesta de GuenSeven

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


XSSFCellStyle acepta el color en el método setFillForegroundColor para la versión poi por encima de 3.07 ... así que primero compruebe su versión para evitar el problema al que me enfrentaba ... la versión anterior debía ser breve como argumento.