【问题标题】:How do you save Excel file and enable cell protection in R?如何在 R 中保存 Excel 文件并启用单元格保护?
【发布时间】:2016-12-29 11:13:15
【问题描述】:

我有一个使用 XLSX 包创建的基本 Excel 工作簿。我想将其保存为 .xlsx 文件,但锁定除一个之外的所有列以保护它们不被编辑。我可以使用CellProtection() 函数为选定列设置单元格保护,但我不知道如何为工作表打开密码保护以真正保护列。

library(xlsx)
wb = createWorkbook()
s1 = createSheet(wb, "Sheet 1")
addDataFrame(mtcars, s1) #using mtcars as example dataset
cs = CellStyle(wb, cellProtection = CellProtection(locked=F)) #setting style to unlock cells
rows <- getRows(s1, rowIndex=2:101)
cells <- getCells(rows, colIndex = c(2)) #getting the cells to unlock
lapply(names(cells), function(ii)setCellStyle(cells[[ii]],cs)) #applying unlocking to all columns except the second one (the one i want to leave locked)

saveWorkbook(wb, "file.xlsx")

当我检查 Excel 文件时,第 2 列中单元格的属性显示它们已解锁,但随后我必须单击“保护表”并手动输入密码才能真正锁定所有单元格。

有没有办法在 R 中执行此操作并启用工作表保护?

【问题讨论】:

  • 我认为这没有实现(该包的帮助页面中没有提到“密码”)和 XLConnect::loadworkbook 的帮助页面(这是如何创建 R 对象的实例"workbook"-class) 说:“password 打开受密码保护的文件时使用的密码。默认 NULL 表示不使用密码。使用 create = TRUE 创建新文件时,此参数将被忽略。”
  • 感谢 Hack-R 和 42-;是的,使用 XLConnect,您可以在保存时对整个工作簿进行密码保护,但这对我不起作用。我只是想保护一些单元格不被用户编辑。例如,我知道这在 SAS 中是可能的,所以我认为这在 R 中是小菜一碟——不过我错了。
  • @rocket1906 这很有趣,你是怎么做到的?我看到他们的文档说它可以读取受密码保护的文件,但没有提到用密码保存文件。很高兴知道以供将来参考。
  • @Hack-R 抱歉,我在考虑包 RDCOMClient。方法如下: eApp
  • 尚未测试我对手册的阅读,但我认为它说您只能在使用密码打开文件后保存受密码保护的文件。您似乎无法创建受密码保护的文件 de_novo

标签: r excel


【解决方案1】:

我一直在使用@AEF 的答案。但是今天我发现这实际上可以在 xlsx 包中完成:

s1$protectSheet("mypassword").

当然,在你打电话给saveworkbook之前

【讨论】:

    【解决方案2】:

    您可以直接使用 apache POI(由 xlsx 使用)来执行此操作。只需拨打电话

    .jcall(s1, "V", "protectSheet", "mypassword")
    

    在您致电saveWorkbook之前。

    【讨论】:

    • 哇,非常感谢。这正是我一直在寻找的。感谢您向我展示 .jcall 函数 - 似乎非常有用。
    【解决方案3】:

    如果工作表不作为对象存储,您可以在“.jcall”函数中使用 getSheet() 方法调用工作表:

    rJava::.jcall(wb$getSheet("Sheet1"),"V","protectSheet", "MyPassword123") xlsx::saveWorkbook(wb,"C:/myfilepath)

    另外,为了清楚起见,“.jcall”函数来自“rJava”包。此软件包必须已安装并正常运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多