Однако, если вы используете R, вы должны были использовать эту RDCOMClient
библиотеку, но это просто интерфейс для работы с различными клиентами без встроенной функции, которая может выполнять разблокировку.
Так что у меня был обходной путь. Я использовал RDCOMClient
для взаимодействия с файлом Excel VBA с поддержкой макросов, который выполняет разблокировку.
Я создал Excel с поддержкой макросов (macro_unlocker.xlsm), включил опцию разработчика и написал этот код VBA, который примет имя файла и пароль из R и разблокирует файл как программу Excel,
Public Sub unlock_file(filename, pwd)
Dim wb As Workbook
Dim filename_path As String
filename_path = filename
'MsgBox filename_path & " " & pwd
Set wb = Workbooks.Open(filename:=filename, Password:=pwd)
save_filepath = Split(filename, ".xlsx")(0) & "_unlocked.xlsx"
wb.SaveAs filename:=save_filepath, Password:=""
End Sub
RDCOMClient
взаимодействует с VBA, передавая аргументы сценарию VBA. Он разблокировал файл, установив пароль в виде пустой строки.
Затем в R я могу написать функцию для передачи ей аргументов. И это то, что у меня есть, я поместил это во внешний файл R с именем myUtils.R
, чтобы все было поаккуратнее,
unlock_xlsx <- function(filename, pwd){
if (!require("pacman")) install.packages("pacman")
pacman::p_load(devtools)
devtools::install_github("dkyleward/RDCOMClient")
library(RDCOMClient)
# Open a specific workbook in Excel:
xlApp <- COMCreate("Excel.Application")
xlWbk <- xlApp$Workbooks()
xlWbk$Open(paste(getwd(), "/<utils folder>/macro_unlocker.xlsm",sep=""))
# this line of code might be necessary if you want to see your spreadsheet:
xlApp[['Visible']] <- TRUE
# Run the macro:
xlApp$Run("unlock_file", filename, pwd)
# Close the workbook and quit the app:
xlWbk$Close(FALSE)
xlApp$Quit()
}
Итак, наконец, чтобы запустить функции и макрос VBA в R, чтобы я мог программно разблокировать файлы и выполнять свою работу, я написал это в R,
# call in myUtils.R where the function unlock_xlsx resides
source(paste(getwd(), "./myUtils.R", sep=""))
# file to unlock
password_locked_file_FILEPATH <- Sys.glob(file.path("<sub-folder>", "<sub-folder>","<an_excel.xlsx>"))
# send the file_filepath to the function
file_to_unlock <- paste("../", password_locked_file_FILEPATH, sep="")
password_locked_file_pwd <- "<password>"
# result will be suffixed with '_unlocked' followed by '.xlsx'
unlock_xlsx(filename = file_to_unlock, pwd = password_locked_file_pwd)
Тада! Файл разблокирован и сохранен с суффиксом _unlocked
. И вы определенно можете просмотреть свои файлы, чтобы разблокировать их, и указать соответствующие пароли, и все будет работать как часы.
Это работает до тех пор, пока на вашем компьютере установлены R и Excel.
Примечание: я понимаю, что есть некоторые проблемы с установкой RDCOMClient
, он не совместим с последней версией R 3.6. У меня был обходной путь: я установил dkyleward/RDCOMClient
, и он отлично установился на машине с Windows, но не работал на MacOS.
person
Guanhua Lee
schedule
04.06.2020