93

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

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

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

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

4

11 回答 11

139

使用 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')
于 2012-10-18T01:29:14.607 回答
46

请注意,大部分 XLConnect 的功能已经矢量化。这意味着您可以通过一个函数调用读取所有工作表,而无需进行显式矢量化:

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

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

于 2012-10-18T06:31:01.417 回答
36

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

rio只需一行代码即可导入所有 Excel 工作表。

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

如果您是 . 的粉丝,您可以通过将参数添加到函数调用tidyverse中轻松地将它们作为 tibbles 导入。setclass

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

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

data_list <- import_list("test.xls", setclass = "tbl", rbind = TRUE)
于 2018-03-23T14:25:46.033 回答
29

来自官方readxl(tidyverse)文档(更改第一行):

path <- "data/datasets.xlsx"

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

详情见: http ://readxl.tidyverse.org/articles/articles/readxl-workflows.html#iterate-over-multiple-worksheets-in-a-workbook

于 2018-03-23T19:58:14.420 回答
18

由于这是该问题的第一个命中:阅读多表 excel 以列出:

这是openxlsx解决方案:

filename <-"myFilePath"

sheets <- openxlsx::getSheetNames(filename)
SheetList <- lapply(sheets,openxlsx::read.xlsx,xlsxFile=filename)
names(SheetList) <- sheets
于 2018-01-18T09:50:33.437 回答
7

您可以加载工作簿,然后使用lapply,getSheetsreadWorksheet执行类似的操作。

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)})
于 2012-10-18T01:14:28.310 回答
7

添加到保罗的答案。这些工作表也可以使用以下方式连接:

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")
于 2019-07-30T15:28:08.810 回答
5

要从工作簿中读取多个工作表,请使用 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”。

于 2018-05-25T19:57:27.693 回答
3

excel.link将完成这项工作。

实际上,我发现它比 XLConnect 更容易使用(并不是说这两个包都很难使用)。两者的学习曲线约为 5 分钟。

顺便说一句,您可以通过浏览http://cran.r-project.org/web/packages/available_packages_by_name.html轻松找到所有提到“Excel”一词的 R 包

于 2014-04-02T21:36:43.880 回答
2

只是为了简化@Jeromy Anglim 非常有用的回复:

allsheets <- sapply(readxl::excel_sheets("your_file.xlsx"), simplify = F, USE.NAMES = T,
            function(X) readxl::read_excel("your_file.xlsx", sheet = X))
于 2021-10-29T08:02:26.310 回答
1

我尝试了上述方法,但我需要转换的 20MB Excel 包含的数据量存在问题;因此以上对我不起作用。

经过更多研究后,我偶然发现了 openxlsx,而这个终于成功了(而且速度很快) 将一个大的 xlsx 文件导入到 R 中?

https://cran.r-project.org/web/packages/openxlsx/openxlsx.pdf

于 2017-01-23T19:29:02.670 回答