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

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

// 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方法总是抛出exception“无法将主题颜色转换为颜色”。 有没有人知道从ThemeColorThemeTint值获取System.Color的另一种方法?

更新:

我没有提到我已经尝试使用BackgroundColorColor属性,遗憾的是这没有正确填充,如果你在调试器中查看它,那么你会看到这个属性抛出了我用方法XLColor获得的exception。 FromTheme 。 所以这肯定看起来像ClosedXml中的一个错误。 有谁知道解决方法?

我认为如果需要,您需要评估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 。

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

我发现这篇文章非常有用,并且工作正常:

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

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