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

时间:2012-10-18 01:06:01

标签: r excel xlconnect

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

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

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

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

10 个答案:

答案 0 :(得分:82)

使用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')

答案 1 :(得分:41)

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

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

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

答案 2 :(得分:9)

因为这是问题的第一个问题:阅读多表格excel列出:

这是openxlsx解决方案:

filename <-"myFilePath"

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

答案 3 :(得分:9)

从官方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

答案 4 :(得分:8)

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

您只需使用一行代码就可以使用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)

答案 5 :(得分:7)

您可以加载工作簿,然后使用lapplygetSheetsreadWorksheet并执行此类操作。

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

答案 6 :(得分:3)

excel.link将完成这项工作。

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

顺便说一句,你可以很容易地找到所有提到单词&#34; Excel&#34;通过浏览 http://cran.r-project.org/web/packages/available_packages_by_name.html

答案 7 :(得分:1)

我尝试了上述操作,并且我需要转换的20MB Excel数据量存在问题;因此上述内容对我不起作用。

经过更多的研究,我偶然发现了openxlsx,这个终于做到了(快速) Importing a big xlsx file into R?

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

答案 8 :(得分:1)

要从工作簿中读取多个工作表,请使用readxl包,如下所示:

library(readxl)
library(dplyr)

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

这里,bind_row(dplyr)将放置所有工作表中的所有数据行 在一个数据框中,path_to_workbook是“dir / of / data / workbook”。

答案 9 :(得分:0)

增加了保罗的答案。还可以使用以下方式将工作表连接起来:

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