Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Zelle als HTML | Herbers Excel-Forum


Betrifft: Zelle als HTML von: Rene
Geschrieben am: 22.01.2010 19:10:10

Hallo Zusammen,

ich habe eine Frage.
Ich möchte eine einzelne Zelle samt Inhalt UND allen Formaten in HTML umwandeln und in den HTML-Code in einer Variablen speichern. geht das?

Bisland habe ich folgendes versucht:

With ActiveWorkbook.PublishObjects.Add(xlSourceRange, _
"C:\Users\Benutzer\Desktop\Mappe1.htm", "Tabelle1", "$E$12", xlHtmlStatic _
, "Mappe1_16679", "")
.Publish (True)
.AutoRepublish = False

End With

So bekomme ich aber nur eine Datei. Die ist zwar vom Ergebnis her schon ganz gut, aber ich will ja nicht immer wieder Dateien anlegen, auslesen und wieder löschen.

Hintergrund ist: Ich möchte die werte aus der Excel-Liste holen, mit allen Formaten in HTML umwandeln und dann in einer Oracle-DB speichern. Und bisher speichere ich die Werte nur ohne Formate...

Kann mir jemand helfen?

Ansonsten schönes WE!

Grüße
René

  

Betrifft: excel-jeanie von: Tino
Geschrieben am: 22.01.2010 19:54:49

Hallo,
schau mal hier.

http://www.excel-jeanie-html.de/html/down.php

Gruß Tino


  

Betrifft: AW: excel-jeanie von: Rene
Geschrieben am: 23.01.2010 12:35:48

Halo Tino,


danke für den Tipp, aber eine Lösung, bei der auf jedem Benutzer-Rechner ein nicht freigegebenes AddIn installieren muss, ist leider nicht möglich.

Grüße
René


  

Betrifft: AW: Zelle als HTML von: Josef Ehrensberger
Geschrieben am: 22.01.2010 20:04:52

Hallo René,

das ist aber der einfachste Weg.

Das lässt sich ganz bequem als Funktion nutzen.

Schau auf diese Seite http://www.rondebruin.nl/mail/folder3/mail4.htm

Da findest du die Funktion RangeToHTML, du gibst einfach den Bereich an
und erhälst als Rückgabewert den HTML-String.


Gruß Sepp



  

Betrifft: AW: Zelle als HTML von: Rene
Geschrieben am: 23.01.2010 12:01:52

Hallo Sepp,

dank Dir für den Tipp. Das ist schon ganz gut, aber zum einen entsteht da ein wirklich mächter Codeblock für ein paar wenige Zeilen Inhalt. Zum anderen werden Formate, die sich innerhalb der Zelle ändern nicht erkannt.
Ich dachte beim HTML eher an sowas (ohne CSS):


<font color="RED">roter Text1 </font color><font color="BLUE"><b>Dicker blauer Text </b>dünner blauer Text</font color>

Geht das generisch oder muss ich wirklich jede Zelle einzeln parsen???

Grüße
René


  

Betrifft: AW: Zelle als HTML von: Josef Ehrensberger
Geschrieben am: 23.01.2010 13:04:12

Hallo René,

ja dann musst du wohl selber eine Code dafür schreiben, der die von dir gewünschten Infos
ausliest und entsprechend in HTML umsetzt.

Ich kann dir dabei helfen, wenn du genau beschreibst, welche Informationen ausgelesen
werden sollen.


Gruß Sepp



  

Betrifft: AW: Zelle als HTML von: Rene
Geschrieben am: 23.01.2010 13:16:12

Hallo Sepp,

das ist doch mal ein Angebot! :-)

Also es geht darum:
ich möchte aus einer Zelle die Inhalte incl. aller Formate in einer Oracle-DB speichern.
Bisher speichere ich nur den Text in der DB.
Jetzt möchte ich aber noch die Formate des Textes speichern und zwar in HTML und ohne CSS.
Wenn nun also der Text fett ist dann soll ein html-Tag für fett davor, ebenso für die Schriftfarbe, für kursiv, Zeilenumbrüche usw.
Ich stelle mir das so vor wie in meinem Beitrag zuvor. Und ich habe die idealistische Vorstellung, dass sowas generisch gehen könnte.
Wenn ich etwa eine einzelne Zelle aus Excel herauskopiere und bspw. in Expression Web einfüge, dann wird die Zelle mit genau der exakten Formatierung, die in Excel vorliegt (also auch mehrere Schriftfarben pro Zelle) übernommen.
Also grundsätzlich scheint das ja über die Zwischenablage zu gehen, aber wie...?

Ich würde also nicht nur den Text übernehmen, sondern vorne, zwischendrin und hinten jeweils die html-Tags dazupacken und das Ganze dann eben als String (im Oracle bisher als varchar2, wenn zu lang wird dann vielleicht als BLOB) abspeichern.

Hast du da einen Ansatz, wie ich nicht jedes einzelne Zeichen parsen muss?

Grüße
René


  

Betrifft: AW: Zelle als HTML von: Josef Ehrensberger
Geschrieben am: 23.01.2010 14:53:19

Hallo Renè,

also ohne jedes Zeichen einzeln zu parsen sehe ich da keinen Weg.


Gruß Sepp



  

Betrifft: Das sehe ich fast genauso,... von: Luc:-?
Geschrieben am: 23.01.2010 17:01:07

...René & Sepp,
denn ich musste das auch so machen!
Ist dir eigentlich klar, René,
was das für ein riesiger Arbeitsaufwand ist, alle möglichen Zellformate mit HTML abzubilden? Ich arbeite daran schon seit Monaten und finde immer noch Formate, die nicht 100%ig wiedergegeben wdn...
Wenn du da 'n paar Spezialisten unter den Usern hast, wird das Ganze richtig aufwendig. Außerdem ist es ein Unterschied, ob du wirklich alle Formate oder nur die aktuell wirksamen in HTML codieren willst. Nur Letzteres würde nämlich in HTML Sinn machen, falls das auch angwendet wdn soll. Das ganze Format kann man dann ja anderweitig bzw separat in Teilen dokumentieren.
Zuerst solltest du also genau wissen, wofür es gebraucht wird, was dazu erforderlich ist und wie das organisiert wdn soll. Dann benötigst du Routinen, die dir ein Zellformat in der erforderlichen Detailliertheit exakt wiedergeben können. Erst zum Schluss kommt HTML ins Spiel. Da musst du dir dann überlegen wie du xl/vbBezeichnungen in HTML-Bezeichnungen überträgst. Nicht alle xlFormatierungen sind HTML-kompatibel bzw -übersetzbar, da musst du dann Entscheidungen treffen...
Ich bin jedenfalls auf 12 Format-Hptpkte gekommen — unter xl12 könnten es noch mehr wdn.
Nehmen wir mal dein Bsp mit den verschieden Textfarben in einer Zelle...
Eine Zelle kann ein intern bedingtes Format enthalten, mit dem man schon vor xl12 4 verschiedene Farben inhaltsabhängig für die ganze Zelle festlegen konnte. Eine 5.Farbe kann man primär einstellen, die wird dann bei Fehlerwerten wirksam. Das Primat hat aber die (extern) bedingte Formatierung zu der jeweils erfüllten Bedingung. Das waren vor xl12 nur 3, können nun aber sehr viele sein. Die müssen alle abgeprüft wdn, wenn du einen HTML-Code willst, der den aktuellen Realzustand darstellt. Jetzt gab es bisher noch interessante Nebeneffekte. Ist der Zellinhalt bspw 2farbiger Text, musst du das zeichenweise prüfen, weil das Ergebnis für den gesamten Text in diesem Fall stets Null ist. Also, ist IsNull(...Font.ColorIndex) Wahr, musst du Einzelzeichen prüfen sonst nicht. Hast du ein intern bedingtes Format mit einer Farbe für Text vereinbart, also z.b. 0;-0;0;[Rot]@ wird der ganze Text stets rot, auch wenn er eigentlich 2farbig ist (nimmst du die nämlich wieder weg, ist er wieder 2farbig!). Hast du aber eine (extern) bedingte Formatierung mit erfüllter Bedingung =ISTTEXT(...) und Blau darauf zu liegen, hat die das Primat und es wird nur der 1.Teil des 2farbigen Textes Blau, der Rest behält die ursprgl Farbe(n). Hast du aber außerdem noch eine intern bedingte Farbe für Text vereinbart (hier [Rot]@), wird der ganze Text bei erfüllter externer Bedingung Blau...
Wenn das unter xl12 immer noch so ist, bilde das mal mit HTML nach...!
Viel Spaß ihr beiden beim Werkeln, aber vorerst mal schöSo!
Gruß Luc :-?


  

Betrifft: AW: Das sehe ich fast genauso,... von: Rene
Geschrieben am: 23.01.2010 17:37:41

Hallo Luc.

Also mir würde im Grunde auch schon Schriftfarbe (ohne Bed. Formatierung), Fettschrift und Zeilenumbruch reichen.
Aber Zelle für Zelle und Zeichen für Zeichen finde ich halt schon etwas aufwändig.
Zumal das auch mächtige Laufzeiten produzieren kann.
In den Listen, die ich verarbeite können das mehrer 10.000 Zellen sein...

Grüße
René


  

Betrifft: AW: Das sehe ich fast genauso,... von: Josef Ehrensberger
Geschrieben am: 23.01.2010 18:47:37

Hallo René,

dann sollte das genügen, den Rest kannst du sicher selber anpassen.

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub test()
  MsgBox RangeHTML(Range("A1:F100"))
End Sub

Private Function RangeHTML(Source As Range) As String
  Dim rngRow As Range, rng As Range
  Dim strTmp As String, strText As String
  Dim vntRowColor As Variant
  
  strTmp = "<table border=0>"
  
  For Each rngRow In Source.Rows
    vntRowColor = rngRow.Font.Color
    If VarType(vntRowColor) = vbNull Then
      strTmp = strTmp & "<tr height=" & Fix(rngRow.RowHeight) & "px>"
    Else
      strTmp = strTmp & "<tr height=" & Fix(rngRow.RowHeight) & "px color=" & HTMLColor(vntRowColor) & ">"
    End If
    For Each rng In rngRow.Cells
      strText = Replace(rng.Text, vbLf, "<br>")
      strTmp = strTmp & "<td width=" & Fix(rng.Width) & "px>"
      If VarType(vntRowColor) = vbNull Then
        strTmp = strTmp & "<font color=" & HTMLColor(rng.Font.Color) & ">"
      End If
      If rng.Font.Bold Then
        strTmp = strTmp & "<b>" & strText & "</b>"
      Else
        strTmp = strTmp & strText
      End If
      If VarType(vntRowColor) = vbNull Then
        strTmp = strTmp & "</font>"
      End If
      strTmp = strTmp & "</td>"
    Next
    strTmp = strTmp & "</tr>"
  Next
  
  strTmp = strTmp & "</table>"
  
  RangeHTML = strTmp
End Function

Private Function HTMLColor(ByVal Color As Long) As String
  Dim R As Integer, G As Integer, B As Integer
  Dim strR As String * 2, strG As String * 2, strB As String * 2
  
  
  R = Color And 255
  G = (Color \ 256) And 255
  B = Color \ 65536
  
  strR = Hex(R) & "00"
  strG = Hex(G) & "00"
  strB = Hex(B) & "00"
  HTMLColor = "#" & strR & strG & strB
End Function



Gruß Sepp



  

Betrifft: AW: Das sehe ich fast genauso,... von: Rene
Geschrieben am: 23.01.2010 18:56:53

Hallo Sepp,

das sieht schon mal super aus! :-) Danke!!!
Ich werde jetzt noch den Fall implementieren, dass in einer Zelle mehrere Farben vorkommen können.
Ebenso werde ich versuchen Fettschrift und kursiv abzufangen.

Ich dank Dir wirklich!

Grüße
René


  

Betrifft: Na viel Glück! Ahnst du viell, was da auf... von: Luc:-?
Geschrieben am: 23.01.2010 20:22:16

...dich zukommt, René,
wenn du wirklich mehrere Farben pro Zelle feststellen willst...? Ich habe dazu jedenfalls nicht nur ein paar Codezeilen, sondern ein ganzes udFktssystem mit 100en Zeilen gebraucht. Aber so hoch sind deine Ansprüche ja noch nicht — kommt aber noch... ;-)
Naja, viel Spaß!
Luc :-?


  

Betrifft: Ja, dann,... von: Luc:-?
Geschrieben am: 23.01.2010 20:04:48

...René...
1. Schriftfarbe (ohne intern und extern bedingte Formatierung):
1.1 Auslesen mit sfb = Cells(..., ...).Font.Color
1.2 If IsNull(sfb) Then → zeichenweiser Vgl mit ...Characters(p, 1).Font.Color und entweder merken mit p (Position) oder nur die verschiedenen Farben sammeln.
1.3 Sonst hast du die Farbe für den ganzen Text, die aber in beiden Fällen nicht unbedingt mit der sichtbaren übereinstimmt!
1.4 Umwandeln in Hexadezimal mit sfx = Right("00000" & Hex(sfb), 6) und dann noch die ersten beiden Stellen mit den letzten beiden tauschen, damit aus BGR RGB wird und # davorsetzen.
1.5 Umwandeln in HTML: sfh = "<font color=" & sfx & ">" & zelltext & "</font>
2. Fettschrift:
2.1 Auslesen mit sff = Cells(..., ...).Font.Bold (True/False) bzw ...Font.FontStyle, da ist dann auch noch kursiv (Italic) mit dabei.
2.2 Wenn nur Textteile fett sind, ist zumindest eine dieser Eigenschaften Null, so dass man auch hier daran die zeichenweise Durchsuchung festmachen kann. Falls das zu aufwendig wird, muss eben stets nur das 1.Zeichen geprüft wdn — ...Characters(1, 1)... Dann sollte es kein Null geben.
2.3 Umwandeln in HTML bei True wie bekannt als <b>...</b> oder moderner als <strong>...</strong>
3. Zeilenumbruch:
Das ist so 'ne Sache, denn normalerweise gibt's keinen in einer Zelle. Wenn man ihn einstellt, wird automatisch an bestimmten Stellen (meist nur Leerzeichen) umgebrochen. Wenn man diese Einstellung abfragt, weiß man nur, dass umgebrochen wdn soll. Ob und wo das tatsächlich passiert ist so nicht feststellbar, auch nicht mit Cells(..., ...).Text! Was anderes wäre es, wenn absolute Zeilenumbrüche enthalten sind — nach denen könnte man suchen — Chr(10) vbLf bzw Chr(13) vbCrLf. Das entspräche in HTML <br>. Anderenfalls muss die Spaltenbreite mit Textlänge, Schriftart und -größe korreliert wdn.
4. Umwandeln in HTML mit dem Zelltext insgesamt nur am 1.Zeichen orientiert:

With Cells(..., ...).Characters(1, 1).Font
    sfg = "<font size=" & .Size & "pt color=" & sfh & ">" & _
          IIf(.Bold, "<b>", "") & Cells(..., ...) & IIf(.Bold, _
          "</b>", "") & "</font>"
End With
So, nun mach was draus...! ;-)

Gruß+schöSo, Luc :-?