如何在R中批量生成带条件格式的独立.xlsx文件
解决方案
要实现按指定列拆分数据集为多个带条件格式的Excel工作簿,只需将拆分数据的逻辑与条件格式代码结合,在遍历每个子数据集时完成格式设置。以下是完整可运行的代码及说明:
完整代码
library(openxlsx) # 示例数据 df <- data.frame ( assign = c("YES", "NO", "NO", "YES", "NO", "YES", "YES", "NO"), dept = c("HIST","HIST", "PSYC", "PSYC", "PSYC", "ENGL", "ENGL", "ENGL"), class = c(1009, 1330, 1001, 1015, 2190, 1001, 3001, 4390)) # 预定义样式 # "NO"行样式:红色字体 noadmin <- createStyle(fontColour = "#FF0000", fontSize = 10) # 表头样式:加粗、浅黄色填充、全边框 Heading <- createStyle(textDecoration = "bold", fgFill = "#FFFFCC", border = "TopBottomLeftRight") # 按dept列拆分数据集,得到各部门子数据框列表 dept_list <- split(df, df$dept, drop = TRUE) # 遍历每个部门数据,生成带格式的独立Excel文件 lapply(names(dept_list), function(dept_name) { # 获取当前部门子数据集 current_data <- dept_list[[dept_name]] # 创建新工作簿与工作表 wb <- createWorkbook() addWorksheet(wb, sheetName = dept_name, gridLines = TRUE) # 写入数据并启用筛选器 writeData(wb, sheet = dept_name, x = current_data, withFilter = TRUE) # 冻结首行,方便滚动查看 freezePane(wb, sheet = dept_name, firstActiveRow = 2) # 为表头应用样式 addStyle(wb, sheet = dept_name, style = Heading, rows = 1, cols = 1:ncol(current_data)) # 定位需格式化的行(+1是因为Excel表头占第1行,数据从第2行开始) target_rows <- which(current_data$assign == "NO") + 1 # 存在目标行时应用样式 if (length(target_rows) > 0) { addStyle(wb, sheet = dept_name, style = noadmin, rows = target_rows, cols = 1:ncol(current_data), gridExpand = TRUE) } # 保存工作簿 saveWorkbook(wb, file = paste0("report_", dept_name, ".xlsx"), overwrite = TRUE) })
关键说明
- 替换快速写入为底层操作:之前用
write.xlsx无法插入格式,改用createWorkbook()+addWorksheet()+writeData()的组合,这是openxlsx包添加格式的标准流程。 - 子数据集独立处理:在
lapply循环中,每个部门的子数据框都单独创建工作簿、设置格式,避免全局数据的格式冲突。 - 行号校正:Excel表头占第1行,数据行从第2行开始,因此需要将
which()得到的行号加1,对应到Excel中的正确位置。
内容的提问来源于stack exchange,提问作者vinnyd
相关产品推荐
相关产品推荐

