将Excel工作簿中的所有工作表读入带有data.frames的R列表中


76

我知道XLConnect可以将Excel工作表读入R。例如,这将读取工作簿中称为test.xlsR的第一个工作表。

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

我有一个包含多个工作表的Excel工作簿。

如何将工作簿中的所有工作表导入R中的列表中,其中列表的每个元素都是给定工作表的data.frame,并且每个元素的名称与Excel中工作表的名称相对应?


除了xlconnect和之外readxl,软件包还xlsx允许在R(全部工作表或仅一些工作表)中操作excel文件
Cath,2016年

Answers:


113

使用readxl更新了答案(2015年6月22日)

自发布此问题以来,该readxl软件包已发布。它同时支持xlsxlsx格式。重要的是,与其他excel导入软件包相比,它可以在Windows,Mac和Linux上运行,而无需安装其他软件。

因此,用于在Excel工作簿中导入所有工作表的功能是:

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
}

可以这样调用:

mysheets <- read_excel_allsheets("foo.xls")

旧答案

在@mnel提供的答案的基础上,这是一个简单的函数,它将Excel文件作为参数,并将每个工作表作为data.frame返回到命名列表中。

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

因此,可以通过以下方式调用它:

importWorksheets('test.xls')

优秀,只是学习readxl有一种excel_sheets方法。精彩。
MichaelChirico

1
@ user7071759如果我了解您,则您应该可以在中加入path filename。例如,read_excel_allsheets(“ my / path / to / file / example.xls”)
Jeromy Anglim'1

1
看来,这个新答案给了我列表中的一个列表,而不是列表中的数据框。
海伦

4
我正在获取列表,而不是数据框。
J Walt

1
此函数的更简单版本为lapply(excel_sheets(file.path), function(x) read_excel(file.path, x))。如果您更喜欢非标记,只需将read_excel包装在中as.data.frame()。之后必须分配名称。
glaucon '18 -10-11

45

请注意,大多数XLConnect功能已被矢量化。这意味着您可以通过一个函数调用来读取所有工作表,而不必进行显式矢量化:

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

使用XLConnect 0.2-0,lst将已经是一个命名列表。


11
对我来说,这有效 require(XLConnect) wb <- loadWorkbook("excel.xlsx") lst = readWorksheet(wb, sheet = getSheets(wb))
Kim Stacks 2014年

3
我也是。解决方案的答案对我不起作用,即使文件存在也无法找到文件
Z_D 2015年

2
与的通话system.file()对我也不起作用。
Nikos Alexandris

而是使用loadWorkbook(system.file(“ demoFiles / mtcars.xlsx”,package =“ XLConnect”)),直接使用loadWorkbook(“ demoFiles / mtcars.xlsx”)加载工作簿。有用。
加兹2017年

23

我偶然发现了这个古老的问题,我认为最简单的方法仍然缺失。

您可以只用rio一行代码来导入所有Excel工作表。

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

如果您是的爱好者tidyverse,可以通过将setclass参数添加到函数调用中来轻松地将它们作为小标题导入。

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

假设它们具有相同的格式,则可以通过将rbind参数设置为来轻松行绑定它们TRUE

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

2
rio::import_list是个不错的选择。它也可以导入工作表的子集,例如import_list("test.xls", which = c(1, 2)),这可能真的有用。我同意这是最简单的选择。
丹尼

@Danny我不知道这个which说法。确实可以派上用场。
j3ypi


12

由于这是该问题的重头戏:阅读多页Excel即可列出:

这是openxlsx解决方案:

filename <-"myFilePath"

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

7

您可以加载的工作簿,然后使用lapplygetSheets并且readWorksheet做这样的事情。

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

马丁不错!
ASH

4

要从工作簿中读取多张图纸,请使用readxl程序包,如下所示:

library(readxl)
library(dplyr)

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

在这里,bind_rows(dplyr)将所有工作表中的所有数据行放入一个数据帧中,并且path_to_workbook是数据的位置:“ dir / of / the / data / workbook”。




1

补充保罗的答案。表格也可以使用以下方式连接:

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

需要的库:

if(!require(pacman))install.packages("pacman")
pacman::p_load("tidyverse","readxl","purrr")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.