密码使用Python保护Excel文件

时间:2016-03-21 03:03:25

标签: python openpyxl

我没有找到使用Python创建受密码保护的Excel文件的大部分主题。

在Openpyxl中,我确实找到了一个SheetProtection模块:

from openpyxl.worksheet import SheetProtection

然而,问题是我不确定如何使用它。它不是WorkbookWorksheet的属性,所以我不能这样做:

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

有人知道Python是否可以提出这样的请求?谢谢!

5 个答案:

答案 0 :(得分:4)

查看openpyxl的文档,我注意到确实存在openpyxl.worksheet.SheetProtection类。但是,它似乎已经是工作表对象的一部分:

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

检查dir(ws.protection)显示有一个方法set_password,当使用字符串参数调用时,确实似乎设置了受保护的标志。

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

我在LibreOffice中打开random.xlsx,表单确实受到了保护。但是,我只需要切换一个选项来关闭保护,而不是输入任何密码,所以我可能会做错了...

答案 1 :(得分:3)

openpyxl不太可能提供工作簿加密。但是,您可以自己添加,因为Excel文件(xlsx格式版本&gt; = 2010)是zip-archives:在openpyxl中创建文件并使用标准实用程序为其添加密码。

答案 2 :(得分:1)

这是我使用的解决方法。它会生成一个VBS脚本并从您的python脚本中调用它。

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

答案 3 :(得分:0)

您可以使用python win32com来保存带有密码的Excel文件。

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
#Before saving the file set DisplayAlerts to False to suppress the warning dialog:
excel.DisplayAlerts = False
wb = excel.Workbooks.Open(your_file_name)
# refer https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/bb214129(v=office.12)?redirectedfrom=MSDN
# FileFormat = 51 is for .xlsx extension
wb.SaveAs(your_file_name, 51, 'your password')                                               
wb.Close() 
excel.Application.Quit()

答案 4 :(得分:0)

这是 Michał Zawadzki 解决方案的重新设计,不需要创建和执行单独的 vbs 文件:

def PassProtect(Path, Pass):

    from win32com.client.gencache import EnsureDispatch
    
    xlApp = EnsureDispatch("Excel.Application")
    
    xlwb = xlApp.Workbooks.Open(Path)
    
    xlApp.DisplayAlerts = False
    xlwb.Visible = False
    
    xlwb.SaveAs(Path, Password = Pass)
    
    xlwb.Close()
    
    xlApp.Quit()
    
PassProtect(FullExcelWorkbookPathGoesHere, DesiredPasswordGoesHere)

如果您想选择项目文件夹中的文件名,您也可以这样做:

from os.path import abspath

PassProtect(abspath(FileNameInsideProjectFolderGoesHere), DesiredPasswordGoesHere)
相关问题