Đọc tất cả các trang tính trong sổ làm việc Excel vào danh sách R với data.frames


78

Tôi hiểu rằng XLConnectcó thể được sử dụng để đọc một trang tính Excel thành R. Ví dụ: điều này sẽ đọc trang tính đầu tiên trong một sổ làm việc được gọi là test.xlsR.

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

Tôi có một Sổ làm việc Excel với nhiều trang tính.

Làm cách nào để có thể nhập tất cả các trang tính trong sổ làm việc vào một danh sách trong R trong đó mỗi phần tử của danh sách là data.frame cho một trang tính nhất định và trong đó tên của mỗi phần tử tương ứng với tên của trang tính trong Excel?


ngoài xlconnectreadxl, gói xlsxgiấy phép để thao tác các file excel trong R(tất cả các tờ hoặc chỉ một số)
Cath

Câu trả lời:


116

Cập nhật câu trả lời bằng readxl (ngày 22 tháng 6 năm 2015)

Kể từ khi đăng câu hỏi này, readxlgói đã được phát hành. Nó hỗ trợ cả hai xlsxlsxđịnh dạng. Điều quan trọng, trái ngược với các gói nhập excel khác, nó hoạt động trên Windows, Mac và Linux mà không yêu cầu cài đặt thêm phần mềm.

Vì vậy, một hàm để nhập tất cả các trang tính trong sổ làm việc Excel sẽ là:

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
}

Điều này có thể được gọi bằng:

mysheets <- read_excel_allsheets("foo.xls")

Câu trả lời cũ

Dựa trên câu trả lời được cung cấp bởi @mnel, đây là một hàm đơn giản lấy tệp Excel làm đối số và trả về mỗi trang tính dưới dạng data.frame trong danh sách được đặt tên.

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

Do đó, nó có thể được gọi với:

importWorksheets('test.xls')

xuất sắc, chỉ học mà readxlexcel_sheetsphương pháp. Tuyệt vời.
MichaelChirico

1
@ user7071759 nếu tôi hiểu bạn thì bạn chỉ cần đưa đường dẫn vào là được filename. Ví dụ: read_excel_allsheets ("my / path / to / file / example.xls")
Jeromy Anglim

1
Có vẻ như câu trả lời mới này cho tôi một danh sách trong một danh sách chứ không phải một khung dữ liệu trong một danh sách.
Helen

4
Tôi đang nhận danh sách chứ không phải khung dữ liệu.
J Walt

1
Một phiên bản đơn giản hơn của chức năng này sẽ là lapply(excel_sheets(file.path), function(x) read_excel(file.path, x)). Nếu bạn thích tính năng non-tibble, chỉ cần bọc read_excel vào as.data.frame(). Tên sẽ phải được chỉ định sau.
glaucon

45

Lưu ý rằng hầu hết các chức năng của XLConnect đã được vector hóa. Điều này có nghĩa là bạn có thể đọc trong tất cả các trang tính bằng một lệnh gọi hàm mà không cần phải vectơ hóa rõ ràng:

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

Với XLConnect 0.2-0 lst sẽ là một danh sách có tên.


11
Đối với tôi, công trình này require(XLConnect) wb <- loadWorkbook("excel.xlsx") lst = readWorksheet(wb, sheet = getSheets(wb))
Kim Stacks

3
Tôi cũng vậy. Câu trả lời giải pháp không hoạt động với tôi, không thể định vị tệp mặc dù nó tồn tại
Z_D

2
Cuộc gọi với system.file()cũng không hoạt động với tôi.
Nikos Alexandris

thay vào đó sử dụng loadWorkbook (system.file ("demoFiles / mtcars.xlsx", package = "XLConnect")), trực tiếp sử dụng loadWorkbook ("demoFiles / mtcars.xlsx") để tải sổ làm việc. Nó hoạt động.
Qazi

23

Tôi tình cờ gặp câu hỏi cũ này và tôi nghĩ rằng cách tiếp cận dễ nhất vẫn còn thiếu.

Bạn có thể sử dụng riođể nhập tất cả các trang tính excel chỉ với một dòng mã.

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

Nếu bạn là người yêu thích tidyverse, bạn có thể dễ dàng nhập chúng dưới dạng nhỏ bằng cách thêm setclassđối số vào lệnh gọi hàm.

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

Giả sử chúng có cùng định dạng, bạn có thể dễ dàng ràng buộc chúng bằng cách đặt rbindđối số thành TRUE.

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

2
rio::import_listlà một lựa chọn tuyệt vời. Nó cũng có thể nhập một tập hợp con của các trang tính, ví dụ import_list("test.xls", which = c(1, 2))có thể thực sự hữu ích. Tôi đồng ý đó là lựa chọn dễ dàng nhất ở đây.
Danny

@Danny Tôi không biết về whichđối số. Nó thực sự có thể hữu ích.
j3ypi


13

Vì đây là điểm số một cho câu hỏi: Đọc nhiều trang tính excel để liệt kê:

đây là openxlsxgiải pháp:

filename <-"myFilePath"

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

7

Bạn có thể tải các cuốn sách làm việc và sau đó sử dụng lapply, getSheetsreadWorksheetvà làm điều gì đó như thế này.

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

Tốt lắm, Martin !!
ASH

4

Để đọc nhiều trang tính từ một sổ làm việc, hãy sử dụng gói readxl như sau:

library(readxl)
library(dplyr)

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

Ở đây, bind_rows ( dplyr) sẽ đặt tất cả các hàng dữ liệu từ tất cả các trang tính vào một khung dữ liệu và path_to_workbooklà vị trí của dữ liệu của bạn: "dir / of / the / data / workbook".




1

Thêm vào câu trả lời của Paul. Các trang tính cũng có thể được nối bằng cách sử dụng một cái gì đó như sau:

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

Các thư viện cần có:

if(!require(pacman))install.packages("pacman")
pacman::p_load("tidyverse","readxl","purrr")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.