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

如何将多个行数不同的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添加到同一工作簿的不同工作表中:

  1. 加载所需包
library(openxlsx)
library(purrr)
  1. 基础版:序号命名工作表
# 创建空工作簿
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)
  1. 进阶版:原文件名+工作表号命名
    如果需要更具辨识度的工作表名称,可保留原文件与工作表的对应关系:
# 重新获取文件和工作表的对应信息
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:45:29