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...
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.
Utiliser XSSFColor
XSSFWorkbook
. XSSFColor
peut prendre byte[] rgb
et java.awt.Color
.
Voir les exemples ci-dessous:
-
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);
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);
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);
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.
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);