Unprotect an Excel file programmatically

后端 未结 4 834
我在风中等你
我在风中等你 2020-12-09 14:19

We\'re getting an Excel file from a client that has open protection and Write Reserve protection turned on. I want to remove the protection so I can open the Excel file wit

相关标签:
4条回答
  • 2020-12-09 14:49

    The suggestion from @Tim Williams worked. (Use SaveAs and pass empty strings for the Password and WriteResPassword parameters.) I used 'None' for the 'format' parameter after filename, and I used a new filename to keep Excel from prompting me asking if OK to overwrite the existing file. I also found that I did not need the wb.Unprotect and wb.UnprotectSharing calls using this approach.

    0 讨论(0)
  • 2020-12-09 15:03

    This function works for me

    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()
    
    0 讨论(0)
  • 2020-12-09 15:15

    This post helped me a lot. I thought I would post what I used for my solution in case it may help someone else. Just Unprotect, DisaplyAlerts=False, and Save. Made it easy for me and the file is overwritten with a usable unprotected file.

    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 讨论(0)
  • 2020-12-09 15:16

    if you are on MacOS (or maybe Linux? not tested)

    You have to install Microsoft Excel and xlwings

    pip install xlwings

    Then run this:

    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
    

    Resources:

    • Adapted from this script: https://davidhamann.de/2018/02/21/read-password-protected-excel-files-into-pandas-dataframe/

    • xlwings documentation: https://docs.xlwings.org/en/stable/api.html

    0 讨论(0)
提交回复
热议问题