2014-12-18 125 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()