2012-05-10 20 views
26

Desidero impostare il colore personalizzato sullo sfondo di una cella.
Io uso HSSFWorkbook (non posso usare altro).Impostazione POI Sfondo cella su un colore personalizzato

HSSFPalette palette = aWorkBook.getCustomPalette();    
Color col = new Color(backgroundColor);      
HSSFColor myColor = palette.addColor((byte) 10, (byte) 11, (byte) 12); 

ottengo questo errore: java.lang.RuntimeException: Could not find free color index

+0

Hai già definito il numero massimo di colori nel tuo file? (Excel ha un limite rigido su varie cose, come il numero o le righe e le colonne, ma anche sul numero di stili, ecc.) – Gagravarr

+0

@kenny: puoi considerare di accettare le risposte qui sotto se davvero ha risolto il tuo problema? – veer7

risposta

32

si ottiene questo errore perché tavolozza è piena. Quello che devi fare è sovrascrivere il colore predefinito. Ecco un esempio della funzione che sto usando:

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

E poi usarlo per il colore di sfondo:

HSSFColor lightGray = setColor(workbook,(byte) 0xE0, (byte)0xE0,(byte) 0xE0); 
style2.setFillForegroundColor(lightGray.getIndex()); 
style2.setFillPattern(CellStyle.SOLID_FOREGROUND); 
14

Vedi http://poi.apache.org/spreadsheet/quick-guide.html#CustomColors.

colori personalizzati

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

Non dimenticare di chiamare questo.

style.setFillPattern(CellStyle.Align_Fill); 

Il parametro può variare a seconda delle esigenze. Forse CellStyle.FINE_DOTS o così.

0

slot libero in NPOI eccellere indexedcolors da 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; 
0

Come sottolineato in Vlad's answer, si è a corto di slot liberi colore. Un modo per aggirare il problema sarebbe quello di mettere in cache i colori: ogni volta che provi una combinazione RGB, la routine dovrebbe prima verificare se la combinazione è nella cache; se è nella cache, dovrebbe usarlo invece di crearne uno nuovo da zero; i nuovi colori verrebbero quindi creati solo se non sono ancora nella cache.

Ecco l'implementazione che utilizzo; utilizza XSSF più Guava's LoadingCache ed è orientata verso i colori XSSF generationg da CSS rgb(r, g, b) dichiarazioni, ma dovrebbe essere relativamente banale per adeguarlo alle 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)))); 
       } 

      }); 

Forse qualcun altro potrebbe inviare un HSSF equivalente? ;)

Problemi correlati