以编程方式取消保护Excel文件

8
我们从客户那里得到了一个开启了打开保护和写保留保护的Excel文件。我想去掉这些保护,以便可以使用Python xlrd模块打开Excel文件。我安装了pywin32软件包来通过COM访问Excel文件,并且我可以在程序中提供两个密码打开文件,保存并关闭文件而没有错误。我正在使用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()

有人能提供一下正确的解除保护命令语法吗?

已经弄清楚如何编辑问题并添加标签;仍需要帮助解决主要问题。 - JimR
我认为你可以使用SaveAs并将空字符串传递给PasswordWriteResPassword参数。http://msdn.microsoft.com/en-us/library/office/ff841185(v=office.15).aspx - Tim Williams
7个回答

17

这个函数对我有效

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

这是唯一对我有效的解决方法,而且我几乎尝试了所有其他建议的解决方案。取消文件保护,然后Pandas就可以解析它。非常出色。 - bloo
非常有用。谢谢! - Vishnu Kunchur
完美!谢谢。 - Ali
只能在Windows上运行,因为使用了win32com :( - undefined

7

这篇文章帮助了我很多。我想分享一下我的解决方案,以便于能够帮助到其他人。只需要解除保护,将 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)

5

使用 Python openpyxl 模块,即使不知道密码,也可以解除保护 Excel 文件中的工作表:

from openpyxl import load_workbook
sample = load_workbook(filename="sample.xlsx")
for sheet in sample: sheet.protection.disable()
sample.save(filename="sample.xlsx")
sample.close()

参数 "filename" 是您的 Excel 文件路径,在这里我使用了本地目录路径。


2
对我不起作用。错误:“zipfile.BadZipFile:文件不是zip文件”。 - Marvin Xu
这是用于取消保护工作表,而不是工作簿本身。 - RianLauw

2

如果您使用的是MacOS(或者可能是Linux?没有测试过),

您需要安装 Microsoft Excelxlwings

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

资源:


它对我不起作用,你用这段代码成功了吗? - Alex Lévy
1
这不是问题的解决方案。你的代码中没有处理密码的部分。这只会打开Excel文件,然后要求你输入密码,还不如手动操作。 - West

1
@Tim Williams的建议有效。(使用SaveAs并传递空字符串作为密码和WriteResPassword参数。)在文件名后,我使用“None”作为“format”参数,并使用新文件名来防止Excel提示我是否覆盖现有文件。我还发现,在使用此方法时,我不需要wb.Unprotect和wb.UnprotectSharing调用。

1
如果在保存之前使用 xcl.DisplayAlerts = False,那么它应该允许您覆盖原始文件而不提示。 - Tim Williams

0

嘿,我尝试了@Enoch Sit提供的解决方案

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

但是出现了错误:NameError: name 'pw_str' is not defined

:'(


这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注此问题的人。- 来自审核 - Daraan

0
刚刚在Mac上对我有效的解决方案是https://github.com/nolze/msoffcrypto-tool。它甚至还有一个命令行界面!
python -m pip install msoffcrypto-tool
msoffcrypto-tool encrypted.xlsx decrypted.xlsx -p PaSsWoRd

但是如果你需要做一些更复杂的事情,也有一个Python API可供使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接