如何加密同一文件夹中的所有 Excel 个工作簿?
How to encrypt all Excel Workbook in the same folder?
我根据他们的过滤器(国家/地区)将数据框导出到 xlsx 到基于以下脚本的同一文件夹中
df = data.frame(Country = c("Japan", "Japan", "Thailand", "Germany", "Thailand", "Japan"),
Count = c(15, 5, 25, 5, 60, 50))
#Separate the dataframe according to their respective country
splitdf = split(df, df$Country)
#apply style and export
save_data <- function(df, name) {
wb <- createWorkbook()
addWorksheet(wb, name)
writeDataTable(wb, name, df, tableStyle = "TableStyleMedium2")
saveWorkbook(wb, paste0(name, ".xlsx"), overwrite = TRUE)
}
mapply(
save_data,
splitdf,
names(splitdf)
)
我知道我可以使用 write.xlsx 函数单独加密它们,但我不确定如何对多个文件进行加密。
write.xlsx(x, file, sheetName="Sheet1", col.names=TRUE, row.names=TRUE,
append=FALSE, showNA=TRUE, **password=NULL**)
处理 split
结果的典型过程是对结果使用 lapply
。这基本上是 Hadley 的 plyr 包的灵感来源,然后他将其转化为 dply 包及其 tidyverse 表兄弟。
lapply( split(df, df$Country) , function(x){ save_data(x, x$Country) }
但您似乎已经知道如何使用 mapply
来做到这一点,并且只希望使用 write.xlsx
。在我的库中有两个包具有同名的函数,但只有 xlsx::write.xlsx
有一个密码参数,所以我猜这是要演示的那个:
if ( !require(xlsx) ){install.packages("xlsx", dependencies=TRUE); require(xlsx) }
lapply( split(df, df$Country), function(x) {
xlsx::write.xlsx(x, file=paste0(x$Country,".xlsx"), col.names=TRUE,
row.names=TRUE, append=FALSE, showNA=TRUE, password="test")}) # FAIL
我得到的错误是没有 java 函数的某个名字我无法理解,但是使用 write.xlsx
帮助页面中的第一个示例进行测试显示没有错误,并且我又看了一遍,意识到我忘记只取国家列中的第一项,所以这成功了:
lapply( split(df, df$Country), function(x) {xlsx::write.xlsx(x,
file=paste0(x$Country[1],".xlsx"), # make length 1
col.names=TRUE, row.names=TRUE, append=FALSE,
showNA=TRUE, password="test")})
您在控制台结果中看到一个命名的 Null 列表并不表示失败。 write.xlsx
函数通过其副作用起作用。 (密码功能已在 Linux 盒子上使用 LibreCalc 进行了测试。)可以使用 paste0
调用来生成特定于文件的密码。
您可以通过在前两个参数 'split_df' 和 'names(split_df)'
之后提供一个 MoreArgs
参数来使用您的 mapply
方法
........, MoreArgs=list( col.names=TRUE,
row.names=TRUE, append=FALSE, showNA=TRUE,
password="test") ) #extra paren to close the `mapply` call
我根据他们的过滤器(国家/地区)将数据框导出到 xlsx 到基于以下脚本的同一文件夹中
df = data.frame(Country = c("Japan", "Japan", "Thailand", "Germany", "Thailand", "Japan"),
Count = c(15, 5, 25, 5, 60, 50))
#Separate the dataframe according to their respective country
splitdf = split(df, df$Country)
#apply style and export
save_data <- function(df, name) {
wb <- createWorkbook()
addWorksheet(wb, name)
writeDataTable(wb, name, df, tableStyle = "TableStyleMedium2")
saveWorkbook(wb, paste0(name, ".xlsx"), overwrite = TRUE)
}
mapply(
save_data,
splitdf,
names(splitdf)
)
我知道我可以使用 write.xlsx 函数单独加密它们,但我不确定如何对多个文件进行加密。
write.xlsx(x, file, sheetName="Sheet1", col.names=TRUE, row.names=TRUE,
append=FALSE, showNA=TRUE, **password=NULL**)
处理 split
结果的典型过程是对结果使用 lapply
。这基本上是 Hadley 的 plyr 包的灵感来源,然后他将其转化为 dply 包及其 tidyverse 表兄弟。
lapply( split(df, df$Country) , function(x){ save_data(x, x$Country) }
但您似乎已经知道如何使用 mapply
来做到这一点,并且只希望使用 write.xlsx
。在我的库中有两个包具有同名的函数,但只有 xlsx::write.xlsx
有一个密码参数,所以我猜这是要演示的那个:
if ( !require(xlsx) ){install.packages("xlsx", dependencies=TRUE); require(xlsx) }
lapply( split(df, df$Country), function(x) {
xlsx::write.xlsx(x, file=paste0(x$Country,".xlsx"), col.names=TRUE,
row.names=TRUE, append=FALSE, showNA=TRUE, password="test")}) # FAIL
我得到的错误是没有 java 函数的某个名字我无法理解,但是使用 write.xlsx
帮助页面中的第一个示例进行测试显示没有错误,并且我又看了一遍,意识到我忘记只取国家列中的第一项,所以这成功了:
lapply( split(df, df$Country), function(x) {xlsx::write.xlsx(x,
file=paste0(x$Country[1],".xlsx"), # make length 1
col.names=TRUE, row.names=TRUE, append=FALSE,
showNA=TRUE, password="test")})
您在控制台结果中看到一个命名的 Null 列表并不表示失败。 write.xlsx
函数通过其副作用起作用。 (密码功能已在 Linux 盒子上使用 LibreCalc 进行了测试。)可以使用 paste0
调用来生成特定于文件的密码。
您可以通过在前两个参数 'split_df' 和 'names(split_df)'
之后提供一个MoreArgs
参数来使用您的 mapply
方法
........, MoreArgs=list( col.names=TRUE,
row.names=TRUE, append=FALSE, showNA=TRUE,
password="test") ) #extra paren to close the `mapply` call