如何将多个行数不同的tibble导出至Excel各工作表?
批量导出多个tibble到同一Excel工作簿报错解决
你已通过以下代码将多个Excel工作簿的工作表导入为R中的tibble列表:
my_data = expand_grid( file = list.files("~path", full.names = TRUE), sheet = seq(6) ) %>% transmute(data = file %>% map2(sheet, ~ read_excel(path = .x, sheet = .y, skip = 2))) %>% pull(data)
但尝试用自定义函数导出时出现错误:
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, :
arguments imply differing number of rows: 4, 52, 8, 0, 5
错误原因
你的自定义函数仅支持处理单个数据框,但你传入的my_data是tibble列表。writeData会把整个列表当作数据框解析,而列表内各tibble行数不同,因此触发行不匹配错误。
解决方案
使用purrr的walk2函数遍历列表,逐个将tibble添加到同一工作簿的不同工作表中:
- 加载所需包
library(openxlsx) library(purrr)
- 基础版:序号命名工作表
# 创建空工作簿 wb <- createWorkbook() # 生成简单的工作表名称(如Sheet_1, Sheet_2...) sheet_names <- paste0("Sheet_", seq_along(my_data)) # 循环写入每个tibble到对应工作表 walk2(my_data, sheet_names, function(df, sheet_name) { addWorksheet(wb, sheetName = sheet_name) writeData(wb, sheet = sheet_name, x = df) }) # 保存工作簿 saveWorkbook(wb, file = "output.xlsx", overwrite = TRUE)
- 进阶版:原文件名+工作表号命名
如果需要更具辨识度的工作表名称,可保留原文件与工作表的对应关系:
# 重新获取文件和工作表的对应信息 file_sheet_info <- expand_grid( file = list.files("~path", full.names = TRUE), sheet = seq(6) ) # 提取纯文件名(去掉路径和后缀) file_names <- basename(file_sheet_info$file) %>% tools::file_path_sans_ext() # 生成「文件名_工作表号」格式的工作表名 sheet_names <- paste(file_names, file_sheet_info$sheet, sep = "_") # 循环写入并保存 wb <- createWorkbook() walk2(my_data, sheet_names, function(df, sheet_name) { addWorksheet(wb, sheetName = sheet_name) writeData(wb, sheet = sheet_name, x = df) }) saveWorkbook(wb, file = "output.xlsx", overwrite = TRUE)
内容的提问来源于stack exchange,提问作者Maria Hernandez
相关产品推荐
相关产品推荐

