将多个小标题导出到 XLSX -- 使用 deparse(substitute()) 时的 sheetName 问题

Posted

技术标签:

【中文标题】将多个小标题导出到 XLSX -- 使用 deparse(substitute()) 时的 sheetName 问题【英文标题】:Exporting multiple tibbles to XLSX -- sheetName problem when using deparse(substitute()) 【发布时间】:2019-12-10 11:14:47 【问题描述】:

我有 15 个小标题要导出到单个 XLSX 工作簿,每个集合的 sheetName 与小标题对象的名称相同。要导出单个 tibble,这可以正常工作:

library(xlsx)

    my_tibble1 %>% 
      write.xlsx("output_filename.xlsx", 
                 sheetName = "my_tibble1", 
                 append = TRUE)

但是,这些 tibbles 的数量已经足够多,因此将所有这些 tibbles 都写出来是很费时间的。所以,我写了一个函数:

output_expediter <- function(df, output_filename) 
      write.xlsx(df, 
                 output_filename, 
                 sheetName = deparse(substitute(df)), 
                 append = TRUE)

此函数成功将 tibble 写入输出工作簿中的新工作表,但 sheetName 始终是单个句点(“.”)。

所有用于小写字母的变量名都限制为小写字符和下划线,并且它们的长度都是 31 个或更少的字符,所以我认为它们中的任何一个都不会违反 XLSX 格式约定。在 R 控制台中,运行:

deparse(substitute(my_tibble1))

按预期产生“my_tibble1”。

关于为什么会发生这种情况的任何想法?除了输入每张工作表的名称之外,还有什么可能的解决方法?

【问题讨论】:

你是在 lapply 循环上应用这个 @akrun 我想这样做,如果我可以根据需要使用 sheetName 输出函数。就目前而言,将函数应用于多个 tibble 的列表/向量将引发错误“工作簿已包含此名称的工作表”(因为如果 append = TRUE,write.xlsx 将不会覆盖已经存在的工作表)。 你用openxlsx试过了吗 @akrun 还没有,我试试看 【参考方案1】:

一个选项是openxlsx

library(openxlsx)
library(tibble)
output_expediter <- function(df, output_filename) 
     nm1 <- deparse(substitute(df))
     wb <- createWorkbook()
     addWorksheet(wb, sheetName = nm1)
     writeData(wb, sheet= nm1, x = df)
     saveWorkbook(wb =wb, file = output_filename, overwrite = TRUE)
     


file1 <- "hello.xlsx"
df1 <- tibble(col1 = 1:5, col2 = 6:10)
output_expediter(df1, file1)

-输出


如果我们需要写多个文件,

library(purrr)    
wb1 <- createWorkbook()
output_expediter <- function(df, wb, nm1, output_filename) 


     addWorksheet(wb, sheetName = nm1)
     writeData(wb, sheet= nm1, x = df)
     saveWorkbook(wb =wb, file = output_filename, overwrite = TRUE)
     

lst1 <- lst(df1= df1, df2= df1)
iwalk(lst1, ~ output_expediter(.x, wb = wb1, .y, file))

【讨论】:

同样,这会产生一个名为“.”的工作表。在工作簿中。如果我将名称作为字符串传递(而不是使用 deparse(substitute())),它可以正常工作。 谢谢。 iwalk 在 (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : 参数暗示不同的行数: [每个各种小玩意]"。 @KevinTroy。对不起,它对我来说很好用。数据显示。我用packageVersion("purrr")# [1] ‘0.3.2’

以上是关于将多个小标题导出到 XLSX -- 使用 deparse(substitute()) 时的 sheetName 问题的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL Server 表导出到 Microsoft Excel xlsx 文件

将带有结果的多个查询导出到 Excel 到一个工作表中

使用 boto3 和 python 将 AWS EC2 详细信息导出到 xlsx/csv

TransferText 导出到 CSV 不工作,但 TransferSpreadsheet 到 XLSX 工作

使用 Telerik 导出到 Excel (XLSX) 时如何解释集合?

在 weblogic 上使用 apache poi 3.13 导出 xlsx:文件格式或扩展名无效