Java POI将单元格背景设置为自定义颜色
我想设置单元格背景的自定义颜色。Java POI将单元格背景设置为自定义颜色,java,apache-poi,excel-2003,Java,Apache Poi,Excel 2003,我想设置单元格背景的自定义颜色。 我使用HSSFWorkbook(不能使用其他任何东西) 我收到此错误:java.lang.RuntimeException:找不到免费颜色索引您收到此错误,因为托盘已满。您需要做的是覆盖预设颜色。 下面是我正在使用的函数示例: public HSSFColor setColor(HSSFWorkbook workbook, byte r,byte g, byte b){ HSSFPalette palette = workbook.getCustomPa
我使用
HSSFWorkbook
(不能使用其他任何东西)
我收到此错误:
java.lang.RuntimeException:找不到免费颜色索引
您收到此错误,因为托盘已满。您需要做的是覆盖预设颜色。
下面是我正在使用的函数示例:
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);
看
定制颜色
HSSF:
XSSF:
别忘了叫这个
style.setFillPattern(CellStyle.Align_Fill);
根据您的需要,参数可能会有所不同。
可能是CellStyle.FINE_DOTS左右。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;
正如中所指出的,您的免费颜色槽已用完。一种解决方法是缓存颜色:无论何时尝试RGB组合,例程都应首先检查组合是否在缓存中;如果它在缓存中,那么它应该使用该缓存,而不是从头创建一个新的缓存;只有在缓存中还没有新颜色时,才会创建新颜色
下面是我使用的实现;它使用XSSF plus,并致力于从CSSrgb(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))));
}
});
private final LoadingCache colorsFromCSS=CacheBuilder.newBuilder()
.build(新的缓存加载程序(){
私有最终模式RGB=Pattern.compile(“RGB\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)、\\s*(\\d+)\\s*\);
@凌驾
公共XSSFColor加载(字符串样式)引发异常{
Matcher mat=RGB.Matcher(样式);
如果(!mat.find()){
抛出新的IllegalStateException(“无法读取CSS颜色:+样式”);
}
返回新的XSSFColor(new java.awt.Color(
整数.parseInt(mat.group(1)),
整数.parseInt(mat.group(2)),
整数.parseInt(mat.group(3));
}
});
或许其他人也可以发布HSSF的等效文件?;) 您可以使用此选项设置自定义颜色- 看看这个-
您是否已经定义了文件中的最大颜色数?(Excel对各种内容都有严格限制,例如行和列的数量,但也对样式的数量等有严格限制)@肯尼:如果下面的答案真的解决了你的问题,你能考虑接受吗?使用Apache POI version>4,你现在必须使用以下方法来获得颜色索引:
HSSFColor.HSSFColorPredefined.LAVENDER.getIndex()
。在索引57+处设置颜色对java的POI也很有效,谢谢
style.setFillPattern(CellStyle.Align_Fill);
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;
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))));
}
});
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 );