Password Protecting Excel file using Python

前端 未结 3 459
[愿得一人]
[愿得一人] 2020-12-03 16:34

I havent found much of the topic of creating a password protected Excel file using Python.

In Openpyxl, I did find a SheetProtection module using:

相关标签:
3条回答
  • 2020-12-03 17:08

    Looking at the docs for openpyxl, I noticed there is indeed a openpyxl.worksheet.SheetProtection class. However, it seems to be already part of a worksheet object:

    >>> wb = Workbook()
    >>> ws = wb.worksheets[0]
    >>> ws.protection
    <openpyxl.worksheet.protection.SheetProtection object at 0xM3M0RY>
    

    Checking dir(ws.protection) shows there is a method set_password that when called with a string argument does indeed seem to set a protected flag.

    >>> ws.protection.set_password('test')
    >>> wb.save('random.xlsx')
    

    I opened random.xlsx in LibreOffice and the sheet was indeed protected. However, I only needed to toggle an option to turn off protection, and not enter any password, so I might be doing it wrong still...

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

    openpyxl is unlikely ever to provide workbook encryption. However, you can add this yourself because Excel files (xlsx format version >= 2010) are zip-archives: create a file in openpyxl and add a password to it using standard utilities.

    0 讨论(0)
  • 2020-12-03 17:13

    Here's a workaround I use. It generates a VBS script and calls it from within your python script.

    def set_password(excel_file_path, pw):
    
        from pathlib import Path
    
        excel_file_path = Path(excel_file_path)
    
        vbs_script = \
        f"""' Save with password required upon opening
    
        Set excel_object = CreateObject("Excel.Application")
        Set workbook = excel_object.Workbooks.Open("{excel_file_path}")
    
        excel_object.DisplayAlerts = False
        excel_object.Visible = False
    
        workbook.SaveAs "{excel_file_path}",, "{pw}"
    
        excel_object.Application.Quit
        """
    
        # write
        vbs_script_path = excel_file_path.parent.joinpath("set_pw.vbs")
        with open(vbs_script_path, "w") as file:
            file.write(vbs_script)
    
        #execute
        subprocess.call(['cscript.exe', str(vbs_script_path)])
    
        # remove
        vbs_script_path.unlink()
    
        return None
    
    0 讨论(0)
提交回复
热议问题