通过 VBS + python 覆盖 excel 文件

Overwrite excel file via VBS + python

我有一个函数应该创建一个 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

问题是在我的 PC 上它正确执行。但是,如果我 运行 它在我的工作 PC 上,VBS 会抛出一个异常,它在尝试保存文件时无法访问该文件。

如果我使用不同的名称来保存带密码的文件,它就可以正常工作。 当然,我可以用不同的名称保存文件,删除初始文件,然后重命名新文件。但这是一个鸭带,我想要一个好的解决方案。

PS 我看到资料是不可能这样覆盖文件的。但是既然它可以在一台电脑上运行,我想应该有办法让它在另一台电脑上运行。

PPS 将此 XlSaveConflictResolution 参数插入保存函数也没有帮助

这个VBS有什么问题,如何让它正常工作?

通过以新名称保存文件,然后删除初始文件并使用初始名称重命名新文件来解决此问题。 例如,我有一个名为 foo.xlsx 的文件。我运行脚本并将处理后的文件保存为foe.xlsx。然后我用 os.os.unlink() 删除 foo.xlsx。最后,我将 foe.xlsx 重命名为 foo.xlsx 和 os.rename()

希望有一天这对某人有所帮助