1

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

// 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的另一种方法?

更新:

我没有提到我已经尝试过使用BackgroundColor的Color属性,不幸的是它没有正确填充,如果你在调试器中查看它,你会看到这个属性抛出了与方法XLColor 相同的异常。来自主题。所以这绝对看起来像 ClosedXml 中的一个错误。有谁知道解决方法?

4

3 回答 3

2

如果需要,我认为您需要评估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 指出的那样,这忽略了 tinting/shading。ClosedXML 似乎不支持这一点,因此必须手动计算。Office 使用的算法可以在这里找到:http ://social.msdn.microsoft.com/Forums/en-HK/oxmlsdk/thread/f6d26f2c-114f-4a0d-8bca-a27442aec4d0 。

于 2012-06-26T07:05:56.830 回答
0

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

于 2012-06-26T04:54:01.513 回答
0

我发现这篇文章非常有用,并且运行良好。:

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

if (max == min)
        {

            hlsColor.H = 0;

            hlsColor.S = 0;

            hlsColor.L = max;

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

        }
于 2013-01-04T16:33:44.340 回答