通过 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()
希望有一天这对某人有所帮助
我有一个函数应该创建一个 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()
希望有一天这对某人有所帮助