R中使用writexl::write_xlsx循环导出多数据框到Excel不同工作表报错如何解决
错误原因
- 核心报错是
writexl::write_xlsx()的参数用法不匹配:该函数本身没有sheet和excel这两个参数,你混用了其他Excel导出包的参数规则,才触发了「unused arguments」的报错。 - 除此之外代码里还有一处笔误:你生成的目标数据框命名为
dframe_flt,但写入函数里传入的变量名是dframe,就算参数修正也会报对象未找到的错误。 writexl包本身是轻量导出工具,不支持增量追加工作表,每次调用write_xlsx都会直接覆盖原有文件,并不适合用循环逐次写入多个工作表的场景。
修复方案
方案1:用writexl一次性导出(推荐,代码更简洁)
writexl导出多工作表的逻辑是传入命名列表,列表的每个元素对应一个工作表的数据框,列表名就是对应的工作表名称,不需要写循环:
library(nycflights13) library(writexl) library(dplyr) carriers <- c("UA", "AA", "B6", "DL") # 生成带命名的导出列表 output_list <- lapply(carriers, function(cur_carrier) { flights %>% filter(carrier == cur_carrier) %>% summarize(distance_m = mean(distance)) }) names(output_list) <- carriers # 一次性导出所有工作表 write_xlsx( x = output_list, path = "flights_data.xlsx", col_names = TRUE )
方案2:如果需要用循环逐次写入,改用openxlsx包实现
openxlsx支持工作表的增量追加,符合循环写入的需求:
library(nycflights13) library(openxlsx) library(dplyr) carriers <- c("UA", "AA", "B6", "DL") # 先创建空白工作簿 wb <- createWorkbook() for(i in seq_along(carriers)){ dframe_flt <- flights %>% filter(carrier == carriers[i]) %>% summarize(distance_m = mean(distance)) # 新增工作表并写入数据 addWorksheet(wb, sheetName = carriers[i]) writeData(wb, sheet = carriers[i], x = dframe_flt, colNames = TRUE) } # 保存最终文件 saveWorkbook(wb, file = "flights_data.xlsx", overwrite = TRUE)
内容的提问来源于stack exchange,提问作者Anup
相关产品推荐
相关产品推荐

