【问题标题】:Unprotect an Excel file programmatically以编程方式取消保护 Excel 文件
【发布时间】:2015-02-17 20:10:38
【问题描述】:

我们从一个启用了打开保护和写入保留保护的客户端获取了一个 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()

谁能给我正确的解除保护命令的语法?

【问题讨论】:

  • 弄清楚如何编辑问题和添加标签;仍然需要主要问题的帮助。
  • 我认为你可以使用SaveAs并将空字符串传递给PasswordWriteResPassword参数msdn.microsoft.com/en-us/library/office/…

标签: python excel com pywin32


【解决方案1】:

这个功能对我有用

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 可以解析它。优秀
  • 超级有用。谢谢!
  • 完美!谢谢。
【解决方案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)

【讨论】:

    【解决方案3】:

    如果您使用的是 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
    

    资源:

    【讨论】:

    • 这对我不起作用,你用这段代码成功了吗?
    【解决方案4】:

    您可以在不知道密码的情况下使用 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()
    

    其中参数“文件名”是你的excel文件的路径,在这里我使用了本地目录路径。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 如果您在保存之前使用xcl.DisplayAlerts = False,那么它应该可以让您在没有提示的情况下覆盖原件。
      猜你喜欢
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2011-05-16
      • 2016-11-11
      相关资源
      最近更新 更多