Apache POI XSSFColor du code hexadécimal

je veux mettre la couleur au premier plan d'une cellule à une couleur donnée en code hexadécimal. Par exemple, quand j'essaie de le mettre en rouge:

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

peu importe la valeur hexadécimale que j'ai définie dans le paramètre pour la fonction de décodage, la fonction getIndexed retournera toujours la couleur Noire.

se pourrait-il que je fasse quelque chose de mal? Je pense que c'est un insecte mais je ne suis pas sûr...

22
demandé sur Neets 2012-06-06 14:39:28

5 réponses

la bonne nouvelle est que, si vous utilisez XSSF, par opposition à HSSF, alors la solution à votre problème est assez facile. Vous avez simplement à mouler votre variable de style à XSSFCellStyle. Si vous le faites, alors il y a une version de setFillForegroundColor qui prend un argument XSSFColor, donc vous n'avez pas besoin d'appeler getIndexed(). Voici un exemple de code:

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

cependant, si vous utilisez HSSF, alors les choses sont plus difficiles. HSSF utilise une palette de couleurs, qui est simplement un tableau de couleurs. Court la valeur que vous passez dans setFillForegroundColor est un index dans la palette.

donc le problème que vous avez est de convertir une valeur RVB en un index de palette. La solution que vous avez proposée, en utilisant getIndexed(), est logique, mais, malheureusement, elle fonctionne pour XSSFColor comme vous pourriez le supposer.

heureusement, il y a une solution. Pour le moment, nous supposons que vous serez satisfait en utilisant une des couleurs de la palette par défaut, plutôt que d'utiliser une couleur personnalisée. Dans ce cas, vous pouvez utiliser les classes HSSFPalette et HSSFColor pour résoudre le problème. Voici un exemple de code:

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 vous souhaitez utiliser des couleurs personnalisées pas déjà dans la palette par défaut, vous devez les ajouter à la palette. Le javadoc pour HSSFPalette définit les méthodes que vous pouvez utiliser pour le faire.

73
répondu Howard Schutzman 2012-06-07 01:19:17

Utiliser XSSFColorXSSFWorkbook. XSSFColor peut prendre byte[] rgb et java.awt.Color. Voir les exemples ci-dessous:

  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. voir la réponse de GuenSeven

    XSSFColor myColor = new XSSFColor(new java.awt.Color(242, 220, 219)); // #f2dcdb
    cellStyle.setFillForegroundColor(myColor);
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
    
15
répondu Jonathan L 2015-03-02 01:54:48

pour Apache POI avant 4.0 vous pouvez simplement faire ce qui suit:

 XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192));
 cellStyle.setFillForegroundColor(grey);
 IndexedColorMap colorMap = workbook.getStylesSource().getIndexedColors();
 XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192), colorMap);
 cellStyle.setFillForegroundColor(grey);
11
répondu TheByeByeMan 2018-09-12 14:37:16

XSSFCellStyle accepter de couleur dans la méthode setFillForegroundColor pour poi version 3.07 ... donc, vérifiez votre version d'abord pour éviter d'entrer dans le problème que je faisais face ... version précédente nécessaire court comme argument.

0
répondu Fabrice Khedadi 2015-08-20 08:48:48

Je ne voulais pas utiliser la couleur AWTs, et puisqu'il n'y a pas de constructeur qui accepte uniquement un tableau octet de nos jours (j'utilise la version 3.17): il y a un constructeur public XSSFColor(byte[] rgb, IndexedColorMap colorMap), qui a fait le tour pour moi:

byte[] byteColor = new byte[]{(byte)255,0,0};
XSSFColor color = new XSSFColor(byteColor, null);
0
répondu lher 2018-09-12 15:11:42