【问题标题】:Applying style to all sheets of a workbook using openxlsx package in R使用 R 中的 openxlsx 包将样式应用于工作簿的所有工作表
【发布时间】:2016-06-07 10:51:16
【问题描述】:

在 R 中使用 openxlsx 包时,我想将特定样式应用于工作簿的所有工作表。我在定义样式后使用addStyle()。在这里,我需要指定需要添加样式的工作表名称或编号

addStyle(wb, sheet=1, style, rows, cols, gridExpand = FALSE, stack = FALSE)

有没有一种简单的方法可以做到这一点,而无需使用任何循环或为每张纸单独添加样式?原因是每次运行时张数都可能改变

【问题讨论】:

    标签: r


    【解决方案1】:

    只是为了扩展丹尼的猜想

    如果没有某种 for 循环/应用功能,我认为没有办法对所有工作表使用 addStyle

    为了完整起见 - 还有另一种可能性:来自 tidyversepurrr 包!这是一种函数式编程方式,可让您避免循环。

    关于如何通过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 和函数式编程。

    【讨论】:

      【解决方案2】:

      您不必为循环使用固定数字。如果您循环通过names(wb)

      for(curr_sheet in names(wb))

      并将该值传递给sheet 参数,无论您何时更改纸张数量,它都会起作用。

      如果没有某种 for 循环/应用功能,我认为没有办法对所有工作表使用 addStyle

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 2016-03-14
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 2013-04-03
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        相关资源
        最近更新 更多