2014-12-18 4 views
2

열린 보호 기능과 쓰기 보호 기능이 설정된 클라이언트에서 Excel 파일을 가져 왔습니다. 파이썬 xlrd 모듈로 Excel 파일을 열 수 있도록 보호 기능을 제거하고 싶습니다. COM을 통해 Excel 파일에 액세스하기 위해 pywin32 패키지를 설치했으며 두 암호를 제공하고 저장하고 오류없이 파일을 닫는 프로그램에서 열 수 있습니다. MSDN 네트워크에서 설명한대로 Unprotect 명령을 사용하고 있으며 실패하지는 않지만 보호 기능을 제거하지도 않습니다. 프로그램을 마친 후에도 저장된 파일에 암호가 두 개 있어야 열 수 있습니다. 다음은 내가 지금까지 가지고있는 것입니다 :프로그래밍 방식으로 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

+0

'SaveAs'를 사용하고 빈 문자열을'Password' 및'WriteResPassword' 매개 변수에 전달할 수 있다고 생각합니다. http://msdn.microsoft.com/en-us/library/office/ff841185(v=office.15). aspx –

답변

1

@Tim Williams의 제안이 효과가있었습니다. (SaveAs를 사용하고 Password 및 WriteResPassword 매개 변수에 빈 문자열을 전달하십시오.) 파일 이름 다음에 'format'매개 변수에 '없음'을 사용하고 기존 파일을 덮어 쓸지 묻는 메시지가 나타나지 않도록 Excel에서 새 파일 이름을 사용했습니다. 또한 wb.Unprotect 및 wb.UnprotectSharing 호출이이 접근 방식을 사용하여 호출 할 필요가 없음을 발견했습니다.

+0

저장하기 전에'xcl.DisplayAlerts = False'를 사용하면 프롬프트없이 원본을 덮어 쓸 수 있습니다. –

+0

고마워요, @ Tim. 그것은 완벽하게 작동했습니다! – JimR

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