将多个小标题导出到 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 文件
使用 boto3 和 python 将 AWS EC2 详细信息导出到 xlsx/csv
TransferText 导出到 CSV 不工作,但 TransferSpreadsheet 到 XLSX 工作