web-dev-qa-db-fra.com

Apache POI XSSFColor à partir du code hexadécimal

Je veux définir la couleur de premier plan d'une cellule sur une couleur donnée en code hexadécimal. Par exemple, lorsque j'essaie de le mettre en rouge:

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

Quelle que soit la valeur hexadécimale définie dans le paramètre de la fonction de décodage, la fonction getIndexed renvoie toujours la couleur noire.

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

35
Neets

La bonne nouvelle est que si vous utilisez XSSF, par opposition à HSSF, la solution à votre problème est assez simple. Vous devez simplement convertir votre variable de style en XSSFCellStyle. Si vous le faites, il existe une version de setFillForegroundColor qui prend un argument XSSFColor, vous n'avez donc 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, les choses sont plus difficiles. HSSF utilise une palette de couleurs, qui est simplement un tableau de couleurs. La valeur courte que vous passez dans setFillForegroundColor est un index dans la palette.

Le problème que vous rencontrez est donc la conversion d'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 existe une solution. Pour le moment, supposons que vous serez satisfait en utilisant l'une des couleurs de la palette par défaut, plutôt qu'en utilisant 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 qui ne figurent 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 ce faire.

87
Howard Schutzman

Pour Apache POI antérieur à 4.0, vous pouvez simplement faire ce qui suit:

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

Depuis POI 4.0, vous devez fournir le plan de travail IndexedColorMap:

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

Utilisez XSSFColor pour XSSFWorkbook. XSSFColor peut prendre byte[] rgb ou un 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);
    
16
Jonathan L

Je ne voulais pas utiliser AWTs Color, et comme il n'y a pas de constructeur qui accepte uniquement un tableau d'octets de nos jours (j'utilise la version 3.17): Il y a un constructeur public XSSFColor(byte[] rgb, IndexedColorMap colorMap), qui a fait l'affaire pour moi :

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

XSSFCellStyle accepte la couleur dans la méthode setFillForegroundColor pour la version poi supérieure à 3.07 ... alors vérifiez d'abord votre version pour éviter de rencontrer le problème auquel je faisais face ... la version précédente était courte comme argument.

0
Fabrice Khedadi