2012-04-03 67 views
31

有没有一种方法可以将HTML导入到excel中,以便将其格式化为富文本(最好使用VBA)?基本上,当我粘贴到Excel单元格,我希望把这个:带文本标签的Excel文本格式文本

<html><p>This is a test. Will this text be <b>bold</b> or <i>italic</i></p></html> 

到这一点:

这是一个测试。将这段文字是大胆斜体

回答

24

是的,它是可能的:)其实让Internet Explorer中做肮脏的工作适合你;)

久经考验

我的假设

  1. 我假设html文本位于Sheet1的单元格A1中。您也可以使用一个变量。
  2. 如果你有一个完整的HTML值的列,然后简单地把下面的代码在一个循环

CODE

Sub Sample() 
    Dim Ie As Object 

    Set Ie = CreateObject("InternetExplorer.Application") 

    With Ie 
     .Visible = False 

     .Navigate "about:blank" 

     .document.body.InnerHTML = Sheets("Sheet1").Range("A1").Value 

     .document.body.createtextrange.execCommand "Copy" 
     ActiveSheet.Paste Destination:=Sheets("Sheet1").Range("A1") 

     .Quit 
    End With 
End Sub 

快照

enter image description here

HTH

Sid

+1

亚洲时报Siddharth,您的解决方案使我的报告看起来非常nice..Thanks这么多.. – javanoob 2012-11-28 19:10:00

+9

这个VBA脚本失败在我的机器上的execCommand'“复制“'行,我怀疑这是因为我安装了IE11而不支持它。 – BornToCode 2014-03-23 10:37:24

+0

同样的事情发生在我BornToCode。 – 2014-07-23 14:18:07

7

您可以将HTML代码复制到剪贴板并将其作为Unicode文本粘贴回去。 Excel将在单元格中呈现HTML。看看这个帖子http://www.dailydoseofexcel.com/archives/2005/02/23/html-in-cells-ii/

从岗位相关的宏代码:

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim objData As DataObject 
    Dim sHTML As String 
    Dim sSelAdd As String 

    Application.EnableEvents = False 

    If Target.Cells.Count = 1 Then 
     If LCase(Left(Target.Text, 6)) = "<html>" Then 
     Set objData = New DataObject 

     sHTML = Target.Text 

     objData.SetText sHTML 
     objData.PutInClipboard 

     sSelAdd = Selection.Address 
     Target.Select 
     Me.PasteSpecial "Unicode Text" 
     Me.Range(sSelAdd).Select 

     End If 
    End If 

    Application.EnableEvents = True 

End Sub 
+0

谢谢。在Excel 2010中,我必须在_Tools..References_中手动添加'FM20.DLL',以便从“Microsoft Forms 2.0对象库”中获取“DataObject”。然后我遇到了'Me.PasteSpecial'问题,因为它不喜欢我(不要开玩笑)。 'Target.PasteSpecial'给出了一个错误,但是'Sheets(1).Range(“B51”).PasteSpecial'确实有效。我放弃尝试将粘贴到合并的单元格中,只需在配置的HTML中使用自由散布的BR标签来强制换行来控制输出的宽度。 – 2017-10-18 10:22:04

6

如果IE例如不工作使用这一个。无论如何,这应该比起始IE的一个实例启动 更快。

这里是基于
http://www.dailydoseofexcel.com/archives/2005/02/23/html-in-cells-ii/

注意一个完整的解决方案,如果你的innerHTML是所有数字如“12345”,HTML格式 这么想的在Excel工作充分,因为它把多个不同?但在末尾添加一个字符,例如 尾部空格,例如。 12345 +“& nbsp;”格式正常。

Sub test() 
    Cells(1, 1).Value = "<HTML>1<font color=blue>a</font>" & _ 
         "23<font color=red>4</font></HTML>" 
    Dim rng As Range 
    Set rng = ActiveSheet.Cells(1, 1) 
    Worksheet_Change rng, ActiveSheet 
End Sub 


Private Sub Worksheet_Change(ByVal Target As Range, ByVal sht As Worksheet) 

    Dim objData As DataObject ' Set a reference to MS Forms 2.0 
    Dim sHTML As String 
    Dim sSelAdd As String 

    Application.EnableEvents = False 

    If Target.Cells.Count = 1 Then 

      Set objData = New DataObject 
      sHTML = Target.Text 
      objData.SetText sHTML 
      objData.PutInClipboard 
      Target.Select 
      sht.PasteSpecial Format:="Unicode Text" 
    End If 

    Application.EnableEvents = True 

End Sub 
+4

仅供参考,我没有在我的默认参考库中的MS Forms 2.0,所以我不得不添加它。在我的PC上是C:\ WINDOWS \ system32 \ FM20.dll – 2014-07-23 14:33:52

+3

太棒了!在德语Excel中,格式化字符串是本地化的,我需要'sht.PasteSpecial Format:=“Unicode-Text”'。对于其他本地化,请在宏中记录一次选择性粘贴(或粘贴内容)操作。 – Andre 2016-07-05 17:34:09

6

我知道这个线程是古老的,但分配的innerHTML后,ExecWB工作对我来说:

.ExecWB 17, 0 
 
'Select all contents in browser 
 
.ExecWB 12, 2 
 
'Copy them

然后把刚才的内容粘贴到Excel中。由于这些方法很容易出现运行时错误,但在调试模式下进行一两次尝试后仍可正常工作,所以如果运行时出现错误,您可能需要告诉Excel再次尝试。我解决了这个通过将此错误处理程序给分,并能正常工作:

Sub ApplyHTML() 
 
    On Error GoTo ErrorHandler 
 
    ... 
 
    Exit Sub 
 

 
ErrorHandler: 
 
    Resume 
 
    'I.e. re-run the line of code that caused the error 
 
Exit Sub 
 
     
 
End Sub

0

你们都有有效的解决方案,并与他们极少数可以实现正是这一点。

工具需要的是正则表达式,linq,搜索引擎,vb.net或C#和互联网。

搜索“html table to dataset”。 然后搜索“没有安装excel的数据集以达到最佳效果”。

我认为这些条款可能会把它放在一起。 ;)

但这里有一些解决方案。

  Using sr As StreamReader = New StreamReader(fileName, Encoding.UTF8) 
       result = sr.ReadToEnd() 
      End Using 
      result = result.Substring(result.IndexOf("<tab")) 
      Dim sb As New StringBuilder 
      sb.AppendLine("<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"" ""http://www.w3.org/TR/html4/loose.dtd"">") 
      sb.AppendLine("<html>") 
      sb.AppendLine("<head>") 
      sb.AppendLine("<meta http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1" > "") 
      sb.AppendLine("<title>Title</title>") 
      sb.AppendLine("</head>") 
      sb.AppendLine("<body>") 
      sb.Append(result) 
      sb.AppendLine("</body>") 
      sb.AppendLine("</html>") 
      result = sb.ToString() 
      File.Move(fileName, System.IO.Path.GetFileNameWithoutExtension(fileName) + ".txt") 
      Dim ds As DataSet = GetTableAsDataSet.ConvertHTMLTablesToDataSet(result) 
      If (DataSetToExcel.WriteXLSFile(fileName, ds) = True) Then 

http://www.dotnetfunda.com/articles/show/51/convert-html-tables-to-a-dataset

http://www.codeproject.com/Tips/313731/How-to-convert-DataSet-to-Excel-workbook-xls-using

为了简单起见我输入文件的缘故,它映射到Excel权赋予右视图中的HTML表格。但一个看法就是这样。所以我阅读它脱离元风格废话剥离和包装它在有效的html饲料它获取数据集并写出数据集。请享用。

我认为,正则表达式可以帮助你收集HTML的其他部分...

<table[^>]*>(.*?)</table> == <html[^>]*>(.*?)</html> 

积分去的作者说代码。我把它放在一起。

1

我遇到了BornToCode在原始解决方案的注释中首次发现的错误。不熟悉Excel和VBA,我花了一秒钟的时间才弄清楚如何实现tiQU的解决方案。所以我张贴在Excel下面

  1. 首先启用开发模式是“傻瓜”的解决方案:Link
  2. 选择开发选项卡> Visual Basic中
  3. 单击视图>代码
  4. 粘贴下面的代码更新要求单元格引用正确的行。
  5. 点击绿色运行箭头或按F5键

Sub Sample() Dim Ie As Object Set Ie = CreateObject("InternetExplorer.Application") With Ie .Visible = False .Navigate "about:blank" .document.body.InnerHTML = Sheets("Sheet1").Range("I2").Value 'update to the cell that contains HTML you want converted .ExecWB 17, 0 'Select all contents in browser .ExecWB 12, 2 'Copy them ActiveSheet.Paste Destination:=Sheets("Sheet1").Range("J2") 'update to cell you want converted HTML pasted in .Quit End With End Sub