Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Password Protecting Excel file using Python

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:

from openpyxl.worksheet import SheetProtection

However, the problem is I'm not sure how to use it. It's not an attribute of Workbook or Worksheet so I can't just do this:

wb = Workbook()
ws = wb.worksheets[0]
ws_encrypted = ws.SheetProtection()
ws_encrypted.password = 'test'
...

Does anyone know if such a request is even possible with Python? Thanks!

like image 941
dyao Avatar asked Mar 21 '16 03:03

dyao


People also ask

How do I password protect a file in Python?

Note: Since password protecting a script tool only protects the Python source code, the script must be embedded first. Right-click the tool and pick Set Password. On the Set Password dialog box, enter a value for New Password and the same value again for Confirm New Password, then click OK.

Can you control Excel with Python?

Pandas is used to read the Excel file, create the Pivot table and export it to Excel. You can then use the Openpyxl library in Python to write Excel formulas, make charts and spreadsheets in Python. The Excel folder is now exported in the same location as your Python scripts.


1 Answers

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
like image 167
Michał Zawadzki Avatar answered Oct 02 '22 16:10

Michał Zawadzki