在ClosedXml中“无法将主题颜色转换为颜色”

时间:2012-06-25 23:05:56

标签: c# .net excel closedxml

我正在尝试使用ClosedXml读取Excel中单元格的填充背景颜色。我在this sample code工作,能够无问题地阅读Excel文档的内容,但无法阅读单元格的 Fill BackgroundColor 作为十六进制值。我能够看到 BackgroundColor 下定义的 ThemeColor ThemeTint 属性,但还没有找到将它们转换为 System的方法。颜色或十六进制值。这是我的代码:

// Get all categories
while (!categoryRow.Cell(coCategoryId).IsEmpty())
{
    IXLCell categoryName = categoryRow.Cell(coCategoryName);
    categories.Add(categoryName.GetString() + " " + XLColor.FromTheme(categoryName.Style.Fill.BackgroundColor.ThemeColor, categoryName.Style.Fill.BackgroundColor.ThemeTint).Color.ToHex());
    categoryRow = categoryRow.RowBelow();
}

似乎方法 XLColor.FromTheme 总是抛出异常“无法将主题颜色转换为颜色”。有没有人知道从 ThemeColor ThemeTint 值中获取 System.Color 的另一种方式?

更新:

我没有提到我已经尝试使用 BackgroundColor Color 属性,遗憾的是这没有正确填充,如果你在调试器中查看它,那么你将看到这个属性抛出与方法 XLColor.FromTheme 相同的异常。所以这肯定看起来像ClosedXml中的一个错误。有没有人知道解决方法?

3 个答案:

答案 0 :(得分:1)

我认为如果需要,您需要评估ColorType属性和工作簿的主题。例如。像这样:

Private Function CellColor(ByVal cell As IXLCell, ByVal wb As XLWorkbook) As Drawing.Color

    Select Case cell.Style.Fill.BackgroundColor.ColorType
        Case XLColorType.Color
            Return cell.Style.Fill.BackgroundColor.Color

        Case XLColorType.Theme
            Select Case cell.Style.Fill.BackgroundColor.ThemeColor
                Case XLThemeColor.Accent1
                    Return wb.Theme.Accent1.Color
                Case XLThemeColor.Accent2
                    Return wb.Theme.Accent2.Color
                ...
            End Select
    End Select

正如BruceHill所指出的,忽略了着色/着色。 ClosedXML似乎不支持这一点,因此必须手动计算。可以在此处找到Office使用的算法:http://social.msdn.microsoft.com/Forums/en-HK/oxmlsdk/thread/f6d26f2c-114f-4a0d-8bca-a27442aec4d0

答案 1 :(得分:0)

主题颜色只是枚举值(如Background1Text1等),以获取从主题获取它所需的实际值。因此,在工作簿中寻找一些“主题”特性,实际主题颜色最有可能定义在哪里。

答案 2 :(得分:0)

我发现this article 非常有用,而且工作正常。

刚刚在“Rgb To Hls”函数中找到了一个小问题,在最小值和最大值等于的情况下没有设置alpha值:

if (max == min)
        {

            hlsColor.H = 0;

            hlsColor.S = 0;

            hlsColor.L = max;

           --> **hlsColor.L = a;**
            return hlsColor;

        }