10
votes

Convertir HTML en texte brut dans VBA

J'ai une feuille Excel avec des cellules contenant HTML. Comment puis-je lotter les convertir en clairexuel? Pour le moment, il y a tellement de tags et de styles inutiles. Je veux l'écrire à partir de zéro mais ce sera beaucoup plus facile si je peux obtenir le texte brut.

Je peux écrire un script pour convertir HTML en texte brut dans PHP, donc si vous ne pouvez pas penser à une solution dans VBA, vous pouvez peut-être suivre la manière dont je pourrais transmettre les données des cellules sur un site Web et récupérer les données. < / p>


0 commentaires

6 Réponses :


5
votes

Un moyen très simple d'extraire le texte consiste à numériser le caractère HTML par caractère et à accumuler des caractères en dehors des crochets d'angle dans une nouvelle chaîne.

Function StripTags(ByVal html As String) As String
    Dim text As String
    Dim accumulating As Boolean
    Dim n As Integer
    Dim c As String

    text = ""
    accumulating = True

    n = 1
    Do While n <= Len(html)

        c = Mid(html, n, 1)
        If c = "<" Then
            accumulating = False
        ElseIf c = ">" Then
            accumulating = True
        Else
            If accumulating Then
                text = text & c
            End If
        End If

        n = n + 1
    Loop

    StripTags = text
End Function


1 commentaires

Soyez prudent avec cette approche. Si le texte d'entrée inclut caractères pour une raison autre que les balises, elle sera confuse.



18
votes

Définissez une référence à "Bibliothèque d'objets HTML Microsoft".

Function HtmlToText(sHTML) As String
  Dim oDoc As HTMLDocument
  Set oDoc = New HTMLDocument
  oDoc.body.innerHTML = sHTML
  HtmlToText = oDoc.body.innerText
End Function


2 commentaires

Cela fonctionne bien, mais sachez que l'espace blanc est effondré. Par exemple,

ceci [espace] [espace] [espace] est
a [espace] Test sort sous la forme Test de l'ISA [espace] . (désolé pour le formatage; les espaces supplémentaires ne sortent pas quand je les saisis juste.)


En cas d'effondrement des espaces serait "Comportement attendu", je pense ici (sauf si le texte de l'élément n'a été conçu avec CSS pour préserver les espaces)



4
votes

La solution de TIM était super, fonctionnait a apprécié un charme.

J'aimerais apporter contribuer: Utilisez ce code pour ajouter "la bibliothèque d'objets Microsoft HTML" dans l'exécution: p>

Set ID = ThisWorkbook.VBProject.References
ID.AddFromGuid "{3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}", 2, 5


1 commentaires

Pouvez-vous montrer un exemple comment cela peut être utilisé avec le code de Tim et Option explicite ?



2
votes

La réponse de Tim est excellente. Cependant, un ajustement mineur peut être ajouté pour éviter une réponse d'erreur prévisible.

 Function HtmlToText(sHTML) As String
      Dim oDoc As HTMLDocument

      If IsNull(sHTML) Then
        HtmlToText = ""
        Exit Function
        End-If

      Set oDoc = New HTMLDocument
      oDoc.body.innerHTML = sHTML
      HtmlToText = oDoc.body.innerText
    End Function


0 commentaires

1
votes

Oui! J'ai réussi à résoudre mon problème aussi. Merci tout le monde /

Dans mon cas, j'avais ce type d'entrée: xxx

et je ne voulais pas que le résultat soit tout coincé ensemble sans les lignes de bris.

Donc, j'ai d'abord écarté mon entrée pour chaque

dans un tableau "paragraphes", puis pour chaque élément, j'ai utilisé la réponse de TIM pour obtenir le texte de HTML (très Douce réponse BTW).

En plus, j'ai concatéré chaque "paragraphe" nettoyé avec ce caractère de rupture CRH (10) pour VBA / Excel.

Le code final est: xxx


0 commentaires

1
votes

Voici une variante de la solution de Tim's and Gardoglee qui ne nécessite pas de définir une référence à la "bibliothèque d'objets HTML Microsoft". Cette méthode est connue sous le nom de la reliure tardive em> et fonctionnera également dans VBScript.

Function HtmlToText(sHTML) As String

    Dim oDoc As Object ' As HTMLDocument

    If IsNull(sHTML) Then
        HtmlToText = ""
        Exit Function
    End If

    Set oDoc = CreateObject("HTMLFILE")
    oDoc.body.innerHTML = sHTML
    HtmlToText = oDoc.body.innerText

End Function


0 commentaires