Перезаписать файл Excel с помощью VBS python

#python #excel #vbscript

#python #excel #vbscript

Вопрос:

У меня есть функция, которая должна создать VBScript и сохранить (перезаписать) файл Excel, указанный в этом скрипте, с паролем при изменении.

Функция:

     def setPassword(self, excel_file_path, password):
    """Locks excel file with password. Modification allowed only when password is entered"""

    excel_file_path = Path(excel_file_path)

    vbs_script = 
    f"""' Save with password required upon opening

    Set excel_object = CreateObject("Excel.Application")
    Set workbook = excel_object.Workbooks.Open(FileName:="{excel_file_path}", ReadOnly:=False, Notify:=False)

    excel_object.DisplayAlerts = False
    excel_object.Visible = False

    workbook.SaveAs "{excel_file_path}",,, "{password}"

    excel_object.Application.Quit
    """

    # write
    vbs_script_path = excel_file_path.parent.joinpath("set_password.vbs")
    with open(vbs_script_path, "w") as file:
        file.write(vbs_script)

    # execute
    result = subprocess.Popen(['cscript.exe', str(vbs_script_path)], creationflags=subprocess.CREATE_NO_WINDOW, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

 
    output, err = result.communicate()
    res = {
        "result": output.decode(encoding='cp866'),
        "err": self._errMessage(err.decode(encoding='cp866'))
    }

    # remove
    vbs_script_path.unlink()

    return res
  

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

Если я использую другое имя для сохранения файла с паролем, он работает просто отлично. Конечно, я мог бы сохранить файл с другим именем, удалить исходный файл, а затем переименовать новый файл. Но это утиная лента, и мне нужно хорошее решение.

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

PPS Вставка этого XlSaveConflictResolution аргумента в функцию сохранения также не помогла

Что не так с этим VBS и как заставить его работать правильно?

Комментарии:

1. Поскольку вам, похоже, не нравится ducttape, почему вы не можете получить доступ к API Excel из Python? Создание файла .vbs для выполнения части вашей логики кажется мне очень подходящим решением.

2. Мне не удалось найти правильный способ защитить файл от Excel api. Есть способы защитить листы или ячейки, но нет способа защитить весь файл от изменения паролем.

Ответ №1:

Решить проблему, сохранив файл под новым именем, затем удалив исходный файл и переименовав новый файл с начальным именем. Например, у меня есть файл с именем foo.xlsx . Я запускаю скрипт и сохраняю обработанный файл как foe.xlsx . Затем я удаляю foo.xlsx с ОС .. os.unlink() Наконец, я переименовываю foe.xlsx вернуться к foo.xlsx с os.rename()

Надеюсь, однажды это кому-нибудь поможет