You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因

  1. 未初始化汇总数据框:第一次循环时Summary未定义,R会误将其识别为内置的summary()函数(属于closure类型),导致rbind无法完成类型匹配。
  2. 文件匹配规则错误:pattern = '*.xls'无法匹配xlsm和xlsx后缀的文件,需要调整正则表达式。
  3. 重复读取文件:每个文件被读取两次(分别提取E1和C3单元格),浪费IO资源。
  4. 矩阵与数据框混淆: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 07:54:17