【问题标题】:openxlsx::write.xlsx overwriting existing worksheet instead appendopenxlsx::write.xlsx 覆盖现有工作表而不是追加
【发布时间】:2019-07-30 18:58:29
【问题描述】:

openxlsx::write.xlsx 函数正在覆盖电子表格,而不是添加另一个选项卡。

我尝试遵循 Stackoverflow 的一些方向,但没有成功。

dt.escrita <- format(Sys.time(), '%Y%m%d%H%M%S')

write.xlsx( tbl.messages
           ,file = paste('.\\2_Datasets\\messages_',dt.escrita,'.xlsx')
           ,sheetName = format(Sys.time(), '%d-%m-%y')
           ,append = FALSE)

write.xlsx( tbl.dic.dados
            ,file = paste('.\\2_Datasets\\messages_',dt.escrita,'.xlsx')
            ,sheetName = 'Dicionario_Dados'
            ,append = TRUE)

一个包含两个标签的电子表格:30-07-19 和 Dicionario_Dados。

【问题讨论】:

标签: r data-munging openxlsx


【解决方案1】:

不确定我的理解是否正确,您想创建一个带有两个选项卡/工作表的 xlsx 文件吗? 然后我通常首先创建工作表,然后分别写入每个工作表(这与通过附加将数据添加到同一个工作表不同)。

library("openxlsx")
mtcars1 <- mtcars %>% filter(cyl == 4)
mtcars2 <- mtcars %>% filter(cyl == 6)

wb <- createWorkbook()
addWorksheet(wb, "mtcars1")
addWorksheet(wb, "mtcars2")

writeData(wb, "mtcars1", mtcars1, startRow = 1, startCol = 1)
writeData(wb, "mtcars2", mtcars2, startRow = 1, startCol = 1)

saveWorkbook(wb, file = "excel_test.xlsx", overwrite = TRUE)

更新: 只是想知道为什么我从未在openxlsx 中使用过append 参数(这是我用于读取/写入excel 的标准包)。 write.xlsx()writeData()writeDataTable() 这三个函数似乎都没有这样的论点。至少它不在文档中。

函数在使用未知参数调用时似乎不会引发错误,例如下面的调用有一个不存在的somearg,但没有返回错误。

write.xlsx(mtcars2,
           file = "excel_test.xlsx",
           sheetName = "mtcars1",
           somearg = TRUE)

更新 2 要将数据附加到现有表中,您可以读取现有工作表的行数,添加 +1 并将此值用作 startRow:

wb2 <- loadWorkbook(file = "excel_test.xlsx")

writeData(wb2,
          "mtcars1",
          mtcars2,
          colNames = FALSE,
          startRow = nrow(readWorkbook("excel_test.xlsx"))+1)
#Fixed the call to nrow, instead of ncol.

saveWorkbook(wb2, file = "excel_test.xlsx", overwrite = TRUE)

【讨论】:

  • saveWorkbook 之后,列名从文件中消失了。我的意思是第一行变成空的,因为原始文件有列名。
【解决方案2】:

将不同的数据框写入不同的工作表。

library(xlsx)
write.xlsx(dataframe1, file="filename.xlsx", sheetName="sheet1")
write.xlsx(dataframe2, file="filename.xlsx", sheetName="sheet2", append=TRUE)

【讨论】:

  • 这适用于 xlsx,但不适用于上面解释的 openxlsx。 Openxlsx 的优点是不需要安装 Java。
【解决方案3】:

您可以简单地使用数据框的命名列表:

library(openxlsx)

df_lst <- setNames(list(tbl.messages, tbl.dic.dados), as.list(c(format(Sys.time(), '%d-%m-%y'), 'Dicionario_Dados')))

write.xlsx( df_lst, file = paste0('.\\2_Datasets\\messages_',dt.escrita,'.xlsx') )

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2016-06-19
    • 2012-07-13
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多