2012-04-03 14 views
31

C'è un modo per prendere HTML e importarlo in Excel in modo che sia formattato come testo RTF (preferibilmente utilizzando VBA)? Fondamentalmente, quando ho incolla in una cella di Excel, sto cercando di trasformare questo:HTML Testo con tag per il testo formattato in una cella Excel

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

in questo:

Questo è un test. Sarà questo testo sia grassetto o corsivo

risposta

24

Sì, è possibile :) In realtà lasciare che Internet Explorer fare il lavoro sporco per voi;)

collaudato

mia ipotesi

  1. Suppongo che il testo html sia nella cella A1 di Sheet1. Puoi anche utilizzare una variabile.
  2. Se si dispone di una colonna piena di valori html, quindi è sufficiente inserire il codice qui sotto in un ciclo

CODICE

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 

ISTANTANEA

enter image description here

HTH

Sid

+1

Siddharth, la soluzione ha reso i miei rapporti sembrano molto nice..Thanks tanto .. – javanoob

+9

Questo script VBA fallito sulla mia macchina su 'execCommand" Copia "linea", ho il sospetto che sia perché ho installato IE11 che non lo supporta. – BornToCode

+0

La stessa cosa è successa a me BornToCode. –

7

È possibile copiare il codice HTML negli Appunti e incollarlo nuovamente come testo Unicode. Excel renderà l'HTML nella cella. Controllare questo post http://www.dailydoseofexcel.com/archives/2005/02/23/html-in-cells-ii/

Il codice di macro rilevanti da posta:

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

Grazie. In Excel 2010 ho dovuto aggiungere manualmente 'FM20.DLL' in _Tools..References_ per ottenere' DataObject' disponibile da "Libreria di oggetti di Microsoft Forms 2.0". Quindi ho avuto un problema con 'Me.PasteSpecial' perché non mi piaceva (non scherzi per favore). 'Target.PasteSpecial' ha dato un errore, ma' Sheets (1) .Range ("B51"). PasteSpecial' ha funzionato. E ho rinunciato a cercare di ottenere la pasta in una cella unita, dovrò semplicemente usare gli sprinklings liberali dei tag BR nel mio HTML configurato per forzare le interruzioni di riga per controllare la larghezza dell'output. –

6

Se l'esempio IE non funziona uso questo. In ogni caso, dovrebbe essere più veloce dell'avvio di su un'istanza di IE.

Qui è una soluzione completa basata su
http://www.dailydoseofexcel.com/archives/2005/02/23/html-in-cells-ii/

nota, se l'innerHTML è tutti i numeri ad esempio '12345', la formattazione HTML non dovesse funzionare pienamente in Excel come tratta il numero in modo diverso? ma aggiungere un carattere, ad esempio uno spazio finale alla fine ad es. 12345 + "& nbsp;" formati ok.

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 per chiunque altro, non avevo MS Forms 2.0 nella mia libreria di riferimento predefinita, quindi ho dovuto aggiungerlo. Sul mio PC era C: \ WINDOWS \ system32 \ FM20.dll –

+3

Brillante! In tedesco Excel, la stringa Format è localizzata, avevo bisogno di 'sht.PasteSpecial Format: =" Unicode-Text "'. Per altre localizzazioni, registra l'azione Incolla speciale (o Incolla contenuto) una volta in una macro. – Andre

6

So che questo thread è antica, ma dopo l'assegnazione del innerHTML, ExecWB lavorato per me:

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

E poi basta incollare il contenuto in Excel. Poiché questi metodi sono soggetti a errori di runtime, ma funzionano bene dopo uno o due tentativi in ​​modalità di debug, potrebbe essere necessario dire a Excel di provare di nuovo se si verifica un errore. Ho risolto questo con l'aggiunta di questo gestore di errore per il sub, e funziona benissimo:

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

Tutti voi avete soluzioni valide, e con una manciata di loro è possibile implementare esattamente questo.

gli strumenti necessari sono espressioni regolari, linq, un motore di ricerca, vb.net o C# e Internet.

Cerca "tabella html sul set di dati". Quindi cercare "set di dati per eccellere senza Excel installato".

Penso che con questi termini potresti riuscire a metterlo insieme. ;)

Ma ecco alcune delle soluzioni.

  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

Per semplicità il mio file di input è una tabella HTML che mappa per eccellere dando destra la giusta visione. Ma una visione è tutto ciò che è. quindi lo leggo in strip off the meta styling crap e lo avvolgo in un codice html valido per ottenere il set di dati e scrivere i dati impostati. godere.

penso che l'espressione regolare potrebbe aiutare con la raccolta l'altra parte del html ...

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

crediti vanno a degli autori detto codice. L'ho appena messo insieme.

1

Ho riscontrato lo stesso errore che BornToCode ha identificato per la prima volta nei commenti della soluzione originale. Non avendo dimestichezza con Excel e VBA mi ci è voluto un secondo per capire come implementare la soluzione tiQU. Così sto postando come una soluzione "For Dummies" sotto

  1. modalità sviluppatore Prima consentire in Excel: Link
  2. selezionare la scheda sviluppatore> Visual Basic
  3. Fare clic su Visualizza> Codice
  4. Incollare il codice sottostante che aggiorna le righe che richiedono che i riferimenti di cella siano corretti.
  5. Fare clic sul verde Esegui Freccia o premere 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

Problemi correlati