首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >来自十六进制代码的Apache POI XSSFColor

来自十六进制代码的Apache POI XSSFColor
EN

Stack Overflow用户
提问于 2012-06-06 18:39:28
回答 5查看 110.7K关注 0票数 42

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

代码语言:javascript
复制
style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());

无论我在decode函数的参数中设置哪个十六进制值,getIndexed函数都将始终返回黑色。

会不会是我做错了什么?我想这是个bug,但我不确定...

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-06-07 09:19:17

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

代码语言:javascript
复制
XSSFCellStyle style = (XSSFCellStyle)cell.getCellStyle();
XSSFColor myColor = new XSSFColor(Color.RED);
style.setFillForegroundColor(myColor);

然而,如果你使用的是HSSF,那么事情就更难了。HSSF使用调色板,它只是一个颜色数组。传递给setFillForegroundColor的短值是调色板的索引。

因此,您遇到的问题是将RGB值转换为调色板索引。您提出的使用getIndexed()的解决方案是合乎逻辑的,但不幸的是,它确实以您可能认为的方式在XSSFColor上工作。

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

代码语言:javascript
复制
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定义了您可以用来执行此操作的方法。

票数 98
EN

Stack Overflow用户

发布于 2014-05-06 17:36:21

对于Apache POI 4.0之前的版本,只需执行以下操作:

代码语言:javascript
复制
 XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192));
 cellStyle.setFillForegroundColor(grey);

从POI4.0开始,您必须提供工作台IndexedColorMap:

代码语言:javascript
复制
 IndexedColorMap colorMap = workbook.getStylesSource().getIndexedColors();
 XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192), colorMap);
 cellStyle.setFillForegroundColor(grey);
票数 29
EN

Stack Overflow用户

发布于 2018-03-23 22:06:28

我不想使用AWTs Color,因为现在还没有只接受字节数组的构造函数(我使用的是3.17版本):有一个构造函数public XSSFColor(byte[] rgb, IndexedColorMap colorMap),它帮我完成了这个任务:

代码语言:javascript
复制
byte[] byteColor = new byte[]{255,0,0};
XSSFColor color = new XSSFColor(byteColor, null);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10912578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档