Jim*_*imR 6 python com excel pywin32
我们正在从一个客户端获取一个 Excel 文件,该文件打开了开放保护和写保留保护。我想删除保护,以便我可以使用 python xlrd 模块打开 Excel 文件。我已经安装了 pywin32 包来通过 COM 访问 Excel 文件,我可以用我的程序打开它,提供两个密码,保存并关闭文件,没有错误。我正在使用 MSDN 网络中描述的 Unprotect 命令,它们没有失败,但它们也没有取消保护。在我的程序完成后,保存的文件仍然需要两个密码才能打开它。这是我到目前为止所拥有的:
import os, sys
impdir = "\\\\xxx.x.xx.x\\allshare\\IT\\NewBusiness\\Python_Dev\\import\\"
sys.path.append(impdir)
from UsefulFunctions import *
import win32com.client
wkgdir = pjoin(nbShare, 'NorthLake\\_testing')
filename = getFilename(wkgdir, '*Collections*.xls*')
xcl = win32com.client.Dispatch('Excel.Application')
xcl.visible = True
pw_str = raw_input("Enter password: ")
try:
wb = xcl.workbooks.open(filename, 0, False, None, pw_str, pw_str)
except Exception as e:
print "Error:", str(e)
sys.exit()
wb.Unprotect(pw_str)
wb.UnprotectSharing(pw_str)
wb.Save()
xcl.Quit()
Run Code Online (Sandbox Code Playgroud)
任何人都可以为我提供有效的取消保护命令的正确语法吗?
小智 13
这个功能对我有用
def Remove_password_xlsx(filename, pw_str):
xcl = win32com.client.Dispatch("Excel.Application")
wb = xcl.Workbooks.Open(filename, False, False, None, pw_str)
xcl.DisplayAlerts = False
wb.SaveAs(filename, None, '', '')
xcl.Quit()
Run Code Online (Sandbox Code Playgroud)
小智 8
这篇文章对我帮助很大。我想我会发布我用于解决方案的内容,以防它对其他人有帮助。只需取消保护、DisaplyAlerts=False 并保存即可。对我来说很容易,文件被可用的未受保护的文件覆盖。
import os, sys
import win32com.client
def unprotect_xlsx(filename):
xcl = win32com.client.Dispatch('Excel.Application')
pw_str = '12345'
wb = xcl.workbooks.open(filename)
wb.Unprotect(pw_str)
wb.UnprotectSharing(pw_str)
xcl.DisplayAlerts = False
wb.Save()
xcl.Quit()
if __name__ == '__main__':
filename = 'test.xlsx'
unprotect_xlsx(filename)
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用 python openpyxl 模块取消对 excel 文件表的保护,而无需知道密码:
from openpyxl import load_workbook
sample = load_workbook(filename="sample.xlsx")
for sheet in sample: sheet.protection.disable()
sample.save(filename="sample.xlsx")
sample.close()
Run Code Online (Sandbox Code Playgroud)
其中参数“文件名”是 Excel 文件的路径,在这里我使用了本地目录路径。
@Tim Williams 的建议奏效了。(使用 SaveAs 并为 Password 和 WriteResPassword 参数传递空字符串。)我在文件名后使用“None”作为“format”参数,并使用新文件名来防止 Excel 提示我询问是否可以覆盖现有文件。我还发现我不需要使用这种方法进行 wb.Unprotect 和 wb.UnprotectSharing 调用。