如何在R导出Excel时实现行分组与表格缩进?
自动化实现Excel分组聚合导出
你需要将DataFrame导出为Excel时,实现sex列按分组合并单元格的格式(如期望输出所示),以下是基于openxlsx包的自动化解决方案,可直接复用在同结构的真实数据上:
完整代码
library(tidyverse) library(openxlsx) # 示例数据处理(真实数据直接替换此处的df即可) df <- starwars %>% select(name, height, mass, hair_color, skin_color, eye_color, sex) %>% filter(!is.na(sex)) %>% group_by(sex) %>% slice_head(n = 3) %>% ungroup() %>% select(sex, everything()) # 创建Excel工作簿与工作表 wb <- createWorkbook() addWorksheet(wb, sheetName = "分组数据") # 将数据写入工作表(表头在第2行,数据从第3行开始) writeData(wb, sheet = "分组数据", x = df, startRow = 2, startCol = 1) # 设置表头样式(增强可读性,可选) header_style <- createStyle(fontSize = 12, fontColour = "#FFFFFF", fgFill = "#4F81BD", halign = "center", valign = "center", textDecoration = "bold") addStyle(wb, sheet = "分组数据", style = header_style, rows = 2, cols = 1:ncol(df)) # 按sex分组计算需要合并的Excel单元格范围 group_info <- df %>% group_by(sex) %>% summarise( start_row = cur_group_rows()[1] + 2, # 对应Excel数据起始行(表头占1行) end_row = start_row + n() - 1 ) %>% ungroup() # 批量合并同一分组的sex列单元格 for (i in 1:nrow(group_info)) { mergeCells(wb, sheet = "分组数据", rows = group_info$start_row[i]:group_info$end_row[i], cols = 1) } # 设置合并后单元格的垂直居中格式 merge_style <- createStyle(valign = "center") addStyle(wb, sheet = "分组数据", style = merge_style, rows = unlist(map2(group_info$start_row, group_info$end_row, seq)), cols = 1, gridExpand = TRUE) # 保存最终文件 saveWorkbook(wb, "分组数据.xlsx", overwrite = TRUE)
核心逻辑说明
- 数据适配:保持你原有的数据筛选、分组逻辑,只需确保分组列(示例中为
sex)在DataFrame的第一列,若位置不同,调整代码中cols参数对应列号即可。 - 格式自动化:通过分组计算每个类别对应的Excel行范围,批量完成单元格合并,同时配置统一的表头、合并单元格样式,完全匹配期望输出格式。
- 复用性:后续更新数据时,仅需替换代码中的
df对象,即可一键生成符合要求的Excel文件。
内容的提问来源于stack exchange,提问作者Ruam Pimentel
相关产品推荐
相关产品推荐

