Я боролся с этим весь день. Внутри моего файла styles.xml я информация о цвете дается следующим образом:Смешение темы в SpreadsheetML
< fgColor тема = "0" Оттенок = "- +0,249977111117893" />
ECMA 376 определяет цвет ссылки темы как: Индекс
< в clrScheme> коллекции, ссылки на конкретный < sysClr> или < srgbClr> значение, выраженное в теме часть.
Хорошо, это звучит просто. Вот отрывок из моего clrScheme XML:
< а: имя clrScheme = "Управление">
<: с ДК1>
<: с sysClr вал = "WindowText" lastClr = "000000" />
</а: ДК1>
<: с LT1>
<: с sysClr вал = "окно" lastClr = "FFFFFF" />
</а: LT1>
Индексный ноль черный, и они хотят его затемнить? Я могу сказать вам, что после применения оттенка цвет должен быть # F2F2F2.
Мое замешательство - это то, что действительно означает тема = "0"? Невозможно означать, чтобы затемнить # 000000. Проверка MSDN только смущает меня еще больше. Из http://msdn.microsoft.com/en-us/library/dd560821.aspx
отмечают, что цвет темы целое начинает отсчет слева направо в палитра, начиная с нуля. Тема цвет 3 - темный 2 текст/фон цвет.
Фактически, если вы начинаете считать в нуле, третья запись - это свет 2. Темная 2 - вторая. Может ли кто-нибудь здесь пролить свет на эту тему для меня? Что означает тема = «0»?
Вот код VB6, с которым я работал, чтобы применить оттенок. Вы можете вставить его в свой редактор vba и запустить тестовый суб.
Public Type tRGB
R As Byte
G As Byte
B As Byte
End Type
Public Type tHSL
H As Double
S As Double
L As Double
End Type
Sub TestRgbTint()
Dim c As tRGB
RGB_Hex2Type "ffffff", c
RGB_ApplyTint c, -0.249977111117893
Debug.Print Hex(c.R) & Hex(c.G) & Hex(c.B)
End Sub
Public Sub RGB_Hex2Type(ByVal HexString As String, RGB As tRGB)
'Remove the alpha channel if it exists
If Len(HexString) = 8 Then
HexString = mID(HexString, 3)
End If
RGB.R = CByte("&H" & Left(HexString, 2))
RGB.G = CByte("&H" & mID(HexString, 3, 2))
RGB.B = CByte("&H" & Right(HexString, 2))
End Sub
Public Sub RGB_ApplyTint(RGB As tRGB, tint As Double)
Const HLSMAX = 1#
Dim HSL As tHSL
If tint = 0 Then Exit Sub
RGB2HSL RGB, HSL
If tint < 0 Then
HSL.L = HSL.L * (1# + tint)
Else
HSL.L = HSL.L * (1# - tint) + (HLSMAX - HLSMAX * (1# - tint))
End If
HSL2RGB HSL, RGB
End Sub
Public Sub HSL2RGB(HSL As tHSL, RGB As tRGB)
HSL2RGB_ByVal HSL.H, HSL.S, HSL.L, RGB
End Sub
Private Sub HSL2RGB_ByVal(ByVal H As Double, ByVal S As Double, ByVal L As Double, RGB As tRGB)
Dim v As Double
Dim R As Double, G As Double, B As Double
'Default color to gray
R = L
G = L
B = L
If L < 0.5 Then
v = L * (1# + S)
Else
v = L + S - L * S
End If
If v > 0 Then
Dim m As Double, sv As Double
Dim sextant As Integer
Dim fract As Double, vsf As Double, mid1 As Double, mid2 As Double
m = L + L - v
sv = (v - m)/v
H = H * 6#
sextant = Int(H)
fract = H - sextant
vsf = v * sv * fract
mid1 = m + vsf
mid2 = v - vsf
Select Case sextant
Case 0
R = v
G = mid1
B = m
Case 1
R = mid2
G = v
B = m
Case 2
R = m
G = v
B = mid1
Case 3
R = m
G = mid2
B = v
Case 4
R = mid1
G = m
B = v
Case 5
R = v
G = m
B = mid2
End Select
End If
RGB.R = R * 255#
RGB.G = G * 255#
RGB.B = B * 255#
End Sub
Public Sub RGB2HSL(RGB As tRGB, HSL As tHSL)
Dim R As Double, G As Double, B As Double
Dim v As Double, m As Double, vm As Double
Dim r2 As Double, g2 As Double, b2 As Double
R = RGB.R/255#
G = RGB.G/255#
B = RGB.B/255#
'Default to black
HSL.H = 0
HSL.S = 0
HSL.L = 0
v = IIf(R > G, R, G)
v = IIf(v > B, v, B)
m = IIf(R < G, R, G)
m = IIf(m < B, m, B)
HSL.L = (m + v)/2#
If HSL.L < 0 Then
Exit Sub
End If
vm = v - m
HSL.S = vm
If HSL.S > 0 Then
If HSL.L <= 0.5 Then
HSL.S = HSL.S/(v + m)
Else
HSL.S = HSL.S/(2# - v - m)
End If
Else
Exit Sub
End If
r2 = (v - R)/vm
g2 = (v - G)/vm
b2 = (v - B)/vm
If R = v Then
If G = m Then
HSL.H = 5# + b2
Else
HSL.H = 1# - g2
End If
ElseIf G = v Then
If B = m Then
HSL.H = 1# + r2
Else
HSL.H = 3# - b2
End If
Else
If R = m Then
HSL.H = 3# + g2
Else
HSL.H = 5# - r2
End If
End If
HSL.H = HSL.H/6#
End Sub
Это просто сумасшествие. Спецификация OOXML очень подробно описывает порядок, но Excel полностью игнорирует его. –