只是为了扩展丹尼的猜想
如果没有某种 for 循环/应用功能,我认为没有办法对所有工作表使用 addStyle。
为了完整起见 - 还有另一种可能性:来自 tidyverse 的 purrr 包!这是一种函数式编程方式,可让您避免循环。
关于如何通过openxlsx 和具有不同长度的 data.frames 将样式添加到多个工作表的最小可重复示例:
library(purrr)
library(openxlsx)
# random data.frames
a <- data.frame(name = c("A", "B", "C"),
value = c(0.01, 0.02, 0.03))
b <- data.frame(name = c("D", "E", "F", "G"),
value = c(0.01, 0.02, 0.03, 0.04))
# functional programing is mainly based on lists
l <- list(a, b)
# Excel Sheets
sheet_names <- c("SheetA", "SheetB")
# Create the workbook
wb <- createWorkbook()
# Walk replaces the for-loop to create empty sheets given our variable
# sheet_names = .x
walk(sheet_names, ~addWorksheet(wb, .x))
# Walk2 takes a second parameter, in our case the list of data.frames
# sheet_names = .x
# l = .y
walk2(sheet_names, l, ~writeData(wb, .x, .y))
# To apply a certain style, i.e. percentage format, we need to know the number of rows
# for each data.frame. Thus, walk2 helps us to circumvent a nested for-loop
# sheet_names = .x
# l = .y
walk2(sheet_names, l, ~addStyle(wb, .x,
style = createStyle(numFmt='PERCENTAGE'),
rows = 2:(nrow(.y)+1), cols = 2, gridExpand = TRUE))
# Save the workbook
saveWorkbook(wb, "myfile.xlsx", overwrite = T)
当然,在这样一个小例子中,for 循环很容易实现,但是当要求变得更严格并且您想提高脚本的速度时,请使用 purrr 和函数式编程。