2012-04-03 35 views
31

¿Hay alguna manera de tomar HTML e importarlo a Excel para que tenga el formato de texto enriquecido (preferiblemente mediante el uso de VBA)? Básicamente, cuando me pega a una celda de Excel, estoy buscando para convertir esta:HTML Texto con etiquetas para texto formateado en una celda de Excel

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

en esto:

Esto es una prueba. Será este texto en negrita o cursiva

Respuesta

24

Sí es posible :) De hecho dejar que Internet Explorer haga el trabajo sucio por ti;)

probado y comprobado

mis suposiciones

  1. Supongo que el texto html está en la celda A1 de Sheet1. También puedes usar una variable en su lugar.
  2. Si usted tiene una columna llena de valores html, entonces simplemente poner el siguiente código en un bucle

CÓDIGO

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 

INSTANTÁNEA

enter image description here

HTH

Sid

+1

Siddharth, Tu solución hacía que mis informes se ven muy nice..Thanks tanto .. – javanoob

+9

Este script VBA fallaron en mi máquina de 'execCommand" Copie la línea '', sospecho que es porque tengo IE11 instalado que no es compatible. – BornToCode

+0

Lo mismo me pasó a BornToCode. –

7

Puede copiar el código HTML al portapapeles y pegarlo de nuevo como texto Unicode. Excel representará el HTML en la celda. Echa un vistazo a este post http://www.dailydoseofexcel.com/archives/2005/02/23/html-in-cells-ii/

El código de macro relevante del mensaje:

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

Gracias. En Excel 2010 tuve que agregar manualmente 'FM20.DLL' en _Herramientas..Referencias_ para obtener' DataObject' disponible en "Biblioteca de objetos de Microsoft Forms 2.0". Luego tuve un problema con 'Me.PasteSpecial' porque no me gustó (no es broma, por favor). 'Target.PasteSpecial' dio un error, pero' Sheets (1) .Range ("B51"). PasteSpecial' funcionó. Y dejé de tratar de obtener la pasta en una celda fusionada, solo tendré que usar salpicaduras liberales de etiquetas BR en mi HTML configurado para forzar saltos de línea para controlar el ancho de la salida. –

6

Si el ejemplo IE no funciona el uso de éste. De todos modos, esto debería ser más rápido que iniciar en una instancia de IE.

Aquí es una solución completa basada en
http://www.dailydoseofexcel.com/archives/2005/02/23/html-in-cells-ii/

Nota, si su innerHTML es todos los números, por ejemplo '12345', formato HTML dosis no funciona plenamente en Excel, ya que trata de manera diferente número? pero agregue un carácter, por ejemplo, , un espacio al final, por ejemplo. 12345 + "& nbsp;" formatos bien.

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

FYI para cualquier otra persona, no tenía MS Forms 2.0 en mi biblioteca de referencia predeterminada, así que tuve que agregarlo. En mi PC era C: \ WINDOWS \ system32 \ FM20.dll –

+3

Brilliant! En alemán Excel, la cadena de formato está localizada, necesitaba 'sht.PasteSpecial Format: =" Unicode-Text "'. Para otras localizaciones, registre la acción Pegado especial (o Pegar contenido) una vez en una macro. – Andre

6

Sé que este hilo es antiguo, pero después de asignar el innerHTML, ExecWB trabajado para mí:

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

Y luego simplemente pegar el contenido en Excel. Dado que estos métodos son propensos a errores de tiempo de ejecución, pero funcionan bien después de uno o dos intentos en modo de depuración, es posible que tenga que decirle a Excel que intente de nuevo si se produce un error. Me resuelto este añadiendo este gestor de errores a la sub, y funciona bien:

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

todos ustedes tienen soluciones válidas, y con un puñado de ellos se puede aplicar exactamente esto.

necesita herramientas son expresiones regulares, linq, un motor de búsqueda, vb.net o C# e Internet.

Buscar "html table to dataset". Luego busque "conjunto de datos para sobresalir sin Excel instalado".

Creo que con esos términos es posible que puedas unirlos. ;)

Pero aquí hay algunas soluciones.

  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

En aras de la simplicidad de mi archivo de entrada es una tabla HTML que se asigna a sobresalir derecha dando la visión correcta. Pero una vista es todo lo que es. así que lo leí en striptease de la basura de metaestilo y lo envolví en html válido, lo introduje para obtener el conjunto de datos y escribir los datos establecidos. disfrutar.

creo que la expresión regular que podría ayudar con la recolección de la otra parte de la html ...

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

Los créditos van a los autores de dicho código. Solo lo armé.

1

Me encontré con el mismo error que BornToCode identificado por primera vez en los comentarios de la solución original. Como no estaba familiarizado con Excel y VBA, tardé un segundo en descubrir cómo implementar la solución de tiQU. Así que he publicado como una solución "para los simulado" a continuación

  1. modo de programador Primera permitirá en Excel: Link
  2. seleccione la pestaña del desarrollador> Visual Basic
  3. Haga clic en Ver> Código
  4. Pega el a continuación, actualice las líneas que requieren referencias de celda para que sean correctas.
  5. Haga clic en la flecha verde Ejecutar o presione 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

Cuestiones relacionadas