2012-06-06 239 views
20

Quiero establecer el color de primer plano de una celda con un color dado en código hexadecimal. Por ejemplo, cuando trato de ponerlo en rojo:Apache POI XSSFColor del código hexadecimal

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

No importa qué valor hexadecimal puse 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 ...

+0

¿por qué necesita getIndexed()? Por compatibilidad con versiones anteriores? Intenta eliminar eso. – gtiwari333

+0

Si aplica el estilo a una celda, ¿se muestra correctamente en rojo en Excel? – Gagravarr

+0

Necesito getindexed porque el método solo aceptará un valor corto. – Neets

Respuesta

67

La buena noticia es que si está utilizando XSSF, a diferencia de HSSF, entonces la solución a su problema es bastante fácil. Simplemente debe convertir su 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í es 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 usa una paleta de colores, que es simplemente una matriz de colores. El valor corto que pasa a setFillForegroundColor es un índice en la paleta.

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

Afortunadamente, hay una solución. Por el momento, supongamos que estará satisfecho utilizando uno de los colores en la paleta predeterminada, en lugar de utilizar un color personalizado. En ese caso, puede usar las clases HSSFPlette y HSSFColor para resolver el problema. Este es 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 los colores personalizados no está ya en la paleta predeterminada, entonces usted tiene que añadirlos a la paleta. El javadoc para HSSFPalette define los métodos que puede usar para hacerlo.

+0

Estaba usando XSSF, por lo que la primera solución hizo el truco. ¡Muchas gracias! – Neets

+1

Gracias hombre que estaba buscando –

+0

XSSFColor funcionó como un encanto !. gracias – Gleeb

6

puede simplemente hacer lo siguiente:

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

y funciona :)

+3

esto también funciona y da una forma fácil de aplicar color RGB a una celda – Gleeb

+0

. servidor debido a las dependencias de las clases AWT y el servidor puede ser sin cabeza. No lo he comprobado todavía – Daniel

12

Uso XSSFColor para XSSFWorkbook. XSSFColor puede tomar byte[] rgb o java.awt.Color. Ver 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); 
    
+0

No puedo usar .setFillForegroundColor (myColor); ¿qué debo hacer? – meme

+0

@meme, actualice a poi versión 3.0.7 o posterior, uso la versión 3.10 –

0

XSSFCellStyle acepte el color en setFillForegroundColor método para la versión poi por encima de 3,07 ... a fin de comprobar su versión primero para evitar meterse en el problema que estaba enfrentando ... la versión anterior necesitaba breve como argumento.

Cuestiones relacionadas