在VBA中将html转换为纯文本

时间:2011-03-16 15:23:19

标签: html parsing vba html-parsing

我有一张包含html的单元格的Excel表格。如何将它们批量转换为纯文本?目前有这么多无用的标签和风格。我想从头开始编写它,但如果我能得到明文,那将会容易得多。

我可以编写一个脚本来将PHP转换为纯文本,这样如果您无法想到VBA中的解决方案,那么您可以了解我如何将单元数据传递到网站并检索数据。 / p>

6 个答案:

答案 0 :(得分:17)

设置对“Microsoft HTML对象库”的引用。

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

答案 1 :(得分:4)

提取文本的一种非常简单的方法是逐个字符扫描HTML字符,并将尖括号外的字符累积到新字符串中。

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

这可能会留下大量无关的空白,但它有助于删除标记。

答案 2 :(得分:3)

蒂姆的解决方案很棒,很有魅力。

我想贡献:使用此代码在运行时添加“Microsoft HTML Object Library”:

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

适用于Windows XP和Windows 7。

答案 3 :(得分:1)

这是Tim和Gardoglee解决方案的一种变体,不需要设置对“ Microsoft HTML对象库”的引用。这种方法称为 Late Binding (后期绑定),在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

请注意,如果您在 Access 2007或更高版本中使用VBA,则内置的Application.PlainText()方法与上面的代码具有相同的作用。

答案 4 :(得分:0)

蒂姆的回答非常好。但是,可以添加一个小调整以避免一个可预见的错误响应。

 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

答案 5 :(得分:0)

是的!我也设法解决了我的问题。谢谢大家/

就我而言,我有这种输入:

<p>Lorem ipsum dolor sit amet.</p>

<p>Ut enim ad minim veniam.</p>

<p>Duis aute irure dolor in reprehenderit.</p>

我不希望结果没有中断线而被卡在一起。

因此,我首先将每个<p>标签的输入都分成一个数组“ paragraphs”,然后对于每个元素,我使用Tim的答案将文本从html中提取出来(非常好回答btw)。

此外,对于VBA / Excel,我将每个清理的“段落”与该换行符Crh(10)串联在一起。

最终代码为:

Public Function HtmlToText(ByVal sHTML As String) As String
    Dim oDoc As HTMLDocument
    Dim result As String
    Dim paragraphs() As String

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

    result = ""
    paragraphs = Split(sHTML, "<p>")

    For Each paragraph In paragraphs
        Set oDoc = New HTMLDocument
        oDoc.body.innerHTML = paragraph
        result = result & Chr(10) & Chr(10) & oDoc.body.innerText
    Next paragraph

    HtmlToText = result
End Function