1


更新:如果您需要在 office 文档(格式 2007)中确定 rgb-color,请查看下面的答案。

有:

  • 来自 VS2010 PIA 的 Interop.Word.dll ver.14,
  • VS2010快捷版
  • 微软 Word 2010 (ver.14)
  • .docx 文件在提到的 Word 中手动制作,无需互操作。文件包含几个带有彩色角单元格的表格。

目的: 使用 Interop 构建另一个 .docx 文件,其中包含根据角落颜色填充渐变颜色的表格。
出现问题的地方:我需要将表格角落的颜色从WdColortoSystem.Drawing.Color转换为计算渐变。所以我使用细胞的Shading.BackgroundPatternColor属性。而且我发现有时它包含正确的 BGR 24 位值,有时它不包含。
仅当单元格具有主题调色板颜色之一时才会出现第二种情况(标准和 rgb 调色板颜色效果很好,但主题调色板颜色会导致问题)。例如,当我设置0x00F2F2F2(最浅的灰色)颜色时,它会document.xml正确存储在 .docx 文件存档中,但Shading.BackgroundPatternColor属性设置为0xDC00F2FF. 所以ColorTranslator.FromOle返回不同的颜色。
顺便说一句,枚举中这个灰色没有 WdColor 。wdColorGray05 = 0xF3F3F3.Net Reflector带来的最浅灰色。这意味着并非所有调色板默认颜色都对应于枚举颜色。
此外,如果我在 Word 的 RGB 调色板中手动设置相同的颜色(即 242、242、242),保存文件并通过 Interop 再次打开 - 颜色将正确设置为0x00F2F2F2
问题:有人遇到过这个问题吗?如何从Shading.BackgroundPatternColor属性中正确检索 RGB 颜色?为什么此属性与存储在中的值不对应document.xml

4

1 回答 1

3

这是我第二次在从办公文档中检索 RGB 颜色时遇到问题。第一次是 Excel 2007 .xlsx 文件格式,现在是 Word 2010 .docx(尽管仍然是 2007 格式)。因此,经过一番搜索,我决定为所有遇到同样麻烦的人回答我自己的问题。

如需更深入的解释和示例,我会将您发送到对我有很大帮助的文章。由于本文中使用的示例可能对 C# 开发人员来说更难阅读,因为它们是在 VBA 上编写的,因此我附上了我的rgb color retriever实现的链接。

所以。如果您打开其中一个 Office 程序(尤其是 Excel 或 Word),您可以设置大多数对象、文本、背景等的颜色。并且会显示一个对话框来选择它。在 Office 2007 或更高版本中,您将看到一组 10standard种颜色和一组 60 种颜色based on theme。如果单击“更多颜色..”,您将能够从预定颜色集或 RGB 调色板中选择颜色。

您从该对话框中选择颜色的方式决定了存储颜色的格式。存储颜色值的属性是一个 32 位整数,其中第一个最高有效字节(我们称之为FormatByte)用于格式规范,另一个 24 位用于颜色值或其他任何内容(我们称之为 24 位ColorValue)。以下是可能的格式规范:

  • FormatByte == 0x00
    ColorValue是常见的 BGR 值。在 C# 中,您可以通过ColorTranslator.FromOle(ColorValue);. 当您选择标准颜色或从“更多颜色..”对话框(预定或调色板)中选择一种颜色时,使用此格式。

  • FormatByte == 0xFF
    ColorValue将是 0x000000。这是wdColorAutomatic价值。这是一种对比色,这就是我所知道的一切(在我的情况下,它始终是白色的背景和黑色的字体)。没有更多地研究它。

  • FormatByte == 0x80
    ColorValue将在 [0x000000, 0x000018] 范围内。这些颜色可以在文档中的 ActiveX 控件中遇到。这是一个系统KnownColors(有 ac# 超集 -System.Drawing.KnownColor包含该值)。如果我理解正确,您也可以通过 检索 RGB ColorTranslator.FromOle(_color);_color所有 32 位属性值在哪里,因为由于 ColorTranslator.FromOle() 的反射实现,它会检查颜色是否来自 KnownColor 枚举。但是在解析 Office 文件以进行审批时,我从未遇到过这些值。

  • FormatByte in range [0xD4, 0xDF]
    在这种情况下,您处理 color based on theme。它表示为基色和色调或阴影偏移的指数。

让我们更深入地看一下最后一个案例,因为有更多的困难。
如您所见,前半部分FormatByte始终是0xD,而另一半则从0x40xF。后半部分是 10 种基色之一的索引。

Word 中有一个用于该索引的 wdThemeColorIndex 枚举,它可以转换为更基本的 Office msoThemeColorSchemeIndex 枚举(它放置在Microsoft.Office.Core.dll其中可以从 tabPage 链接到.COMXX.0 Microsoft Office XX.0 Object Library- Office 版本)。您可以查看上面链接的文章以获取翻译表或 VBA 函数或我对 C# 方法的实现。从这个 msoThemeColorSchemeIndex 我们可以得到 RGB 属性ActiveDocument.DocumentTheme
然后我们从 中检索色调或阴影ColorValue,将基色转换为 HSL(色调、饱和度、亮度),对其应用色调或阴影并将结果转换回 RGB。

于 2013-05-27T15:27:58.093 回答