2012-05-10 87 views
26

Quiero establecer el color personalizado en el fondo de una celda.
Uso HSSFWorkbook (no puedo usar otra cosa).Configuración de POI Fondo de celda a un color personalizado

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

me sale este error: java.lang.RuntimeException: Could not find free color index

+0

¿Ya ha definido la cantidad máxima de colores en su archivo? (Excel tiene un límite estricto en varias cosas, como el número o filas y columnas, pero también en el número de estilos, etc.) – Gagravarr

+0

@kenny: ¿puede considerar aceptar una de las respuestas a continuación si realmente resolvió su problema? – veer7

Respuesta

32

obtiene este error, porque está lleno de paleta. Lo que debe hacer es anular el color preestablecido. Aquí se muestra un ejemplo de la función que estoy 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; 
} 

Y más tarde utilizarlo para color de fondo:

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

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

colores personalizados

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

No se olvide de llamar a este.

style.setFillPattern(CellStyle.Align_Fill); 

Los parámetros pueden variar de acuerdo con sus necesidades. Tal vez CellStyle.FINE_DOTS más o menos.

0

ranura libre en NPOI sobresalir indexedcolors de 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

Como se ha señalado en Vlad's answer, se están quedando sin ranuras de color libres. Una forma de evitarlo sería almacenar en caché los colores: cada vez que pruebe una combinación de RGB, la rutina primero debe verificar si la combinación está en el caché; si está en la caché, entonces debería usar esa en lugar de crear una nueva desde cero; los nuevos colores solo se crearían si aún no están en caché.

Aquí está la implementación que uso; que utiliza XSSF más Guava's LoadingCache y se orienta hacia los colores XSSF generationg de CSS rgb(r, g, b) declaraciones, pero debe ser relativamente trivial para adaptarla a 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)))); 
       } 

      }); 

Tal vez otra persona puede publicar HSSF equivalente? ;)

Cuestiones relacionadas