【问题标题】:Read all worksheets in an Excel workbook into an R list with data.frames将 Excel 工作簿中的所有工作表读入带有 data.frames 的 R 列表
【发布时间】:2012-10-18 01:06:00
【问题描述】:

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

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

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

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

【问题讨论】:

标签: r excel xlconnect


【解决方案1】:

使用 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 方法。太棒了。
  • @user7071759 如果我理解你,那么你应该能够在filename 中包含路径。例如,read_excel_allsheets("my/path/to/file/example.xls")
  • 似乎这个新答案给了我一个列表中的列表,而不是列表中的数据框。
  • 我得到的是列表,而不是数据框。
  • 这个函数的一个更简单的版本是lapply(excel_sheets(file.path), function(x) read_excel(file.path, x))。如果您更喜欢非 tibble,只需将 read_excel 包装在 as.data.frame() 中。之后必须指定名称。
【解决方案2】:

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

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

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

【讨论】:

  • 对我来说,这工作require(XLConnect) wb &lt;- loadWorkbook("excel.xlsx") lst = readWorksheet(wb, sheet = getSheets(wb))
  • 我也是。解决方案的答案对我不起作用,即使文件存在也无法找到它
  • system.file() 的通话对我也不起作用。
  • 而不是使用 loadWorkbook(system.file("demoFiles/mtcars.xlsx", package = "XLConnect")),直接使用 loadWorkbook("demoFiles/mtcars.xlsx") 加载工作簿。它有效。
  • 这是受密码保护的 xlsx 的最佳答案
【解决方案3】:

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

您可以使用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)

【讨论】:

  • rio::import_list 是一个不错的选择。它还可以导入工作表的子集,例如import_list("test.xls", which = c(1, 2)) 这真的很有用。我同意这是这里最简单的选择。
  • @Danny 我不知道which 参数。它确实可以派上用场。
【解决方案4】:

来自官方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

【讨论】:

  • 保留工作表名称,df &lt;- path %&gt;% excel_sheets() %&gt;% set_names() %&gt;% map_dfr(read_excel, path = path, .id = "SheetName")
【解决方案5】:

因为这是问题的第一个热门:Read multi sheet excel to list:

这里是openxlsx 解决方案:

filename <-"myFilePath"

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

【讨论】:

    【解决方案6】:

    您可以加载工作簿,然后使用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)})
    

    【讨论】:

    • 不错的马丁!!
    【解决方案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")
    

    【讨论】:

    • 使用工作表名称添加新列的详细信息!
    • 我同意。基于工作表名称的新列的一个非常好的副作用。
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

      excel.link 将完成这项工作。

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

      顺便说一句,您可以通过浏览至 http://cran.r-project.org/web/packages/available_packages_by_name.html

      【讨论】:

        【解决方案10】:

        只是为了简化@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))
        

        【讨论】:

          【解决方案11】:

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

          经过更多研究,我偶然发现了 openxlsx,而这个终于成功了(而且速度很快) Importing a big xlsx file into R?

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-10-25
            • 1970-01-01
            • 1970-01-01
            • 2021-04-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-10
            相关资源
            最近更新 更多