首页 文章

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

提问于
浏览
54

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

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

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

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

9 回答

  • 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')
    
  • 3

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

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

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

  • 41

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

    这是 openxlsx 解决方案:

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

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

  • 82

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

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

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

    excel.link将完成这项工作 .

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

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

  • 9

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

    经过更多的研究,我偶然发现了openxlsx,这个终于完成了诀窍(并且快速)Importing a big xlsx file into R?

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

  • 6

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

相关问题