2014-12-18 127 views
2

我们从打开保护功能并启用了写入预留保护的客户端获取Excel文件。我想删除保护,所以我可以用python xlrd模块打开Excel文件。我已经安装了pywin32包以通过COM访问Excel文件,并且可以使用提供两个密码的程序打开它,保存并关闭文件,而不会出错。我正在使用MSDN网络中描述的解除保护命令,但它们并没有失败,但它们也没有取消保护。我的程序完成后,保存的文件仍然需要两个密码才能打开它。这是我到目前为止:通过编程解除Excel文件的保护

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() 

任何人都可以提供正确的语法解除保护命令,将工作吗?

+0

想出如何修改的问题,添加标签;还有主要问题需要帮助。 – JimR 2014-12-18 22:33:43

+0

我想你可以使用'SaveAs'并将空字符串传递给'Password'和'WriteResPassword'参数http://msdn.microsoft.com/en-us/library/office/ff841185(v=office.15)。 aspx – 2014-12-19 00:55:02

回答

1

@Tim Williams的建议工作。 (使用SaveAs并为Password和WriteResPassword参数传递空字符串。)我使用'None'作为文件名后的'format'参数,并且我使用了一个新文件名来防止Excel提示我询问是否可以覆盖现有文件。我还发现,我不需要使用这种方法的wb.Unprotect和wb.UnprotectSharing调用。

+0

如果在保存之前使用'xcl.DisplayAlerts = False',那么它应该允许您在没有提示的情况下覆盖原始文件。 – 2014-12-19 23:55:39

+0

谢谢@蒂姆。这工作完美! – JimR 2014-12-22 20:24:00

2

这篇文章帮了我很多。我想我会发布我用于解决方案的情况,以防其他人帮忙。只需取消保护,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) 
0

此功能为我的作品

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()