Poi paramétrant le fond de la cellule à une couleur personnalisée
 je veux mettre la couleur personnalisée à l'arrière-plan d'une cellule.
J'utilise HSSFWorkbook (ne peut pas utiliser autre chose).
HSSFPalette palette = aWorkBook.getCustomPalette();             
Color col = new Color(backgroundColor);                     
HSSFColor myColor  = palette.addColor((byte) 10, (byte) 11, (byte) 12); 
j'ai cette erreur: java.lang.RuntimeException: Could not find free color index
5 réponses
vous obtenez cette erreur parce que pallete est plein. Ce que vous devez faire est de modifier la couleur prédéfinie. Voici un exemple de fonction que j'utilise:
public HSSFColor setColor(HSSFWorkbook workbook, byte r,byte g, byte b){
    HSSFPalette palette = workbook.getCustomPalette();
    HSSFColor hssfColor = null;
    try {
        hssfColor= palette.findColor(r, g, b); 
        if (hssfColor == null ){
            palette.setColorAtIndex(HSSFColor.LAVENDER.index, r, g,b);
            hssfColor = palette.getColor(HSSFColor.LAVENDER.index);
        }
    } catch (Exception e) {
        logger.error(e);
    }
    return hssfColor;
}
Et à utiliser plus tard pour la couleur d'arrière-plan:
HSSFColor lightGray =  setColor(workbook,(byte) 0xE0, (byte)0xE0,(byte) 0xE0);
style2.setFillForegroundColor(lightGray.getIndex());
style2.setFillPattern(CellStyle.SOLID_FOREGROUND);
    	                couleurs
HSSF:
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFRow row = sheet.createRow((short) 0);
HSSFCell cell = row.createCell((short) 0);
cell.setCellValue("Default Palette");
//apply some colors from the standard palette,
// as in the previous examples.
//we'll use red text on a lime background
HSSFCellStyle style = wb.createCellStyle();
style.setFillForegroundColor(HSSFColor.LIME.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
HSSFFont font = wb.createFont();
font.setColor(HSSFColor.RED.index);
style.setFont(font);
cell.setCellStyle(style);
//save with the default palette
FileOutputStream out = new FileOutputStream("default_palette.xls");
wb.write(out);
out.close();
//now, let's replace RED and LIME in the palette
// with a more attractive combination
// (lovingly borrowed from freebsd.org)
cell.setCellValue("Modified Palette");
//creating a custom palette for the workbook
HSSFPalette palette = wb.getCustomPalette();
//replacing the standard red with freebsd.org red
palette.setColorAtIndex(HSSFColor.RED.index,
        (byte) 153,  //RGB red (0-255)
        (byte) 0,    //RGB green
        (byte) 0     //RGB blue
);
//replacing lime with freebsd.org gold
palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);
//save with the modified palette
// note that wherever we have previously used RED or LIME, the
// new colors magically appear
out = new FileOutputStream("modified_palette.xls");
wb.write(out);
out.close();
XSSF:
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell( 0);
cell.setCellValue("custom XSSF colors");
XSSFCellStyle style1 = wb.createCellStyle();
style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128, 0, 128)));
style1.setFillPattern(CellStyle.SOLID_FOREGROUND);
    	                N'oubliez pas d'appeler.
style.setFillPattern(CellStyle.Align_Fill);
paramètre peut différer selon vos besoins. Peut-Être CellStyle.FINE_DOTS.
Free Slot in NPOI excel indexedcolors from 57+
            Color selColor;
        var wb = new HSSFWorkbook();
        var sheet = wb.CreateSheet("NPOI");
        var style = wb.CreateCellStyle();
        var font = wb.CreateFont();
        var palette = wb.GetCustomPalette();
        short indexColor = 57; 
        palette.SetColorAtIndex(indexColor, (byte)selColor.R, (byte)selColor.G, (byte)selColor.B);
        font.Color = palette.GetColor(indexColor).Indexed;
    	                Comme indiqué dans le réponse de Vlad, vous êtes à court de machines à sous gratuites. Une façon de contourner cela serait de mettre en cache les couleurs: chaque fois que vous essayez une combinaison RGB, la routine devrait d'abord vérifier si la combinaison est dans le cache; si elle est dans le cache, alors il devrait utiliser celle-ci au lieu de créer une nouvelle combinaison à partir de zéro; de nouvelles couleurs ne seraient alors créées que si elles ne sont pas encore dans le cache.
 Voici l'implémentation que j'utilise; il utilise XSSF plus Goyave est LoadingCache et est orienté vers les couleurs xssf générationg de CSS rgb(r, g, b) déclarations, mais il devrait être relativement trivial de l'adapter à HSSF:
    private final LoadingCache<String, XSSFColor> colorsFromCSS = CacheBuilder.newBuilder()
            .build(new CacheLoader<String, XSSFColor>() {
                private final Pattern RGB = Pattern.compile("rgb\(\s*(\d+)\s*, \s*(\d+)\s*,\s*(\d+)\s*\)");
                @Override
                public XSSFColor load(String style) throws Exception {
                    Matcher mat = RGB.matcher(style);
                    if (!mat.find()) {
                        throw new IllegalStateException("Couldn't read CSS color: " + style);
                    }                       
                    return new XSSFColor(new java.awt.Color(
                            Integer.parseInt(mat.group(1)), 
                            Integer.parseInt(mat.group(2)), 
                            Integer.parseInt(mat.group(3))));
                }
            });
peut-être quelqu'un d'autre pourrait-il afficher un équivalent de la FSHS? ;)