2012-05-10 26 views
26

Tôi muốn thiết lập màu sắc tùy chỉnh để nền của một tế bào.
Tôi sử dụng HSSFWorkbook (không thể sử dụng bất kỳ thứ gì khác).POI thiết lập di động nền để một màu Tuỳ chỉnh

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

tôi nhận được lỗi này: java.lang.RuntimeException: Could not find free color index

+0

Bạn đã đã được xác định số lượng tối đa màu sắc trong tập tin của bạn? (Excel có một giới hạn cứng vào những thứ khác nhau, chẳng hạn như số điện thoại hoặc các hàng và cột, nhưng cũng vào số lượng các phong cách vv) – Gagravarr

+0

@kenny: bạn có thể xin vui lòng xem xét chấp nhận trên các câu trả lời dưới đây nếu nó thực sự giải quyết vấn đề của bạn? – veer7

Trả lời

32

Bạn nhận được lỗi này vì lết đầy. Những gì bạn cần làm là ghi đè lên màu cài sẵn. Dưới đây là một ví dụ về chức năng Tôi đang sử dụng:

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

Và sau đó sử dụng nó cho màu nền:

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

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

Tuỳ chỉnh màu sắc

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

Đừng quên gọi này.

style.setFillPattern(CellStyle.Align_Fill); 

Thông số có thể khác nhau theo nhu cầu của bạn. Có thể CellStyle.FINE_DOTS hoặc hơn thế.

0

Khe cắm miễn phí trong NPOI trội indexedcolors từ 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

Như đã chỉ trong Vlad's answer, bạn đang chạy ra khỏi khe cắm màu miễn phí. Một cách để có được xung quanh đó sẽ là để đệm các màu sắc: bất cứ khi nào bạn thử một sự kết hợp RGB, các thói quen đầu tiên nên kiểm tra xem sự kết hợp là trong bộ nhớ cache; nếu nó nằm trong cache, thì nó nên sử dụng nó thay vì tạo một cái mới từ đầu; màu sắc mới sau đó sẽ chỉ được tạo nếu chúng chưa có trong bộ nhớ cache.

Đây là việc thực hiện tôi sử dụng; nó sử dụng XSSF cộng Guava's LoadingCache và hướng tới màu sắc XSSF generationg từ CSS rgb(r, g, b) tờ khai, nhưng nó phải là tương đối nhỏ để thích nghi với nó để 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)))); 
       } 

      }); 

Có lẽ ai đó khác có thể gửi một HSSF tương đương? ;)

Các vấn đề liên quan