Saltar al contenido

Apache POI XSSFColor desde código hexadecimal

Este escrito ha sido evaluado por nuestros expertos así se asegura la exactitud de nuestro contenido.

Solución:

La buena noticia es que, si utiliza XSSF en lugar de HSSF, la solución a su problema es bastante sencilla. Simplemente tiene que 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í hay un código de ejemplo:

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

Sin embargo, si está usando HSSF, entonces las cosas son más difíciles. HSSF utiliza una paleta de colores, que es simplemente una array 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 propuso, usando getIndexed(), es lógica, pero, desafortunadamente, funciona para XSSFColor de la manera que podría suponer que debería.

Afortunadamente, hay una solución. Por el momento, supongamos que estará satisfecho con uno de los colores de la paleta predeterminada, en lugar de usar un color personalizado. En ese caso, puede usar 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 usar para hacerlo.

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

Usar XSSFColor por XSSFWorkbook. XSSFColor puede tomar byte[] rgb o un 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);
    

Comentarios y puntuaciones del artículo

Te invitamos a añadir valor a nuestra información añadiendo tu veteranía en las acotaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *