Texte HTML avec balises pour le texte formaté dans une cellule Excel

y a-t-il un moyen de prendre HTML et de l'importer dans excel pour qu'il soit formaté en texte riche (de préférence en utilisant VBA)? Fondamentalement, quand je colle à une cellule Excel, je cherche à tourner ceci:

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

en:

Ceci est un test. Sera-ce texte gras ou italique

35
demandé sur ashleedawg 2012-04-03 23:06:14

6 réponses

Oui c'est possible :) En fait laisser Internet Explorer faire le sale boulot pour vous ;)

ESSAYÉ ET TESTÉ

MES SUPPOSITIONS

  1. je suppose que le texte html est dans la cellule A1 de Sheet1. Vous pouvez également utiliser une variable à la place.
  2. si vous avez une colonne pleine de valeurs html, alors mettez simplement le code ci-dessous dans un boucle

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

SNAPSHOT

enter image description here

HTH

Sid

26
répondu Siddharth Rout 2012-04-03 21:15:11

Vous pouvez copier le code HTML dans le presse-papier et le coller spécial il en arrière comme texte Unicode. Excel affichera le HTML dans la cellule. Découvrez ce post http://www.dailydoseofexcel.com/archives/2005/02/23/html-in-cells-ii/

La macro en question le code du poste:

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
8
répondu Dick Kusleika 2017-08-25 09:19:50

si L'exemple IE ne fonctionne pas utilisez celui-ci. De toute façon, ça devrait être plus rapide que de commencer. une instance d'internet explorer.

Voici une solution complète basée sur on

http://www.dailydoseofexcel.com/archives/2005/02/23/html-in-cells-ii/

Note, si votre innerHTML est tous les numéros eg '12345', formatage HTML ne pas travailler entièrement dans excel car il traite le nombre différemment? mais d'ajouter un personnage par exemple un espace arrière à la fin par exemple. 12345 + " & nbsp;" formats 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
7
répondu ozmike 2013-02-19 07:23:02

je sais que ce fil est ancien, mais après avoir assigné l'innerHTML, ExecWB a fonctionné pour moi:

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

et puis il suffit de coller le contenu dans Excel. Puisque ces méthodes sont sujettes à des erreurs d'exécution, mais fonctionnent bien après un ou deux essais en mode debug, vous pourriez devoir dire à Excel d'essayer à nouveau si elle tombe dans une erreur. J'ai résolu cela en ajoutant ce gestionnaire d'erreurs au sous-marin, et cela fonctionne très 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
7
répondu tiQu 2015-02-24 00:45:39

J'ai rencontré la même erreur que BornToCode a d'abord identifiée dans les commentaires de la solution originale. N'étant pas familier avec Excel et VBA, il m'a fallu une seconde pour comprendre comment mettre en œuvre la solution de tiQU. Donc je l'affiche comme une solution "pour les Nuls" ci-dessous

  1. tout d'Abord activer le mode développeur dans Excel: Lien
  2. sélectionnez L'onglet Developer > Visual Basic
  3. Cliquez Sur View > Code
  4. coller le code sous mettre à jour les lignes il faut que les références aux cellules soient correctes.
  5. cliquez sur la flèche verte ou appuyez sur 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
3
répondu hehret 2018-05-09 20:46:24

Vous avez tous des solutions valables, et avec une poignée d'entre eux, vous pouvez mettre en œuvre exactement cela.

les outils nécessaires sont des expressions régulières, linq, un moteur de recherche, vb.net ou C# et internet.

Recherche pour "tableau html à dataset". Ensuite, la recherche "jeu de données à excel sans excel est installé".

je pense qu'avec ces conditions, vous pourriez être en mesure de les mettre ensemble. ;)

Mais voici quelques-uns des solution.

           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

par souci de simplicité, mon fichier d'entrée est une table html qui correspond à excel right donnant la bonne vue. Mais d'un point de vue est tout c'est. donc, je l'ai lu dans la bande de hors la méta style de la merde et l'envelopper dans un code html valide alimentation en l' ensemble de données et d'écrire l'ensemble de données. profiter.

je pense que l'expression régulière pourrait vous aider à rassembler l'autre partie du html...

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

les crédits vont aux auteurs de ce code. Je viens de les mettre ensemble.

1
répondu BanMe 2015-06-02 23:33:31