我没有找到使用Python创建受密码保护的Excel文件的大部分主题。
在Openpyxl中,我确实找到了一个SheetProtection
模块:
from openpyxl.worksheet import SheetProtection
然而,问题是我不确定如何使用它。它不是Workbook
或Worksheet
的属性,所以我不能这样做:
wb = Workbook()
ws = wb.worksheets[0]
ws_encrypted = ws.SheetProtection()
ws_encrypted.password = 'test'
...
有人知道Python是否可以提出这样的请求?谢谢!
答案 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)