2010-05-03 18 views
7

He estado luchando contra esto todo el día. Dentro de mi archivo styles.xml he dado la información de color de este modo:Confusión de tema en SpreadsheetML

< tema fgcolor = "0" tinte = "- ,249977111117893" />

ECMA 376 define una referencia de color como tema: Índice

en el < clrScheme> colección, referencia a un particular, < sysClr> o < srgbClr> valor expresado en el Tema parte.

Ok, eso suena fácil. He aquí un extracto de mi xml clrScheme:

< A: nombre clrScheme = "Oficina">
< a: dk1>
< a: sysClr val = "windowText" lastClr = "000000" />
</a: dk1>
< a: LT1>
< a: sysClr val = "ventana" lastClr = "FFFFFF" />
</a: LT1>

¿El índice cero es negro y quieren oscurecerlo? Puedo decirte que después de aplicar el tinte, el color debe ser # F2F2F2.

Mi confusión es ¿qué quiere decir theme = "0" realmente? No puede significar oscurecer # 000000. Verificar MSDN solo me confunde aún más. De http://msdn.microsoft.com/en-us/library/dd560821.aspx

nota que el color entero tema comienza a contar de izquierda a derecha en la paleta a partir de cero. El tema color 3 es el color oscuro 2 texto/fondo color.

En realidad, si empiezas a contar en cero, la tercera entrada es Luz 2. Oscuro 2 es la segunda. ¿Puede alguien aquí arrojar algo de luz sobre este tema para mí? ¿Qué significa theme = "0" realmente?

Aquí está el código VB6 con el que he estado trabajando para aplicar el tinte. Puede pegarlo en su editor vba y ejecutar el sub test.

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 

Respuesta

6

Fui a ver el XSL de odf-converter.sourceforge.net y parece que 0 y 1 se encienden y 2 y 3 son conmutados. Aquí está la parte 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> 

Todo está coincidiendo ahora. Observe el 0 = 1, 1 = 0, 2 = 3, 3 = 2 interruptor.

+0

Eso es una locura. La especificación OOXML es muy explícita sobre el orden, pero Excel la ignora por completo. –

2

Sí, es el índice del color del tema. 0 es "el primero", lo que significa 1. Parece que estás haciendo Excel. Para PowerPoint, tenga en cuenta que el algoritmo de tinte/sombra es diferente; no se basa en HSL sino en Linear RGB.