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

如何使用group_walk()结合openxlsx2的wb对象生成格式化XLSX文件

解决方案

要实现按cyl分组生成带有统一属性的XLSX文件,核心是为每个分组创建独立的工作簿实例,并将分组数据写入该工作簿后保存。以下是修正后的代码:

方法一:封装模板函数(便于复用)

library(openxlsx2)
library(tidyverse)

# 定义统一的工作簿模板
create_wb_template <- function(sheet_name = "Cyl") {
  wb_workbook(creator = "Me") %>%
    wb_add_worksheet(sheet_name) %>%
    wb_set_col_widths(1, widths = "auto")
}

mtcars %>%
  group_by(cyl) %>%
  group_walk(function(data, group) {
    # 为当前分组创建新的工作簿
    wb <- create_wb_template()
    # 将分组数据写入工作表
    wb_add_data(wb, x = data)
    # 保存为对应文件名的XLSX
    wb_save(wb, paste0(group$cyl, ".xlsx"))
  })

方法二:直接在迭代内构建工作簿(更简洁)

library(openxlsx2)
library(tidyverse)

mtcars %>%
  group_by(cyl) %>%
  group_walk(~ {
    # 为当前分组创建带属性的工作簿,同时写入数据
    wb <- wb_workbook(creator = "Me") %>%
      wb_add_worksheet("Cyl") %>%
      wb_set_col_widths(1, widths = "auto") %>%
      wb_add_data(x = .x)
    # 保存文件
    wb_save(wb, paste0(.y$cyl, ".xlsx"))
  })

关键说明

  • 不能复用同一个wb对象:每个分组必须创建独立的工作簿实例,否则所有分组数据会被写入同一个工作簿,最终仅保留最后一次的结果。
  • 正确关联数据与工作簿:必须通过wb_add_data()将分组数据添加到工作簿的工作表中,再执行wb_save(),而非直接将数据传给wb_save()。
  • 模板复用:如果需要统一调整工作簿属性(如创建者、列宽、样式),封装模板函数可以避免重复代码,方便后续修改。

内容的提问来源于stack exchange,提问作者Bregma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:32:21