【问题标题】:POI setting Cell Background to a Custom ColorPOI 将单元格背景设置为自定义颜色
【发布时间】:2012-05-10 06:23:50
【问题描述】:

我想为单元格的背景设置自定义颜色。
我用HSSFWorkbook(不能用别的)。

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

【问题讨论】:

  • 您是否已经定义了文件中的最大颜色数? (Excel 对各种事物都有硬性限制,例如行数和列数,还有样式数等)
  • @kenny : 如果它真的解决了你的问题,你能考虑接受下面的答案吗?

标签: java apache-poi excel-2003


【解决方案1】:

您收到此错误是因为托盘已满。您需要做的是覆盖预设颜色。 这是我正在使用的函数示例:

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

【讨论】:

  • 对于 Apache POI 版本 > 4,您现在必须使用以下命令来获取颜色索引:HSSFColor.HSSFColorPredefined.LAVENDER.getIndex()
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    不要忘记调用它。

    style.setFillPattern(CellStyle.Align_Fill);
    

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

    【讨论】:

      【解决方案4】:

      在 NPOI excel indexedcolors 中从 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;
      

      【讨论】:

      • 在索引 57+ 处设置颜色也适用于 java 的 POI,谢谢
      【解决方案5】:

      正如Vlad's answer 中所指出的,您的可用颜色槽已用完。解决这个问题的一种方法是缓存颜色:每当您尝试 RGB 组合时,例程应该首先检查该组合是否在缓存中;如果它在缓存中,那么它应该使用那个而不是从头开始创建一个新的;只有当它们尚未在缓存中时,才会创建新颜色。

      这是我使用的实现;它使用 XSSF 加上 Guava's LoadingCache 并面向来自 CSS rgb(r, g, b) 声明的生成 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? ;)

      【讨论】:

        【解决方案6】:

        您可以使用此设置自定义颜色-

        看看这个 - click hear

        XSSFWorkbook workbook = new XSSFWorkbook();
        
        IndexedColorMap colorMap = workbook.getStylesSource().getIndexedColors();
        Font tableHeadOneFontStyle = workbook.createFont();
                tableHeadOneFontStyle.setBold( true );
                tableHeadOneFontStyle.setColor( IndexedColors.BLACK.getIndex() );
        
        XSSFCellStyle tableHeaderOneColOneStyle = workbook.createCellStyle();
                tableHeaderOneColOneStyle.setFont( tableHeadOneFontStyle );
                tableHeaderOneColOneStyle
                        .setFillForegroundColor( new XSSFColor( new java.awt.Color( 255, 231, 153 ), colorMap ) );
                tableHeaderOneColOneStyle.setFillPattern( FillPatternType.SOLID_FOREGROUND );
                tableHeaderOneColOneStyle = setLeftRightBorderColor( tableHeaderOneColOneStyle );
                tableHeaderOneColOneStyle = alignCenter( tableHeaderOneColOneStyle );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-27
          • 2020-01-06
          • 2020-12-14
          相关资源
          最近更新 更多