【问题标题】:"Cannot convert theme color to Color" in ClosedXmlClosedXml 中的“无法将主题颜色转换为颜色”
【发布时间】:2012-06-25 23:05:56
【问题描述】:

我正在尝试使用 ClosedXml 读取 Excel 中单元格的填充背景颜色。我在this sample code 工作,能够毫无问题地读取 Excel 文档的内容,但无法将单元格的 Fill BackgroundColor 读取为十六进制值。我能够看到在 BackgroundColor 下定义的 ThemeColorThemeTint 属性,但还没有找到将它们转换为任一 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 总是抛出异常“无法将主题颜色转换为颜色”。有谁知道从 ThemeColorThemeTint 值获取 System.Color 的另一种方法?

更新:

我没有提到我已经尝试过使用 BackgroundColorColor 属性,不幸的是,它没有正确填充,如果您在调试器中查看它,那么您将看到这个属性抛出了与方法 XLColor.FromTheme 相同的异常。所以这绝对看起来像 ClosedXml 中的一个错误。有人知道解决方法吗?

【问题讨论】:

    标签: c# .net excel closedxml


    【解决方案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

    【讨论】:

    • 我已经尝试过使用 categoryName.Style.Fill.BackgroundColor.Color 但不幸的是 Color 属性从未被填充。如果我在调试模式下运行我的代码并在调试器中查看 BackgroundColor ,那么我会看到正确填充了 ThemeColor 和 ThemeTint 属性,但是 Color 属性显示了一个异常,该异常与我使用该方法得到的消息相同XLColor.FromTheme,即:“无法将主题颜色转换为颜色”。所以这似乎是 ClosedXml 中的一个错误,这就是我寻找解决方法的原因。
    • 了解了有关 ClosedXML 的新知识并更新了答案:)
    • 谢谢,Paul B。我已经实现了这个。唯一的问题是它没有考虑到 ThemeTint,因此具有相同主题名称但不同色调值的背景颜色返回相同的 System.Color。因此,例如,Background1 将始终返回白色,而不管定义的色调如何。
    • 对,没想到这一点(我以前从未使用过 Tint/Shade)。看起来您需要手动包含色调/阴影因子。我找到了一篇解释如何做的文章,并将添加答案的链接。
    • 保罗,我感谢您的回答。考虑到着色/阴影,我还没有编写算法来确定确切的颜色,但是当我有时间这样做时会在这里发布。同时,您提供的解决方案足以满足我的需要,因此我会将您的答案标记为正确。感谢您的帮助。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我发现this article 非常有用,并且运行良好。:

      刚刚在“RgbToHls”函数中发现了一个小错误,即在最小值和最大值相等的情况下不设置 alpha 值:

      if (max == min)
              {
      
                  hlsColor.H = 0;
      
                  hlsColor.S = 0;
      
                  hlsColor.L = max;
      
                 --> **hlsColor.L = a;**
                  return hlsColor;
      
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-14
        • 2019-02-08
        • 1970-01-01
        • 1970-01-01
        • 2018-11-09
        • 1970-01-01
        • 2011-08-23
        • 2012-07-07
        相关资源
        最近更新 更多