2010-05-03 45 views
7

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 

Trả lời

6

Tôi đã xem xsl từ odf-converter.sourceforge.net và có vẻ như 0 và 1 được chuyển và 2 và 3 được chuyển. Đây là phần xsl:

<xsl:variable name="theme"> 
     <xsl:choose> 
     <xsl:when test="@theme = 0"> 
      <xsl:text>1</xsl:text> 
     </xsl:when> 
     <xsl:when test="@theme = 1"> 
      <xsl:text>0</xsl:text> 
     </xsl:when> 
     <xsl:when test="@theme = 2"> 
      <xsl:text>3</xsl:text> 
     </xsl:when> 
     <xsl:when test="@theme = 3"> 
      <xsl:text>2</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="@theme"/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

Mọi thứ bây giờ khớp với nhau. Chú ý công tắc 0 = 1, 1 = 0, 2 = 3, 3 = 2.

+0

Đ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ó. –

2

Vâng, đó là chỉ mục của màu chủ đề. 0 là "cái đầu tiên", có nghĩa là 1. Có vẻ như bạn đang làm Excel. Đối với PowerPoint, lưu ý rằng thuật toán tint/shade khác nhau - nó không dựa trên HSL mà là Linear RGB.