2012-06-06 97 views
20

我想将单元格的前景色设置为十六进制代码中的给定颜色。例如,当我尝试将其设置为红色:十六进制代码中的Apache POI XSSFColor

style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed()); 

不管是什么十六进制数值在我的解码功能的参数设置,则getIndexed函数总是返回黑色。

难道是我可能做错了什么?我认为这是一个错误,但我不确定...

+0

你为什么需要getIndexed()?为了向后兼容?尝试删除。 – gtiwari333

+0

如果将样式应用于单元格,它在Excel中是否正确显示为红色? – Gagravarr

+0

我需要getindexed,因为该方法将只接受短期值。 – Neets

回答

67

好消息是,如果您使用XSSF,而不是HSSF,那么解决您的问题相当容易。您只需将您的样式变量转换为XSSFCellStyle。如果你这样做,那么有一个setFillForegroundColor的版本需要XSSFColor参数,所以你不需要调用getIndexed()。下面是一些示例代码:

XSSFCellStyle style = (XSSFCellStyle)cell.getCellStyle(); 
XSSFColor myColor = new XSSFColor(Color.RED); 
style.setFillForegroundColor(myColor); 

但是,如果你正在使用HSSF,那么事情更难。 HSSF使用一个调色板,它只是一个颜色数组。您传入setFillForegroundColor的短值是调色板中的索引。

所以你有问题是将rgb值转换成调色板索引。你提出的解决方案,使用getIndexed(),是合乎逻辑的,但是,不幸的是,它可以像你想象的那样为XSSFColor工作。

幸运的是,有一个解决方案。目前,让我们假设您将使用默认调色板中的一种颜色而不是使用自定义颜色来满足其要求。在这种情况下,您可以使用HSSFPalette和HSSFColor类来解决问题。下面是一些示例代码:

HSSFWorkbook hwb = new HSSFWorkbook(); 
HSSFPalette palette = hwb.getCustomPalette(); 
// get the color which most closely matches the color you want to use 
HSSFColor myColor = palette.findSimilarColor(255, 0, 0); 
// get the palette index of that color 
short palIndex = myColor.getIndex(); 
// code to get the style for the cell goes here 
style.setFillForegroundColor(palIndex); 

如果你想在默认调色板使用自定义颜色没有准备好,那么你必须将它们添加到调色板。 HSSFPalette的javadoc定义了您可以使用的方法。

+0

我正在使用XSSF,所以第一个解决方案取得了诀窍。非常感谢! – Neets

+1

谢谢,我正在寻找这个 –

+0

XSSFColor就像一个魅力!谢谢 – Gleeb

6

您只需做到以下几点:

XSSFColor grey =new XSSFColor(new java.awt.Color(192,192,192)); 
cellStyle.setFillForegroundColor(grey); 

而且它的工作原理:)

+3

以下,并且可以轻松地将RGB颜色应用于单元格 – Gleeb

+0

只需注意这可能会破坏您的服务器,因为依赖到AWT类和服务器可能是无头的。没有检查它。 – Daniel

12

使用XSSFColorXSSFWorkbookXSSFColor可以采取byte[] rgbjava.awt.Color。 请参见下面的例子:

  1.  

    XSSFWorkbook wb = new XSSFWorkbook(); 
    XSSFCellStyle cellStyle = wb.createCellStyle(); 
    byte[] rgb = new byte[3]; 
    rgb[0] = (byte) 242; // red 
    rgb[1] = (byte) 220; // green 
    rgb[2] = (byte) 219; // blue 
    XSSFColor myColor = new XSSFColor(rgb); // #f2dcdb 
    cellStyle.setFillForegroundColor(myColor); 
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 
    
  2. 看到GuenSeven的答案

    XSSFColor myColor = new XSSFColor(new java.awt.Color(242, 220, 219)); // #f2dcdb 
    cellStyle.setFillForegroundColor(myColor); 
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 
    
+0

我无法使用.setFillForegroundColor(myColor);我该怎么办? – meme

+0

@meme,升级到poi 3.0.7或更高版本,我使用3.10版本 –

0

在POI以上版本3.07方法setFillForegroundColor XSSFCellStyle接受的颜色......所以检查您的版本首先要避免出现问题I正面临......以前的版本需要短暂的参数。