Lesen Sie alle Arbeitsblätter in einer Excel-Arbeitsmappe in eine R-Liste mit data.frames

76

Ich verstehe, dass XLConnectdies zum Lesen eines Excel-Arbeitsblatts in R verwendet werden kann. Dies würde beispielsweise das erste Arbeitsblatt in einer Arbeitsmappe lesen, die test.xlsin R aufgerufen wird.

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

Ich habe eine Excel-Arbeitsmappe mit mehreren Arbeitsblättern.

Wie können alle Arbeitsblätter in einer Arbeitsmappe in eine Liste in R importiert werden, in der jedes Element der Liste ein Datenrahmen für ein bestimmtes Blatt ist und in der der Name jedes Elements dem Namen des Arbeitsblatts in Excel entspricht?

Jeromy Anglim
quelle
Abgesehen von xlconnectund erlaubt das readxlPaket xlsx, Excel-Dateien in R(allen Blättern oder nur einigen) zu manipulieren
Cath

Antworten:

113

Aktualisierte Antwort mit readxl (22. Juni 2015)

Seit dem Posten dieser Frage wurde das readxlPaket freigegeben. Es unterstützt sowohl xlsals auch xlsxFormat. Im Gegensatz zu anderen Excel-Importpaketen funktioniert es unter Windows, Mac und Linux, ohne dass zusätzliche Software installiert werden muss.

Eine Funktion zum Importieren aller Blätter in eine Excel-Arbeitsmappe wäre also:

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
}

Dies könnte aufgerufen werden mit:

mysheets <- read_excel_allsheets("foo.xls")

Alte Antwort

Aufbauend auf der Antwort von @mnel ist hier eine einfache Funktion, die eine Excel-Datei als Argument verwendet und jedes Blatt als data.frame in einer benannten Liste zurückgibt.

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)})
}

So könnte es aufgerufen werden mit:

importWorksheets('test.xls')
Jeromy Anglim
quelle
ausgezeichnet, nur lernen, readxldas eine excel_sheetsMethode hat. wunderbar.
MichaelChirico
1
@ user7071759 Wenn ich Sie verstehe, sollten Sie nur in der Lage sein, den Pfad einzuschließen filename. Beispiel: read_excel_allsheets ("my / path / to / file / example.xls")
Jeromy Anglim
1
Es scheint, dass diese neue Antwort mir eine Liste innerhalb einer Liste und keinen Datenrahmen innerhalb einer Liste gibt.
Helen
4
Ich bekomme Listen und keine Datenrahmen.
J Walt
1
Eine einfachere Version dieser Funktion wäre lapply(excel_sheets(file.path), function(x) read_excel(file.path, x)). Wenn Sie das Nicht-Tibble bevorzugen, wickeln Sie einfach read_excel ein as.data.frame(). Namen müssten danach vergeben werden.
Glaukon
45

Beachten Sie, dass die meisten Funktionen von XLConnect bereits vektorisiert sind. Dies bedeutet, dass Sie alle Arbeitsblätter mit einem Funktionsaufruf einlesen können, ohne eine explizite Vektorisierung durchführen zu müssen:

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

Mit XLConnect 0.2-0 wird lst bereits eine benannte Liste sein.

Martin Studer
quelle
11
Für mich funktioniert das require(XLConnect) wb <- loadWorkbook("excel.xlsx") lst = readWorksheet(wb, sheet = getSheets(wb))
Kim Stacks
3
Ich auch. Die Antwort der Lösung funktionierte nicht für mich, konnte die Datei nicht finden, obwohl sie existiert
Z_D
2
Der Anruf mit system.file()hat auch bei mir nicht funktioniert.
Nikos Alexandris
Verwenden Sie stattdessen loadWorkbook (system.file ("demoFiles / mtcars.xlsx", package = "XLConnect")) und direkt loadWorkbook ("demoFiles / mtcars.xlsx"), um die Arbeitsmappe zu laden. Es klappt.
Qazi
23

Ich bin über diese alte Frage gestolpert und denke, der einfachste Ansatz fehlt noch.

Sie können rioalle Excel-Tabellen mit nur einer Codezeile importieren.

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

Wenn Sie ein Fan von sind tidyverse, können Sie sie einfach als tibbles importieren, indem Sie das setclassArgument zum Funktionsaufruf hinzufügen .

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

Angenommen, sie haben dasselbe Format. Sie können sie leicht in Zeilen binden, indem Sie das rbindArgument auf setzen TRUE.

data_list <- import_list("test.xls", setclass = "tbl", rbind = TRUE)
j3ypi
quelle
2
rio::import_listist eine gute Option. Es kann auch eine Teilmenge der Blätter importieren, z. B. import_list("test.xls", which = c(1, 2))was sehr nützlich sein kann. Ich bin damit einverstanden, dass dies hier die einfachste Option ist.
Danny
@Danny Ich wusste nichts über das whichArgument. Es könnte in der Tat nützlich sein.
j3ypi
22

Aus der offiziellen readxl(tidyverse) Dokumentation (Änderung der ersten Zeile):

path <- "data/datasets.xlsx"

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

Details unter: http://readxl.tidyverse.org/articles/articles/readxl-workflows.html#iterate-over-multiple-worksheets-in-a-workbook

Paul
quelle
2
Um Blattnamen zu behalten,df <- path %>% excel_sheets() %>% set_names() %>% map_dfr(read_excel, path = path, .id = "SheetName")
Tung
12

Da dies der erste Treffer bei der Frage ist: Lesen Sie das Excel mit mehreren Blättern, um es aufzulisten:

Hier ist die openxlsxLösung:

filename <-"myFilePath"

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

Sie können das Arbeitsbuch laden und dann verwenden lapply, getSheetsund readWorksheetund etwas tun.

wb.mtcars <- loadWorkbook(system.file("demoFiles/mtcars.xlsx", 
                          package = "XLConnect"))
sheet_names <- getSheets(wb.mtcars)
names(sheet_names) <- sheet_names

sheet_list <- lapply(sheet_names, function(.sheet){
    readWorksheet(object=wb.mtcars, .sheet)})
mnel
quelle
Netter Martin !!
ASH
4

Verwenden Sie das readxl-Paket wie folgt, um mehrere Blätter aus einer Arbeitsmappe zu lesen:

library(readxl)
library(dplyr)

final_dataFrame <- bind_rows(path_to_workbook %>%
                              excel_sheets() %>%
                              set_names() %>%
                              map(read_excel, path = path_to_workbook))

Hier fügt bind_rows ( dplyr) alle Datenzeilen aus allen Blättern in einen Datenrahmen ein und path_to_workbookist der Speicherort Ihrer Daten: "dir / of / the / data / workbook".

TheMI
quelle
1

Hinzufügen zu Pauls Antwort. Die Blätter können auch folgendermaßen verkettet werden:

data = path %>% 
excel_sheets() %>% 
set_names() %>% 
map_df(~ read_excel(path = path, sheet = .x), .id = "Sheet")

Erforderliche Bibliotheken:

if(!require(pacman))install.packages("pacman")
pacman::p_load("tidyverse","readxl","purrr")
Nikhil Gupta
quelle