2012-05-10 879 views
26

我想将自定义颜色设置为单元格的背景。
我使用HSSFWorkbook(不能使用其他任何东西)。POI将单元格背景设置为自定义颜色

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

我得到这个错误:java.lang.RuntimeException: Could not find free color index

+0

您是否已经定义了文件中的最大颜色数量? (Excel对各种事物有很大的限制,比如数字或者行和列,但也包括样式的数量等) – Gagravarr

+0

@kenny:如果它真的解决了你的问题,你能考虑接受下面的答案吗? – veer7

回答

32

因为调色板充满你得到这个错误。你需要做的是覆盖预设颜色。 这里是我使用的功能的例子:

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

并在以后使用它作为背景色:

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

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

自定义颜色

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

不要忘记调用此。

style.setFillPattern(CellStyle.Align_Fill); 

参数可能会根据您的需要而有所不同。 也许是CellStyle.FINE_DOTS左右。免费NPOI

0

插槽从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

擅长indexedcolors作为Vlad's answer指出,你运行的免费颜色的插槽。解决这个问题的一种方法是缓存颜色:每当你尝试RGB组合时,例程应该首先检查组合是否在缓存中;如果它在缓存中,那么它应该使用该缓存,而不是从头创建一个新缓存;新的颜色只有在它们还没有进入缓存时才会被创建。

这是我使用的实现;它采用XSSF加Guava's LoadingCache并朝从CSS rgb(r, g, b)声明generationg XSSF颜色减速,但它应该是比较琐碎,以使其适应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)))); 
       } 

      }); 

也许别人可以发表HSSF相同呢? ;)

相关问题