I want to set custom color to a cell's background.
I use HSSFWorkbook
(can't use anything else).
我想将自定义颜色设置为单元格的背景。我使用HSSFWorkbook(不能使用其他任何东西)。
HSSFPalette palette = aWorkBook.getCustomPalette();
Color col = new Color(backgroundColor);
HSSFColor myColor = palette.addColor((byte) 10, (byte) 11, (byte) 12);
I get this error: java.lang.RuntimeException: Could not find free color index
我收到此错误:java.lang.RuntimeException:找不到*颜色索引
5 个解决方案
#1
34
You get this error because pallete is full. What you need to do is override preset color. Here is an example of function I'm using:
您收到此错误,因为托盘已满。您需要做的是覆盖预设颜色。这是我正在使用的函数示例:
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;
}
And later use it for background color:
然后将其用于背景颜色:
HSSFColor lightGray = setColor(workbook,(byte) 0xE0, (byte)0xE0,(byte) 0xE0);
style2.setFillForegroundColor(lightGray.getIndex());
style2.setFillPattern(CellStyle.SOLID_FOREGROUND);
#2
16
See http://poi.apache.org/spreadsheet/quick-guide.html#CustomColors.
Custom colors
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
1
Don't forget to call this.
别忘了给这个打电话。
style.setFillPattern(CellStyle.Align_Fill);
Parameter may differ according to your need. Maybe CellStyle.FINE_DOTS or so.
参数可能根据您的需要而有所不同。也许是CellStyle.FINE_DOTS左右。
#4
0
Slot free in NPOI excel indexedcolors from 57+
NPOI中的无插槽excel索引颜色来自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;
#5
0
As pointed in Vlad's answer, you are running out of free color slots. One way to get around that would be to cache the colors: whenever you try a RGB combination, the routine should first check if the combination is in the cache; if it is in the cache, then it should use that one instead of creating a new one from scratch; new colors would then only be created if they're not yet in cache.
正如弗拉德的答案所指出的那样,你的*色彩插槽用完了。解决这个问题的一种方法是缓存颜色:每当你尝试RGB组合时,例程应首先检查组合是否在缓存中;如果它在缓存中,那么它应该使用那个,而不是从头开始创建一个;然后,只有当它们还没有在缓存中时才会创建新颜色。
Here's the implementation I use; it uses XSSF plus Guava's LoadingCache and is geared towards generationg XSSF colors from CSS rgb(r, g, b)
declarations, but it should be relatively trivial to adapt it to HSSF:
这是我使用的实现;它使用XSSF加上Guava的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))));
}
});
Perhaps someone else could post a HSSF equivalent? ;)
也许其他人可以发布HSSF等价物? ;)
#1
34
You get this error because pallete is full. What you need to do is override preset color. Here is an example of function I'm using:
您收到此错误,因为托盘已满。您需要做的是覆盖预设颜色。这是我正在使用的函数示例:
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;
}
And later use it for background color:
然后将其用于背景颜色:
HSSFColor lightGray = setColor(workbook,(byte) 0xE0, (byte)0xE0,(byte) 0xE0);
style2.setFillForegroundColor(lightGray.getIndex());
style2.setFillPattern(CellStyle.SOLID_FOREGROUND);
#2
16
See http://poi.apache.org/spreadsheet/quick-guide.html#CustomColors.
Custom colors
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
1
Don't forget to call this.
别忘了给这个打电话。
style.setFillPattern(CellStyle.Align_Fill);
Parameter may differ according to your need. Maybe CellStyle.FINE_DOTS or so.
参数可能根据您的需要而有所不同。也许是CellStyle.FINE_DOTS左右。
#4
0
Slot free in NPOI excel indexedcolors from 57+
NPOI中的无插槽excel索引颜色来自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;
#5
0
As pointed in Vlad's answer, you are running out of free color slots. One way to get around that would be to cache the colors: whenever you try a RGB combination, the routine should first check if the combination is in the cache; if it is in the cache, then it should use that one instead of creating a new one from scratch; new colors would then only be created if they're not yet in cache.
正如弗拉德的答案所指出的那样,你的*色彩插槽用完了。解决这个问题的一种方法是缓存颜色:每当你尝试RGB组合时,例程应首先检查组合是否在缓存中;如果它在缓存中,那么它应该使用那个,而不是从头开始创建一个;然后,只有当它们还没有在缓存中时才会创建新颜色。
Here's the implementation I use; it uses XSSF plus Guava's LoadingCache and is geared towards generationg XSSF colors from CSS rgb(r, g, b)
declarations, but it should be relatively trivial to adapt it to HSSF:
这是我使用的实现;它使用XSSF加上Guava的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))));
}
});
Perhaps someone else could post a HSSF equivalent? ;)
也许其他人可以发布HSSF等价物? ;)