Tôi đã chiến đấu cả ngày này. Bên trong tập tin styles.xml của tôi, tôi đã thông tin màu sắc nhất định như vậy:Sự nhầm lẫn về chủ đề trong SpreadsheetML
< fgColor theme = "0" màu = "- ,249977111117893" />
ECMA 376 định nghĩa một chủ đề tham khảo màu sắc như: Index
vào < clrScheme> Bộ sưu tập, tham khảo một đặc biệt < sysClr> hoặc < srgbClr> giá trị thể hiện trong các Theme một phần.
Ok, nghe có vẻ dễ dàng. Dưới đây là một đoạn trích từ xml clrScheme tôi:
< a: tên clrScheme = "Office">
< a: DK1>
< a: sysClr val = "windowText" lastClr = "000000" />
</a: DK1>
< a: lt1>
< a: sysClr val = "cửa sổ" lastClr = "FFFFFF" />
</a: lt1>
Chỉ số 0 là màu đen và chúng muốn làm tối nó? Tôi có thể cho bạn biết rằng sau khi màu được áp dụng, màu sắc phải là # F2F2F2.
Sự nhầm lẫn của tôi là gì theme = "0" thực sự có ý nghĩa gì? Nó không thể có nghĩa là để làm tối # 000000. Việc kiểm tra MSDN chỉ làm tôi bối rối hơn nữa. Từ http://msdn.microsoft.com/en-us/library/dd560821.aspx
lưu ý rằng các chủ đề màu sắc nguyên bắt đầu đếm từ trái sang phải trong bảng bắt đầu với zero. Chủ đề màu 3 là văn bản/nền tối màu .
Thực ra, nếu bạn bắt đầu đếm ở số không, mục nhập thứ ba là Light 2. Dark 2 là mục thứ hai. Có ai ở đây làm sáng tỏ chủ đề này cho tôi không? Chủ đề = "0" thực sự có ý nghĩa gì?
Đây là mã VB6 mà tôi đã làm việc để áp dụng màu. Bạn có thể dán nó vào trình soạn thảo vba của bạn và chạy thử nghiệm phụ.
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
Điều đó thật điên rồ. Đặc tả OOXML rất rõ ràng về thứ tự, nhưng Excel hoàn toàn bỏ qua nó. –