欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XLS调色面板HSSFPalette

程序员文章站 2022-07-13 13:17:31
...

1.调色板HSSFPlalette

/**
 * workbook调色板
 * 调色板的第一个颜色索引从0x8开始,第二个索引是0x9...一直到0x40, 
 */
public final class HSSFPalette {
	/**
	 * 可编辑的调色板,调色板的颜色可以自定义,当调色板颜色没有填充满时用黑色填充
	 * 可编辑的调色板定义了56种颜色,索引值范围:[0x8, 0x]
	 */
    private PaletteRecord _palette;

    protected HSSFPalette(PaletteRecord palette)
    {
        _palette = palette;
    }

    /**
     * 获取给定索引的颜色
     *
     * @param index 调色面板中颜色索引,索引从0x8开始,在0x8到0x40之间:[8,64]
     * @return 返回颜色,如果索引未填充,则返回null
     */
    public HSSFColor getColor(short index) {
        // 处理特例:默认黑色
        if (index == HSSFColorPredefined.AUTOMATIC.getIndex()) {
            return HSSFColorPredefined.AUTOMATIC.getColor();
        }
		// 从自定义
        byte[] b = _palette.getColor(index);
        return (b == null) ? null : new CustomColor(index, b);
    }

    /**
     * 获取给定索引的颜色
     *
     * @param index 调色面板中颜色索引,在0x8到0x40之间:[8,64]
     * @return 返回颜色,如果索引未填充,则返回null
     */
    public HSSFColor getColor(int index) {
    	return getColor((short)index);
    }

    /**
     * 查找给定颜色的第一次出现,即查找给定颜色是否在调色板中存在
     *
     * @param red RGB颜色红色分量:[0, 255]
     * @param green RGB颜色绿色分量:[0, 255]
     * @param blue RGB颜色蓝色分量:[0, 255]
     * @return 返回颜色,如果此调色板中不存在此颜色,返回null
     */
    public HSSFColor findColor(byte red, byte green, byte blue)
    {
        byte[] b = _palette.getColor(PaletteRecord.FIRST_COLOR_INDEX);
        for (short i = PaletteRecord.FIRST_COLOR_INDEX; b != null;
            b = _palette.getColor(++i))
        {
            if (b[0] == red && b[1] == green && b[2] == blue)
            {
                return new CustomColor(i, b);
            }
        }
        return null;
    }

    /**
	 * 在自定义调色板中找到最接近的匹配颜色。 找到颜色之间的距离的方法是相当重要的。
     * @param red   匹配的颜色的红色分量。
     * @param green 匹配的颜色的绿色分量。
     * @param blue  匹配的颜色的蓝色分量。
     * @return 返回最接近的颜色,如果没有当前的自定义颜色,则返回null
     */
    public HSSFColor findSimilarColor(byte red, byte green, byte blue) {
    	return findSimilarColor(unsignedInt(red), unsignedInt(green), unsignedInt(blue));
    }
	
    /**
     * 在自定义调色板中找到最接近的匹配颜色。 找到颜色之间的距离的方法是相当重要的
     *
     * @param red   匹配的颜色的红色分量。
     * @param green 匹配的颜色的绿色分量。
     * @param blue  匹配的颜色的蓝色分量。
     * @return 返回最接近的颜色,如果没有当前的自定义颜色,则返回null
     */
    public HSSFColor findSimilarColor(int red, int green, int blue) {
        HSSFColor result = null;
        int minColorDistance = Integer.MAX_VALUE;
        byte[] b = _palette.getColor(PaletteRecord.FIRST_COLOR_INDEX);
        for (short i = PaletteRecord.FIRST_COLOR_INDEX; b != null;
            b = _palette.getColor(++i))
        {
            int colorDistance = Math.abs(red - unsignedInt(b[0])) +
            	Math.abs(green - unsignedInt(b[1])) +
            	Math.abs(blue - unsignedInt(b[2]));
            if (colorDistance < minColorDistance)
            {
                minColorDistance = colorDistance;
                result = getColor(i);
            }
        }
        return result;
    }
    
    /**
     * Turn a byte of between -127 and 127 into something between
     *  0 and 255, so distance calculations work as expected.
     */
    private int unsignedInt(byte b) {
    	return 0xFF & b;
    }

    /**
     * 设置调色板中索引index处的颜色
     *
     * @param index 调色板的索引
     * @param red RGB红色分量
     * @param green RGB绿色分量
     * @param blue RGB蓝色分量
     */
    public void setColorAtIndex(short index, byte red, byte green, byte blue) {
        _palette.setColor(index, red, green, blue);
    }

    /**
	 * 将一个新的颜色添加到一个空的颜色插槽
     * @param red       The red component
     * @param green     The green component
     * @param blue      The blue component
     *
     * @return  返回新的颜色
     *
     * @throws RuntimeException if there are more more free color indexes.
     */
    public HSSFColor addColor( byte red, byte green, byte blue )
    {
        byte[] b = _palette.getColor(PaletteRecord.FIRST_COLOR_INDEX);
        short i;
        for (i = PaletteRecord.FIRST_COLOR_INDEX; i < PaletteRecord.STANDARD_PALETTE_SIZE + PaletteRecord.FIRST_COLOR_INDEX; b = _palette.getColor(++i))
        {
            if (b == null)
            {
                setColorAtIndex( i, red, green, blue );
                return getColor(i);
            }
        }
        throw new RuntimeException("Could not find free color index");
    }
	
    /**
	 * 内部类:自定义颜色类
	 */
	private static final class CustomColor extends HSSFColor {
		// 当前颜色的索引值
        private short _byteOffset;
        private byte _red;
        private byte _green;
        private byte _blue;

		/**
		 * @param byteOffset 
		 */
        public CustomColor(short byteOffset, byte[] colors)
        {
            this(byteOffset, colors[0], colors[1], colors[2]);
        }

        private CustomColor(short byteOffset, byte red, byte green, byte blue)
        {
            _byteOffset = byteOffset;
            _red = red;
            _green = green;
            _blue = blue;
        }

        @Override
        public short getIndex()
        {
            return _byteOffset;
        }

        @Override
        public short[] getTriplet()
        {
            return new short[]
            {
                (short) (_red   & 0xff),
                (short) (_green & 0xff),
                (short) (_blue  & 0xff)
            };
        }

        @Override
        public String getHexString()
        {
            StringBuffer sb = new StringBuffer();
            sb.append(getGnumericPart(_red));
            sb.append(':');
            sb.append(getGnumericPart(_green));
            sb.append(':');
            sb.append(getGnumericPart(_blue));
            return sb.toString();
        }

        private String getGnumericPart(byte color)
        {
            String s;
            if (color == 0)
            {
                s = "0";
            }
            else
            {
                int c = color & 0xff; //as unsigned
                c = (c << 8) | c; //pad to 16-bit
                s = Integer.toHexString(c).toUpperCase(Locale.ROOT);
                while (s.length() < 4)
                {
                    s = "0" + s;
                }
            }
            return s;
        }
    }
}

2.获取调色板方式

public class TestHSSFPalette {
	public static void main(String[] args) {
		HSSFWorkbook workbook = new HSSFWorkbook();
		// 获取workbook的调色板
		HSSFPalette hssfPalette = workbook.getCustomPalette();
		// 获取调色板中索引为8的HSSFColor
		HSSFColor hssfColor = hssfPalette.getColor((short)8);
		System.out.println(hssfColor.getHexString());
		
		HSSFColor hssfColor2 = hssfPalette.getColor((short)0x30);
		System.out.println(hssfColor2.getHexString());
	}
}
XLS调色面板HSSFPalette