Как разблокировать защищенный паролем файл Excel с помощью R и VBA

У меня есть несколько файлов, защищенных паролем, которые я ежедневно получаю от своих коллег, и я хотел бы разблокировать их программно, чтобы я мог читать их и создавать свои отчеты.

В Python мне удалось разблокировать файлы с пакетом по умолчанию win32com.client. Как насчет Р?

Вот как я сделал это в Python,

def unprotect_xlsx(filename, pwd):
    try:
        xcl = win32com.client.Dispatch('Excel.Application')
        wb = xcl.Workbooks.Open(filename, False, False, None, pwd)
        wb.Unprotect(pwd)
        wb.UnprotectSharing(pwd)

        xcl.DisplayAlerts = False
        wb.SaveAs(filename.split('.xlsx')[0]+"_unlocked"+".xlsx", None, '', '')
        xcl.Quit()
    except Exception as e:
        print("Error:")
        print(e)

person Guanhua Lee    schedule 04.06.2020    source источник
comment
Отвечает ли это на ваш вопрос? Как вы читаете защищенный паролем файл excel в р?   -  person Aurèle    schedule 04.06.2020


Ответы (1)


Однако, если вы используете 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