Снять защиту с файла Excel программно

Мы получаем файл Excel от клиента с открытой защитой и включенной защитой от записи. Я хочу снять защиту, чтобы открыть файл Excel с помощью модуля python xlrd. Я установил пакет pywin32 для доступа к файлу Excel через COM, и я могу открыть его с помощью моей программы, указав два пароля, сохранить и закрыть файл без ошибок. Я использую команды Unprotect, как описано в сети MSDN, и они не дают сбоев, но они также не снимают защиту. Сохраненный файл по-прежнему требует два пароля, чтобы открыть его после завершения моей программы. Вот что у меня есть до сих пор:

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

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


person JimR    schedule 18.12.2014    source источник
comment
Разобрался, как редактировать вопрос и добавлять теги; все еще нужна помощь с основным вопросом.   -  person JimR    schedule 19.12.2014
comment
Я думаю, вы можете использовать SaveAs и передавать пустые строки в параметры Password и WriteResPassword msdn.microsoft.com/en-us/library/office/   -  person Tim Williams    schedule 19.12.2014


Ответы (4)


Эта функция работает для меня

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()
person Enoch Sit    schedule 26.05.2017
comment
Это единственное, что работает для меня, и я практически перепробовал все другие предложенные решения. Снимает защиту с файла, после чего панды могут его проанализировать. Отлично - person bloo; 26.11.2019
comment
Супер полезно. Спасибо! - person Vishnu Kunchur; 05.03.2020
comment
Идеально! Спасибо. - person ALS777; 20.11.2020

Этот пост мне очень помог. Я думал, что опубликую то, что я использовал для своего решения, на случай, если это может помочь кому-то другому. Просто снимите защиту, 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)
person Colin    schedule 09.02.2015

если вы используете MacOS (или, может быть, Linux? не тестировалось)

Вы должны установить Microsoft Excel и xlwings

pip install xlwings

Затем запустите это:

import pandas as pd
import xlwings as xw

def _process(filename):
  wb = xw.Book(filename)
  sheet = wb.sheets[0]
  df = sheet.used_range.options(pd.DataFrame, index=False, header=True).value
  wb.close()
  return df

Ресурсы:

person Daniel Hasegan    schedule 17.04.2020
comment
у меня не работает, у вас получилось с этим кодом? - person Alex Lévy; 19.04.2020

Предложение @Tim Williams сработало. (Используйте SaveAs и передайте пустые строки для параметров Password и WriteResPassword.) Я использовал «None» для параметра «format» после имени файла, и я использовал новое имя файла, чтобы Excel не запрашивал меня, если OK перезаписать существующий файл. Я также обнаружил, что при таком подходе мне не нужны вызовы wb.Unprotect и wb.UnprotectSharing.

person JimR    schedule 19.12.2014
comment
Если вы используете xcl.DisplayAlerts = False перед сохранением, это должно позволить вам перезаписать оригинал без запроса. - person Tim Williams; 20.12.2014