96 votes

Lire toutes les feuilles de calcul d'un classeur Excel dans une liste R avec data.frames

Je comprends que XLConnect peut être utilisé pour lire une feuille de calcul Excel dans R. Par exemple, cela permettrait de lire la première feuille de calcul d'un classeur appelé test.xls en R.

library(XLConnect)
readWorksheetFromFile('test.xls', sheet = 1)

J'ai un classeur Excel avec plusieurs feuilles de calcul.

Comment importer toutes les feuilles de calcul d'un classeur dans une liste en R où chaque élément de la liste est un data.frame pour une feuille donnée, et où le nom de chaque élément correspond au nom de la feuille de calcul dans Excel ?

139voto

Jeromy Anglim Points 8325

Réponse actualisée avec readxl (22 juin 2015)

Depuis que j'ai posté cette question, le readxl a été publié. Il prend en charge à la fois xls y xlsx format. Contrairement à d'autres logiciels d'importation Excel, il fonctionne sous Windows, Mac et Linux sans nécessiter l'installation de logiciels supplémentaires.

Une fonction permettant d'importer toutes les feuilles d'un classeur Excel serait donc la suivante :

library(readxl)    
read_excel_allsheets <- function(filename, tibble = FALSE) {
    # I prefer straight data.frames
    # but if you like tidyverse tibbles (the default with read_excel)
    # then just pass tibble = TRUE
    sheets <- readxl::excel_sheets(filename)
    x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
    if(!tibble) x <- lapply(x, as.data.frame)
    names(x) <- sheets
    x
}

Cela pourrait être appelé avec :

mysheets <- read_excel_allsheets("foo.xls")

Ancienne réponse

En s'appuyant sur la réponse fournie par @mnel, voici une fonction simple qui prend un fichier Excel comme argument et renvoie chaque feuille comme un data.frame dans une liste nommée.

library(XLConnect)

importWorksheets <- function(filename) {
    # filename: name of Excel file
    workbook <- loadWorkbook(filename)
    sheet_names <- getSheets(workbook)
    names(sheet_names) <- sheet_names
    sheet_list <- lapply(sheet_names, function(.sheet){
        readWorksheet(object=workbook, .sheet)})
}

Ainsi, il pourrait être appelé avec :

importWorksheets('test.xls')

46voto

Martin Studer Points 1434

Notez que la plupart des fonctions de XLConnect sont déjà vectorisées. Cela signifie que vous pouvez lire toutes les feuilles de calcul avec un seul appel de fonction sans avoir à faire une vectorisation explicite :

require(XLConnect)
wb <- loadWorkbook(system.file("demoFiles/mtcars.xlsx", package = "XLConnect"))
lst = readWorksheet(wb, sheet = getSheets(wb))

Avec XLConnect 0.2-0 lst sera déjà une liste nommée.

37voto

j3ypi Points 450

Je suis tombé sur cette vieille question et je pense que l'approche la plus simple manque toujours.

Vous pouvez utiliser rio pour importer toutes les feuilles excel avec une seule ligne de code.

library(rio)
data_list <- import_list("test.xls")

Si vous êtes un fan de la tidyverse vous pouvez facilement les importer en tant que tibbles en ajoutant l'option setclass à l'appel de la fonction.

data_list <- import_list("test.xls", setclass = "tbl")

Supposons qu'ils aient le même format, vous pourriez facilement les lier par rangée en définissant l'attribut rbind argument pour TRUE .

data_list <- import_list("test.xls", setclass = "tbl", rbind = TRUE)

33voto

pavopax Points 16

Du fonctionnaire readxl documentation (tidyverse) (modification de la première ligne) :

path <- "data/datasets.xlsx"

path %>% 
  excel_sheets() %>% 
  set_names() %>% 
  map(read_excel, path = path)

Détails à : http://readxl.tidyverse.org/articles/articles/readxl-workflows.html#iterate-over-multiple-worksheets-in-a-workbook

18voto

Andre Elrico Points 5210

Puisque c'est la réponse numéro un à la question : Lire la liste de plusieurs feuilles d'excel :

voici le openxlsx solution :

filename <-"myFilePath"

sheets <- openxlsx::getSheetNames(filename)
SheetList <- lapply(sheets,openxlsx::read.xlsx,xlsxFile=filename)
names(SheetList) <- sheets

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X