Epplus获得正确的细胞背景rgb颜色

时间:2016-03-11 13:16:21

标签: c# .net excel epplus

我无法使用EPPLUS获取背景颜色的真实RGB值。

我的代码只适用于在Excel上设置为RGB的颜色,没有识别带有托盘颜色的单元格。

这是代码,希望有人可以帮助我:



var w = angular.element($window);
w.height();




2 个答案:

答案 0 :(得分:4)

如果你在Excel颜色下拉列表中选择了一个“主题颜色”而不是“标准颜色”,或者从颜色选择器中选择它,它似乎不起作用,如此问题的答案中所述:{{ 3}}

似乎不支持主题 - EPPlus Excel Change cell color

  

库不支持什么(这些是最明显的功能)? [...] *主题

答案 1 :(得分:1)

事实证明,这是LookupColor在EPPlus中如何运作的怪癖。具体来说,颜色returned in this case is AA{R}{G}{B}的格式,分别为R,G和B中的每一个的alpha和两个恒定长度序列,指定灰色阴影。但是,如果你看一下代码,你可能会得到一些非常奇怪的颜色(即它可能会被窃听)。这是因为使用的常量长度范围为1到3个字符,上限为0x0200

例如,((int)(decimal.Round(-1M * -512))).ToString("X")会返回"200",通过推断,会返回#FF200200200。但是,如果没有提交修补程序以更改其处理方式,那么执行此操作的方法可能是相信 可以为通道返回的上限,然后在0-&gt之间缩放; FF

有关执行此操作的方法,请参阅下文。请注意,如果此 已在EPPlus中自行修复,则以下内容会错误地缩放(因为实际上限为FF,而不是0x0200)。

private string EPPLookupColorFixed(ExcelColor sourceColor)
    {
        var lookupColor = sourceColor.LookupColor();
        const int maxLookup = 63;
        bool isFromTable = (0 <= sourceColor.Indexed) && (maxLookup > sourceColor.Indexed);
        bool isFromRGB = (null != sourceColor.Rgb && 0 < sourceColor.Rgb.Length);
        if (isFromTable || isFromRGB)
            return lookupColor;

        // Ok, we know we entered the else block in EPP - the one 
        // that doesn't quite behave as expected.

        string shortString = "0000";
        switch (lookupColor.Length)
        {
            case 6:
                // Of the form #FF000
                shortString = lookupColor.Substring(3, 1).PadLeft(4, '0');
                break;
            case 9:
                // Of the form #FFAAAAAA
                shortString = lookupColor.Substring(3, 2).PadLeft(4, '0');
                break;
            case 12:
                // Of the form #FF200200200
                shortString = lookupColor.Substring(3, 3).PadLeft(4, '0');
                break;
        }
        var actualValue = short.Parse(shortString, System.Globalization.NumberStyles.HexNumber);
        var percent = ((double)actualValue) / 0x200d;
        var byteValue = (byte)Math.Round(percent * 0xFF,0);
        var byteText = byteValue.ToString("X");
        byteText = byteText.Length == 2 ? byteText : byteText.PadLeft(2, '0');
        return $"{lookupColor.Substring(0, 3)}{byteText}{byteText}{byteText}";
    }