使用R读取多Excel文件指定工作表特定单元格报错求助
问题描述
我有一个包含多个xlsm和xlsx格式Excel文件的文件夹,需要读取每个文件“SUMMARY”工作表中的特定单元格,将每个文件的结果作为一行汇总到数据框中。单个文件处理时代码可行,但批量处理时出现错误:
Error in rbind2(argl[[i]], r) : cannot coerce type 'closure' to vector of type 'list'
已确认file.list可正确获取所有文件。
单个文件处理代码
ClassID <- "test" ClassDate <- read_excel("file1.xlsm", sheet = "SUMMARY", range = "E1:E1", col_names=FALSE)[[1]] Curriculum <- read_excel("file1.xlsm", sheet = "SUMMARY", range = "C3:C3", col_names=FALSE)[[1]] Summary <- cbind(ClassID, ClassDate, Curriculum)
批量处理报错代码
file.list <- list.files(pattern = '*.xls') df.list <- lapply(file.list, read_excel) for (i in file.list){ ClassID <- "test" ClassDate <- read_excel(i, sheet = "SUMMARY", range = "E1:E1", col_names=FALSE)[[1]] Curriculum <- read_excel(i, sheet = "SUMMARY", range = "C3:C3", col_names=FALSE)[[1]] SummaryNew <- cbind(ClassID, ClassDate, Curriculum) Summary <- rbind(Summary,SummaryNew) }
错误原因
- 未初始化汇总数据框:第一次循环时
Summary未定义,R会误将其识别为内置的summary()函数(属于closure类型),导致rbind无法完成类型匹配。 - 文件匹配规则错误:
pattern = '*.xls'无法匹配xlsm和xlsx后缀的文件,需要调整正则表达式。 - 重复读取文件:每个文件被读取两次(分别提取E1和C3单元格),浪费IO资源。
- 矩阵与数据框混淆:
cbind返回的是矩阵而非数据框,后续rbind操作容易出现类型兼容问题。
修正后的代码
# 匹配所有xlsm/xlsx格式文件 file.list <- list.files(pattern = '\\.xls[xm]?$') # 初始化空的汇总数据框,提前指定列类型 Summary <- data.frame( ClassID = character(), ClassDate = character(), # 可根据实际数据类型改为Date/numeric等 Curriculum = character(), stringsAsFactors = FALSE ) for (file in file.list) { # 仅读取一次目标工作表,减少IO操作 summary_sheet <- read_excel(file, sheet = "SUMMARY", col_names = FALSE) ClassID <- "test" ClassDate <- summary_sheet[[1, 5]] # E1对应第1行第5列 Curriculum <- summary_sheet[[3, 3]] # C3对应第3行第3列 # 生成单行数据框并追加到汇总表 SummaryNew <- data.frame( ClassID = ClassID, ClassDate = ClassDate, Curriculum = Curriculum, stringsAsFactors = FALSE ) Summary <- rbind(Summary, SummaryNew) }
额外优化方案
如果文件数量较多,推荐使用purrr包的map_dfr函数替代循环,代码更简洁高效:
library(purrr) # 定义单个文件的提取逻辑 extract_summary <- function(file) { sheet <- read_excel(file, sheet = "SUMMARY", col_names = FALSE) data.frame( ClassID = "test", ClassDate = sheet[[1,5]], Curriculum = sheet[[3,3]], stringsAsFactors = FALSE ) } # 批量处理并合并结果 file.list <- list.files(pattern = '\\.xls[xm]?$') Summary <- map_dfr(file.list, extract_summary)
内容的提问来源于stack exchange,提问作者googlesheet test
相关产品推荐
相关产品推荐

