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

时间:2014-12-18 22:22:12

标签: python excel com pywin32

我们从已打开保护和写保留保护的客户端获取Excel文件。我想删除保护,以便我可以使用python xlrd模块打开Excel文件。我已经安装了pywin32软件包以通过COM访问Excel文件,我可以使用我的程序打开它,提供两个密码,保存并关闭文件,没有错误。我正在使用MSDN网络中描述的Unprotect命令,并且它们没有失败,但它们也没有删除保护。保存的文件在程序完成后仍然需要两个密码才能打开它。这就是我到目前为止所拥有的:

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命令语法吗?

4 个答案:

答案 0 :(得分:3)

这篇文章给了我很多帮助。我想我会发布我用于解决方案的内容,以防它可以帮助别人。 Just Unprotect,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)

答案 1 :(得分:2)

此功能适合我

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

答案 2 :(得分: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

资源:

答案 3 :(得分:1)

@Tim Williams的建议奏效了。 (使用SaveAs并为Password和WriteResPassword参数传递空字符串。)我使用了'无'对于'格式'文件名后的参数,我使用了一个新的文件名,以防止Excel提示我询问是否可以覆盖现有文件。我还发现使用这种方法我不需要wb.Unprotect和wb.UnprotectSharing调用。