Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java POI将单元格背景设置为自定义颜色_Java_Apache Poi_Excel 2003 - Fatal编程技术网

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,并致力于从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))));
                }

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