在R中将文件夹中所有Excel工作簿的工作表导入为独立数据集
批量导入指定文件夹内Excel所有工作表的R实现
以下是修改后的代码,可实现将指定文件夹内所有Excel工作簿的全部工作表导入为独立数据集,每个数据集以「工作簿名_工作表名」命名:
library(openxlsx) library(tidyverse) # 定义导入函数,参数为目标文件夹路径 import_all_excel_sheets <- function(folder_path) { # 获取文件夹内所有xlsx格式文件的完整路径 files_list <- list.files(path = folder_path, pattern = "\\.xlsx$", full.names = TRUE) # 遍历每个Excel文件,读取所有工作表 all_sheets <- map(files_list, function(file) { # 获取当前文件的所有工作表名称 sheet_names <- getSheetNames(file) # 读取每个工作表,返回以工作表名为键的列表 map(sheet_names, ~readWorkbook(file, sheet = .x)) %>% set_names(sheet_names) }) %>% # 外层以工作簿名(去掉后缀)为键 set_names(str_remove(basename(files_list), "\\.xlsx$")) # 将嵌套列表展开为单层列表,并生成「工作簿名_工作表名」的命名 flattened_list <- flatten(all_sheets) new_names <- map2(names(all_sheets), names(all_sheets[[1]]), ~paste0(.x, "_", .y)) %>% flatten_chr() names(flattened_list) <- new_names # 将数据框导出到全局环境(注意:大量数据建议保留在列表中操作) list2env(flattened_list, env = .GlobalEnv) # 返回整理好的列表,方便后续处理 return(flattened_list) } # 使用示例:替换为你的目标文件夹路径 import_all_excel_sheets("your/folder/path/here")
关键修改说明
- 遍历所有工作表:新增
getSheetNames(file)获取当前工作簿的所有工作表名称,再通过内层map逐个读取,替代原代码中指定单个工作表的逻辑。 - 命名规则优化:通过
str_remove(basename(files_list), "\\.xlsx$")提取不带后缀的工作簿名,再与工作表名拼接成最终数据集名称。 - 嵌套列表扁平化:将按工作簿分组的嵌套列表展开为单层列表,确保每个工作表对应独立的列表元素,再通过
list2env导出到全局环境。
原代码作者提到的「建议保留列表结构而非导出到全局环境」依然适用——如果工作表数量较多,全局环境会变得杂乱,后续统一在列表中进行合并、筛选等操作会更高效。
内容的提问来源于stack exchange,提问作者h09812349
相关产品推荐
相关产品推荐

