Convertir un tableau HTML en Excel
Le code ci-dessous récupère le tableau HTML sur https://rasmusrhl.github.io/stuff, et le convertit en format Excel.
Le problème est que :
- Les nombres entre parenthèses sont convertis en nombres négatifs
- Les nombres sont arrondis ou tronqués
Solution
Merci à tous pour vos excellentes contributions. Les réponses variées m'ont permis de comprendre que, pour mes besoins, une solution de contournement était la meilleure solution : Comme je génère moi-même les tableaux HTML, je peux contrôler le CSS de chaque cellule. Il existe des codes CSS qui indiquent à Excel comment interpréter le contenu des cellules : http://cosicimiento.blogspot.dk/2008/11/styling-excel-cells-with-mso-number.html, également expliqué dans cette question : Format de cellule de tableau HTML pour que Excel le formate en texte ?
Dans mon cas, le CSS devrait être du texte, qui est mso-number-format:\"\\@\"
. Il est intégré dans le code R ci-dessous :
library(htmlTable)
library(nycflights13)
library(dplyr)
nycflights13::planes %>
slice(1:10) %> mutate( seats = seats*1.0001,
s1 = c("1-5", "5-10", "1/2", "1/10", "2-3", "1", "1.0", "01", "01.00", "asfdkjlæ" ),
s2 = c("(10)", "(12)", "(234)", "(00)", "(01)", "(098)", "(01)", "(01.)", "(001.0)", "()" )) -> df
rle_man <- rle(df$manufacturer)
css_matrix <- matrix( data = "mso-number-format:\"\\@\"", nrow = nrow(df), ncol = ncol(df))
css_matrix[,1] <- "padding-left: 0.4cm;mso-number-format:\"\\@\""
css_matrix[,2:10] <- "padding-left: 1cm;mso-number-format:\"\\@\""
css_matrix[,5] <- "padding-left: 2cm;mso-number-format:\"\\@\""
htmlTable( x = df,
rgroup = rle_man$values, n.rgroup = rle_man$lengths,
rnames = FALSE, align = c("l", "r" ),
cgroup = rbind( c("", "Un peu de texte va ici. Il est long et ne se coupe pas", "Un autre texte va ici", NA),
c( "", "Type de machine(marque)", "Spécification de la machine", "Autres variables")),
n.cgroup = rbind( c(1,8,2, NA),
c(1, 3, 5, 2)),
css.cell = css_matrix ) -> html_out
temp_file <- tempfile( pattern = "table", fileext = ".html" )
readr::write_file( x = html_out, path = temp_file)
utils::browseURL( temp_file)
Ce fichier HTML peut être glissé-déposé dans Excel avec toutes les cellules interprétées comme du texte. Notez que seul le fait de glisser-déposer le fichier html dans Excel fonctionne, il ne suffit pas d'ouvrir le tableau dans un navigateur et de le copier-coller dans Excel.
La seule chose qui manque à cette méthode est les lignes horizontales, mais je peux m'en accommoder.
Voici le VBA avec le même effet que le glisser-déposer :
Sub importhtml()
'
' importhtml Macro
'
'
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;file:///C:/Users/INSERTUSERNAME/Desktop/table18b85c0a20f3html.HTML", Destination:=Range("$a$1"))
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = False
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingAll
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = True
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub