Formatierung der Tabellenzellen in Excel ermitteln
Variablen-Typ für Zelleigenschaften
Für die interne Speicherung der Format-Informationen der einzelnen Tabellenzellen wird ein benutzerdefinierter Typ vereinbart. Das ermöglicht die kompakte Verarbeitung aller notwendigen Zelleigenschaften.
Hier der benutzerdefinierte Typ:
Type usrBorderItem vTop As Variant vLeft As Variant vBottom As Variant vRight As Variant End Type Type usrRangeFormat lFontColor As Long iFontColorIndex As Integer bFontBold As Boolean bFontItalic As Boolean vFontSize As Variant vFontName As Variant lInteriorColor As Long iInteriorColorIndex As Integer iRangePixelWidth As Integer dRangePointsWidth As Double dRangeCharsWidth As Double iRangePixelHeight As Integer dRangePointsHeight As Double dRangeCharsHeight As Double lBorderColor As Long vBorderColor As usrBorderItem vBorderColorIndex As usrBorderItem iBorderPixelWidth As Integer vBorderWeight As usrBorderItem strBorderLineStyle As String vBorderLineStyle As usrBorderItem End Type
Funktion GetRangeFormatInfo(…)
Für die Ermittlung der Formateigenschaften der einzelnen Tabellenzellen wird die Funktion GetRangeFormatInfo benutzt.
'**
'** Informationen zur Zellformatierung holen
'**
Function GetRangeFormatInfo(ByRef rngRange As Object, ByRef usrRangeFormat As usrRangeFormat)
With usrRangeFormat
If Not IsNull(rngRange.Font.Color) Then
.lFontColor = GetColorRGBdez(rngRange.Font.Color)
Else
.lFontColor = 0
End If
If Not IsNull(rngRange.Font.Bold) Then
.bFontBold = rngRange.Font.Bold
Else
.bFontBold = False
End If
If Not IsNull(rngRange.Font.Italic) Then
.bFontItalic = rngRange.Font.Italic
Else
.bFontItalic = False
End If
If Not IsNull(rngRange.Font.Size) Then
.vFontSize = rngRange.Font.Size
Else
.vFontSize = 11
End If
If Not IsNull(rngRange.Font.Name) Then
.vFontName = rngRange.Font.Name
Else
.vFontName = "Arial"
End If
.lInteriorColor = GetColorRGBdez(rngRange.Interior.Color)
.dRangeCharsWidth = GetCellCharsWidth(rngRange)
.iRangePixelWidth = GetCellPixelWidth(rngRange, 96)
.dRangeCharsHeight = GetCellCharsHeight(rngRange)
.iRangePixelHeight = GetCellPixelHeight(rngRange, 96)
.lBorderColor = GetColorRGBdez(rngRange.Borders.Color)
With .vBorderColor
.vBottom = GetColorRGBdez(rngRange.Borders.Item(xlEdgeBottom).Color)
.vLeft = GetColorRGBdez(rngRange.Borders.Item(xlEdgeLeft).Color)
.vRight = GetColorRGBdez(rngRange.Borders.Item(xlEdgeRight).Color)
.vTop = GetColorRGBdez(rngRange.Borders.Item(xlEdgeTop).Color)
End With
.strBorderLineStyle = GetLineStyle(rngRange.Borders.LineStyle)
With .vBorderLineStyle
.vBottom = rngRange.Borders.Item(xlEdgeBottom).LineStyle
.vLeft = rngRange.Borders.Item(xlEdgeLeft).LineStyle
.vRight = rngRange.Borders.Item(xlEdgeRight).LineStyle
.vTop = rngRange.Borders.Item(xlEdgeTop).LineStyle
End With
.iBorderPixelWidth = GetPixelWidth(rngRange.Borders.Weight)
With .vBorderWeight
.vBottom = GetPixelWidth(rngRange.Borders.Item(xlEdgeBottom).Weight)
.vLeft = GetPixelWidth(rngRange.Borders.Item(xlEdgeLeft).Weight)
.vRight = GetPixelWidth(rngRange.Borders.Item(xlEdgeRight).Weight)
.vTop = GetPixelWidth(rngRange.Borders.Item(xlEdgeTop).Weight)
End With
End With
End Function
Schriftstile ermitteln
If Not IsNull(rngRange.Font.Bold) Then
.bFontBold = rngRange.Font.Bold
Else
.bFontBold = False
End If
If Not IsNull(rngRange.Font.Italic) Then
.bFontItalic = rngRange.Font.Italic
Else
.bFontItalic = False
End If
In der vorliegenden Version des Makros werden nur die Schriftstile „fett“ (rngRange.Font.Bold) und „kursiv“ (rngRange.Font.Italic) ausgewertet und als CSS-Eigenschaft eingefügt. Die Schriftstile werden in Excel im Datentyp Boolean gespeichert. Abhängig vom ausgewähltem Bereich kann es vorkommen das die beiden Werte undefiniert sind und den Wert Null liefern. Das muss bei der Wertzuweisung abgefangen werden.
Schriftgröße und Font ermitteln
If Not IsNull(rngRange.Font.Size) Then
.vFontSize = rngRange.Font.Size
Else
.vFontSize = 11
End If
If Not IsNull(rngRange.Font.Name) Then
.vFontName = rngRange.Font.Name
Else
.vFontName = "Arial"
End If
Excel liefert die Zeichengröße in Punkten (Points). Der Bezugswert sind 72 Pixel/Inch. Im Makro erfolgt die Umrechnung mit einer Bildschirmauflösung von 96 Pixel/Inch. Für die Festlegung der Schriftgröße über font-size in Pixeln wird deshalb Round(usrFormatInfo.vFontSize * vScreenRes / 72) verwendet. vScreenRes ist 96 Pixel/Inch.
Spaltenbreite und Zeilenhöhe
Function GetCellPixelWidth(ByRef rngRange As Range, ByVal iScreenResolution As Integer)
Dim vRangePoints, vRangeChars, vRangePixels As Variant
vRangeChars = 0
vRangePoints = 0
If Not IsNull(rngRange.Width) Then
vRangePoints = rngRange.Width
End If
If Not IsNull(rngRange.ColumnWidth) Then
vRangeChars = rngRange.ColumnWidth
End If
vRangePixels = (vRangePoints / 72) * iScreenResolution 'pixel width of column
GetCellPixelWidth = vRangePixels
End Function
Function GetCellPixelHeight(ByRef rngRange As Range, ByVal iScreenResolution As Integer)
Dim vRangePoints, vRangeChars, vRangePixels As Variant
vRangeChars = 0
vRangePoints = 0
If Not IsNull(rngRange.Height) Then
vRangePoints = rngRange.Height
End If
If Not IsNull(rngRange.RowHeight) Then
vRangeChars = rngRange.RowHeight
End If
vRangePixels = (vRangePoints / 72) * iScreenResolution 'pixel width of column
GetCellPixelHeight = vRangePixels
End Function
Excel liefert die Spaltenbreite in Punkten in Width und die Zeilenhöhe in Punkten in Height. Die Umrechnung von Punkten in Pixel erfolgt auf gleiche Weise, wie zuvor bei der Schriftgröße.
Farben ermitteln
Um die Farben als echten Farbwert zu erhalten, der dann als RGB-Wert in CSS eingebunden werden kann, muss man die Eigenschaft Color auswerten. Für die Verwendung im Style-Sheet muss der Farbwert umgeformt werden. Das leistet die Funktion GetColorRGBdez.
Private Function lGetColorRGBdez(ByVal lColor As Long) As Long
Dim strHelp1, strHelp2 As String
Dim lFarbwert As Long
strHelp1 = Hex(lColor)
strHelp1 = Application.WorksheetFunction.Dec2Hex(lColor, 6)
strHelp2 = Mid(strHelp1, 5, 2) & Mid(strHelp1, 3, 2) & Mid(strHelp1, 1, 2)
lFarbwert = Application.WorksheetFunction.Hex2Dec(strHelp2)
GetColorRGBdez = lFarbwert
End Function
Rahmenbreiten
Excel liefert Rahmenbreiten nicht in Pixeln oder Punkten, sondern hat fest definierten Breiten, die als VBA-Konstanten geliefert werden. Mit der Funktion GetPixelWidth werden entsprechende Werte in Pixeln fest zugewiesen.
Private Function vGetPixelWidth(ByVal vWeight As Variant) As Variant
Select Case vWeight
Case xlHairline:
GetPixelWidth = 1
Case xlMedium:
GetPixelWidth = 2
Case xlThick:
GetPixelWidth = 4
Case xlThin:
GetPixelWidth = 1
Case Else
GetPixelWidth = 0
End Select
End Function
Linienstile der Rahmen
Linienstile können nur mit Einschränkungen von Excel übernommen werde, da mit CSS weniger Varianten zur Verfügung stehen. Excel codiert die Linienstile über VBA-Konstanten. Die Funktion vGetLineStyle setzt die Werte in CSS-Eigenschaften um.
Private Function vGetLineStyle(ByVal vLineStyle As Variant) As Variant
Select Case vLineStyle
Case xlContinuous:
vGetLineStyle = "solid"
Case xlDash:
vGetLineStyle = "dashed"
Case xlDashDotDot:
vGetLineStyle = "dotted"
Case xlDot:
vGetLineStyle = "dotted"
Case xlDouble:
vGetLineStyle = "double"
Case xlLineStyleNone:
vGetLineStyle = "none"
Case xlSlantDashDot:
vGetLineStyle = "groove"
Case Else
vGetLineStyle = "none"
End Select
End Function
Das komplette Makro
Makro für HTML5
Das komplette Makro Excel2HTML5(usrHTML5-Tabellen-V0.3) gibt es hier.
Im Excel-VBA-Editor kann die Datei als Modul importiert werde. Vorsicht ist mit dem bTestFlag geboten. Wenn es auf TRUE gesetzt wird, werden Testausgaben ins aktive Tabellenblatt geschrieben. Das kann zur Zerstörung des Inhaltes führen.
Makro für (X)HTML
Das komplette Makro Exce2HTML (usrXHTMLTabellen-V0.3) gibt es hier.
Im Excel-VBA-Editor kann die Datei als Modul importiert werde. Vorsicht ist mit dem bTestFlag geboten. Wenn es auf TRUE gesetzt wird, werden Testausgaben ins aktive Tabellenblatt geschrieben. Das kann zur Zerstörung des Inhaltes führen.
Rahmen-Makro zum Aufruf in Excel
Optimierungen – Reduzierung der Zeichenzahl des HTML-Codes
CSS-Eigenschaften die sich auf Container bzw. Boxen beziehen und damit vier verschiedene Werte erhalten können, dürfen in CSS in verkürzter Schreibweise angegeben werden. Das gilt zum Beispiel für border, border-color, border-style, border-width, margin, padding etc. Bei der verkürzten Schreibweise werden die Eigenschaften vom Browser je nach Anzahl der Werte zugewiesen.
Es gilt:
- Eine Angabe/Wert: für alle 4 Eigenschaften gilt derselbe Wert, die selbe Angabe
- Zwei Angaben/Werte: 1. Wert für oben und unten, eigenschaft-top und eigenschaft-bottom, 2. Wert für links und rechts, eigenschaft-left und eigenschaft-right
- Drei Angaben/Werte: 1. Wert für oben, eigenschaft-top, 2. Wert für links und rechts, eigenschaft-left und eigenschaft-right, 3. Wert für unten, eigenschaft-bottom
- Vier Angaben/Werte: 1. Wert für oben, eigenschaft-top, 2. Wert für rechts, eigenschaft-right, 3. Wert für unten, eigenschaft-bottom, 4. Wert für links, eigenschaft-left
Die folgenden Funktionen prüfen die aus Excel ermittelten Eigenschaften und liefern jeweils eine Zeichenkette mit den notwendigen Angaben für die CSS-Eigenschaft.
Rahmenfarben in verkürzter Schreibweise
Private Function strGetColorCSS(ByRef usrRangeFormat As usrRangeFormat) As String
Dim lColorTop, lColorRight, lColorBottom, lColorLeft As Long
lColorTop = usrRangeFormat.vBorderColor.vTop
lColorRight = usrRangeFormat.vBorderColor.vRight
lColorBottom = usrRangeFormat.vBorderColor.vBottom
lColorLeft = usrRangeFormat.vBorderColor.vLeft
If (lColorTop = lColorBottom) And (lColorLeft = lColorRight) And (lColorTop <> lColorRight) Then
strGetColorCSS = "#" & Application.WorksheetFunction.Dec2Hex(lColorTop, 6) & " " & _
"#" & Application.WorksheetFunction.Dec2Hex(lColorRight, 6)
ElseIf (lColorLeft = lColorRight) And (lColorTop <> lColorBottom) Then
strGetColorCSS = "#" & Application.WorksheetFunction.Dec2Hex(lColorTop, 6) & " " & _
"#" & Application.WorksheetFunction.Dec2Hex(lColorRight, 6) & " " & _
"#" & Application.WorksheetFunction.Dec2Hex(lColorBottom, 6)
ElseIf (lColorLeft <> lColorRight) And (lColorTop <> lColorBottom) Then
strGetColorCSS = "#" & Application.WorksheetFunction.Dec2Hex(lColorTop, 6) & " " & _
"#" & Application.WorksheetFunction.Dec2Hex(lColorRight, 6) & " " & _
"#" & Application.WorksheetFunction.Dec2Hex(lColorBottom, 6) & " " & _
"#" & Application.WorksheetFunction.Dec2Hex(lColorLeft, 6)
ElseIf (lColorLeft <> lColorRight) And (lColorTop = lColorBottom) Then
strGetColorCSS = "#" & Application.WorksheetFunction.Dec2Hex(lColorTop, 6) & " " & _
"#" & Application.WorksheetFunction.Dec2Hex(lColorRight, 6) & " " & _
"#" & Application.WorksheetFunction.Dec2Hex(lColorBottom, 6) & " " & _
"#" & Application.WorksheetFunction.Dec2Hex(lColorLeft, 6)
Else
strGetColorCSS = "#" & Application.WorksheetFunction.Dec2Hex(lColorTop, 6)
End If
End Function
Rahmenbreiten in verkürzter Schreibweise
Private Function strGetLineWidthCSS(ByRef usrRangeFormat As usrRangeFormat) As String
Dim iLineWidthTop, iLineWidthRight, iLineWidthBottom, iLineWidthLeft As Integer
iLineWidthTop = usrRangeFormat.vBorderWeight.vTop
iLineWidthRight = usrRangeFormat.vBorderWeight.vRight
iLineWidthBottom = usrRangeFormat.vBorderWeight.vBottom
iLineWidthLeft = usrRangeFormat.vBorderWeight.vLeft
If (iLineWidthTop = iLineWidthBottom) And (iLineWidthLeft = iLineWidthRight) And (iLineWidthTop <> iLineWidthRight) Then
strGetLineWidthCSS = iLineWidthTop & "px" & " " & _
iLineWidthRight & "px"
ElseIf (iLineWidthLeft = iLineWidthRight) And (iLineWidthTop <> iLineWidthBottom) Then
strGetLineWidthCSS = iLineWidthTop & "px" & " " & _
iLineWidthRight & "px" & " " & _
iLineWidthBottom & "px"
ElseIf (iLineWidthLeft <> iLineWidthRight) And (iLineWidthTop <> iLineWidthBottom) Then
strGetLineWidthCSS = iLineWidthTop & "px" & " " & _
iLineWidthRight & "px" & " " & _
iLineWidthBottom & "px" & " " & _
iLineWidthLeft & "px"
ElseIf (iLineWidthLeft <> iLineWidthRight) And (iLineWidthTop = iLineWidthBottom) Then
strGetLineWidthCSS = iLineWidthTop & "px" & " " & _
iLineWidthRight & "px" & " " & _
iLineWidthBottom & "px" & " " & _
iLineWidthLeft & "px"
Else
strGetLineWidthCSS = iLineWidthTop & "px"
End If
End Function
Rahmenstile in verkürzter Schreibweise
Private Function strGetLineStyleCSS(ByRef usrRangeFormat As usrRangeFormat) As String
Dim strStyleTop, strStyleRight, strStyleBottom, strStyleLeft As String
strStyleTop = vGetLineStyle(usrRangeFormat.vBorderLineStyle.vTop)
strStyleRight = vGetLineStyle(usrRangeFormat.vBorderLineStyle.vRight)
strStyleBottom = vGetLineStyle(usrRangeFormat.vBorderLineStyle.vBottom)
strStyleLeft = vGetLineStyle(usrRangeFormat.vBorderLineStyle.vLeft)
If (strStyleTop = strStyleBottom) And (strStyleLeft = strStyleRight) And (strStyleTop <> strStyleRight) Then
strGetLineStyleCSS = strStyleTop & " " & _
strStyleRight
ElseIf (strStyleLeft = strStyleRight) And (strStyleTop <> strStyleBottom) Then
strGetLineStyleCSS = strStyleTop & " " & _
strStyleRight & " " & _
strStyleBottom
ElseIf (strStyleLeft <> strStyleRight) And (strStyleTop <> strStyleBottom) Then
strGetLineStyleCSS = strStyleTop & " " & _
strStyleRight & " " & _
strStyleBottom & " " & _
strStyleLeft
ElseIf (strStyleLeft <> strStyleRight) And (strStyleTop = strStyleBottom) Then
strGetLineStyleCSS = strStyleTop & " " & _
strStyleRight & " " & _
strStyleBottom & " " & _
strStyleLeft
Else
strGetLineStyleCSS = strStyleTop
End If
End Function
