将多个数据帧(df列表)写入excel工作表,其中df name == worksheet name

时间:2019-04-09 18:35:43

标签: r

我正在尝试将多个数据框保存到单个工作簿的多个表中,其中工作表名称与df名称相同。

让我们在df $ 1列表中将以下内容拆分为df 10,我如何将它们保存到工作表名为1到10的工作簿中。

library(tidyverse)
library(openxlsx)

data <- tibble( x = 1:10,
                y = runif(10,0.1,10),
                z = runif(10,0.1,10))

df <- split(data, data$x)

wb <- loadWorkbook("template.xlsx")

这里缺少步骤,我厌倦了使用purrr:map(对purrr和R普遍不了解),但不确定如何馈送df $ {1对应于名为1的工作表。 >

map(df,function(x) x %>% 
      writeData(wb,.....)
saveWorkbook(wb, "finished_workbook.xlsx")

非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

您不需要外部软件包,mapply可以满足您的需求。
请注意,工作簿"template.xlsx"必须已经存在。

library(openxlsx)

df <- split(data, data$x)

wb <- loadWorkbook("template.xlsx")

现在棘手的部分。 mapply调用此函数以将名为"1"的工作表中的几个表写入"10"

函数fun假定工作表已经存在,但不假定它们为空。首先查看每张纸有多少张表,如果有(length(g) > 0,则将它们全部删除。只有这样,它才会写入表x,并用tryCatch包裹对writeDataTable的调用,以捕获可能的错误。
如果有错误,请返回,如果没有,则返回字符串"Ok"

fun <- function(s, x){
  g <- getTables(wb, sheet = s)
  if(length(g) > 0){
    sapply(g, function(.g) removeTable(wb, s, .g))
  }
  err <- tryCatch(writeDataTable(wb, s, x),
                  error = function(e) e)
  if(inherits(err, "error")) err else "Ok"
}

mapply(fun, names(df), df)
#   1    2    3    4    5    6    7    8    9   10 
#"Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok" "Ok"

saveWorkbook(wb, "template.xlsx", overwrite = TRUE)