Подпрограмма saveas не работает для xlsm, только с xlsx - PullRequest
0 голосов
/ 24 апреля 2020

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

Пока скрипт работает нормально. xlsx он падает для xlsm, где я продолжаю получать:

com_error: (-2147352567, «Исключение произошло.», (0, «Microsoft Excel», «Невозможно получить доступ к« MYFILENAME.xlsm ».» , 'xlmain11.chm', 0, -2146827284), Нет)

После долгих исследований причин возникновения ошибок я понял, что в VBA это произошло из-за взаимодействия между xcl.DisplayAlerts = False и метод .Saveas.

Похоже, что у Microsoft другое значение по умолчанию для книг Xlsx и xlsm (с поддержкой VBA).

Я попытался обойти это, добавив параметр ConflictResolution = 2, в результате чего я принудительно принимаю любое приглашение, но, похоже, это помогло мне сохранить файл без пароля в первой подпрограмме, но во второй подпрограмме. для l oop не получится. Точно такой же код будет работать, если я использую имя файла IE версию xlsx. см. ниже . если я запускаю только xlsx, он работает, только xlsm только второй сбой.

XLSX runs both for loops successfully, xlsm only the first

Do c ссылка:

saveas do c

displayalerts do c

См. Отдельный код ниже (оригинальные имена файлов изменены)

import win32com.client


filename3 = r"f1.xlsm"
filename2 = r"f2.xlsm"
filename = r"f3.xlsx"

for i in [filename2, filename3]:

   pw_str = 'PIM FINAL'
   xcl = win32com.client.Dispatch("Excel.Application")
   wb = xcl.Workbooks.Open(i, False, False, None, pw_str)
   xcl.DisplayAlerts = False
   wb.SaveAs(i, None, '', '',   ConflictResolution = 2)
   xcl.Quit()

print("done")

for i in [filename2, filename3]:

     pw_str = 'PIM FINAL'
     xcl = win32com.client.Dispatch("Excel.Application")
     wb = xcl.Workbooks.Open(i, False, False, None, None)
     xcl.DisplayAlerts = False
     wb.SaveAs(i, None, pw_str, '', ConflictResolution = 2)

xcl.Quit()
print(i ," done")
...