如何加密同一文件夹中的所有 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