2012-05-10 11 views
26

Ich möchte benutzerdefinierte Farbe auf eine Zelle Hintergrund setzen.
Ich verwende HSSFWorkbook (kann nichts anderes verwenden).POI Einstellung Cell Hintergrund auf eine benutzerdefinierte Farbe

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

ich diesen Fehler: java.lang.RuntimeException: Could not find free color index

+0

Haben Sie bereits die maximale Anzahl an Farben in Ihrer Datei definiert? (Excel hat eine harte Grenze für verschiedene Dinge, wie die Anzahl oder Zeilen und Spalten, aber auch die Anzahl der Stile usw.) – Gagravarr

+0

@kenny: Können Sie bitte eine der folgenden Antworten akzeptieren, wenn es Ihr Problem wirklich gelöst hat? – veer7

Antwort

32

Sie diesen Fehler erhalten, weil pallete voll ist. Was Sie tun müssen, überschreiben voreingestellte Farbe. Hier ist ein Beispiel für Funktion verwende ich:

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

Und später verwenden es für die Hintergrundfarbe:

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

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

Sonderfarben

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

Vergessen Sie das nicht nennen.

style.setFillPattern(CellStyle.Align_Fill); 

Parameter können je nach Bedarf abweichen. Vielleicht CellStyle.FINE_DOTS oder so.

0

Slot frei in NPOI treffen indexedcolors von 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

Wie in Vlad's answer darauf, Sie aus freien Stücken Farbe Slots ausgeführt werden. Eine Möglichkeit, dies zu umgehen, wäre das Zwischenspeichern der Farben: Wann immer Sie eine RGB-Kombination ausprobieren, sollte die Routine zuerst prüfen, ob sich die Kombination im Cache befindet. Wenn es im Cache ist, sollte es dieses verwenden, anstatt ein neues von Grund auf neu zu erstellen; neue Farben würden dann nur erstellt, wenn sie noch nicht im Cache sind.

Hier ist die Implementierung, die ich verwende; es nutzt XSSF Plus Guava's LoadingCache und in Richtung generationg XSSF Farben von CSS rgb(r, g, b) Erklärungen ausgerichtet, aber es sollte relativ trivial sein, es zu HSSF anzupassen:

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

      }); 

Vielleicht jemand anderes schreiben Äquivalent einer HSSF könnte? ;)