2014-12-18 4 views
2

Мы получаем файл Excel от клиента с открытой защитой и защитой Write Reserve. Я хочу удалить защиту, чтобы я мог открыть файл Excel с помощью модуля python xlrd. Я установил пакет pywin32 для доступа к файлу Excel через COM, и я могу открыть его с моей программой, поставляющей два пароля, сохранить и закрыть файл без ошибок. Я использую команды Unprotect, как описано в сети 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() 

Может ли кто-нибудь предоставить мне правильный синтаксис для команд unprotect, которые будут работать?

+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.) Я использовал «None» для параметра «format» после имени файла, и я использовал новое имя файла, чтобы Excel не запрашивал, чтобы спросить, нормально ли перезаписывать существующий файл. Я также обнаружил, что мне не нужны wb.Unprotect и wb.UnprotectSharing вызовы с использованием этого подхода.

+0

Если вы используете 'xcl.DisplayAlerts = False' перед сохранением, то он должен позволить вам перезаписать оригинал без подсказки. –

+0

Спасибо, @ Тим. Это сработало отлично! – 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() 
Смежные вопросы