Python加密Excel
最近编写一个软件需要对Excel进行加密,因此学习一下。
Excel提供的加密功能
工作簿密码
工作表密码
工作簿结构密码
只读密码:这一种在excel软件中没有找到,但Python库提供了功能
可以对Excel进行加密的Python库
pywin32:作用是调用Windows API,可以操作所有Office,通过pywin32的win32com可以加密excel。
xlwings:只是操作Excel文件。安装xlwings时会同时安装pywin32,底层也是调用win32com进行加密。
[1] https://stackoverflow.com/questions/64138287/how-to-force-xlwings-to-use-comretryobjectwrapper-instead-of-win32com-api
[2] https://stackoverflow.com/questions/58328776/differences-between-xlwings-vs-openpyxl-reading-excel-workbooks
openpyxl:只能操作Excel 2010 xlsx/xlsm/xltx/xltm文件。与pywin32相比,openpyxl不需要安装excel软件也可以加密excel。
msoffcrypto-tool:只是用来解密已经被加密的Office文件。
EasyXLS:有Java与.NET两种版本,安装库(Pythonnet、Py4J、Pyjnius)使得Python可以调用Java与.NET,便可以间接调用EasyXLS。
[1] https://www.easyxls.com/manual/tutorials/python/encrypt-excel-file.html
[2] https://stackoverflow.com/questions/60027039/protect-workbook-by-python
Aspose.Cells:有很多版本,同EasyXLS,也可通过Python调用Java与.NET来间接调用Aspose.Cells,两个Python库分别为JAVA aspose-cells
与.NET aspose-cells-python
。
使用JAVA版本的库需要安装JAVA,使用.NET版本的则不需要(Windows自带.NET)。
[1] https://docs.aspose.com/cells/
[2] https://docs.aspose.com/cells/python-java/getting-started/
[3] https://docs.aspose.com/cells/python-net/getting-started/
由于后两种还会涉及到JAVA与.NET,使得事情变得复杂。因此研究前四种库。
导入库
import openpyxl
import xlwings
from win32com.client import Dispatch
import msoffcrypto
import pandas
import io
win32com
打开Excel,在单元格写入内容
xcl = Dispatch("Excel.Application")
xcl.Visible = 1
xcl.Workbooks.Add()
xcl.Cells(1,1).Value = "Hello"
如何知道还有什么函数?
在命令行运行 python xxx\Lib\site-packages\win32com\client\combrowse.py
,便可弹出窗口,去了解有哪些函数(发现不可行)。
另外,发现微软网站[2]
所提供的说明也可做参考。
[1] http://timgolden.me.uk/pywin32-docs/html/com/win32com/HTML/QuickStartClientCom.html
[2] https://learn.microsoft.com/en-us/office/vba/api/Excel.Workbooks
[3] https://www.cnblogs.com/tomato0906/articles/5994336.html
加密与解密Excel
def del_password(path, password1, password2):
xcl = Dispatch("Excel.Application")
xcl.Visible = False
wb = xcl.Workbooks.Open(path, UpdateLinks=False, ReadOnly=False, Format=None,
Password=password1,WriteResPassword=password2)
xcl.DisplayAlerts = False
# 保存时可设置访问密码
wb.SaveAs(path, Password='',WriteResPassword='')
xcl.Quit()
def set_password(path, password1, password2):
xcl = Dispatch("Excel.Application")
# 路径为绝对路径,不能为相对路径报错
wb = xcl.Workbooks.Open(path)
xcl.DisplayAlerts = False
# 保存时可设置访问密码
wb.SaveAs(path, Password=password1, WriteResPassword=password2)
xcl.Quit()
set_password(abspath, '123', '456')
# del_password(abspath, '123', '456')
Path:绝对路径,如果是相对路径会报错
Password:工作簿密码
WriteResPassword:工作簿只读密码(可以修改,但无法以原文件名命名)
[1] https://www.cnblogs.com/vhills/p/9418860.html
[2] http://t.csdn.cn/INOCQ
xlwings
def set_password2(path, password):
app=xlwings.App(visible=False,add_book=False)
app.display_alerts=False
app.screen_updating=False #关闭屏幕更新,可加快宏的执行速度
wb=app.books.open(path)
wb.save(path, password=password)
wb.close()
app.quit()
def del_password2(path, password):
app=xlwings.App(visible=False,add_book=False)
app.display_alerts=False
app.screen_updating=False #关闭屏幕更新,可加快宏的执行速度
wb=app.books.open(path, password=password)
wb.save(path, password='')
wb.close()
app.quit()
del_password2(path, '123')
Save函数没有write_res_password
参数,Open函数有write_res_password
参数,导致设置只读密码后,无法取消。
用起来和win32com无异,只不过官方给出了文档。
[1] https://docs.xlwings.org/en/stable/api.html
[2] Python操作Excel的Xlwings教程(一) - 那个百分十先生的文章 - 知乎 https://zhuanlan.zhihu.com/p/149878144
openpyxl
# -----------------读取excel
wb = openpyxl.load_workbook(path)
ws = wb.active
# 密码
#ws.protection.disable()
ws.protection.password = '789'
# 保存
wb.save(path)
# --------------------创建excel
# 创建excel
wb = openpyxl.Workbook()
ws = wb.active
ws.protection.password = '789'
wb.security.lockStructure = True
wb.save(path)
读取现有文件,只能对工作表加密,ws.protection.password
可设置密码,ws.protection.disable()
可取消密码。
openpyxl较前两种速度快,但无法对工作簿加密。
如果是创建新的excel,则还可以设置锁定工作簿结构,但由于不能设置密码,用户可以直接在excel中取消。
[1] https://www.osgeo.cn/openpyxl/protection.html
msoffcrypto
file = open(path, 'rb')
decrypted = io.BytesIO() #在内存中创建一个字节流
if msoffcrypto.olefile.isOleFile(file): #确定文件被加密
xlf = msoffcrypto.OfficeFile(file) #用msoffcrypto打开加密文件,未加密文件用这个打开会报错
xlf.load_key(password='123') #传入文件的密码
xlf.decrypt(decrypted) # 将文件解密并保存到内存中
pd_excel = pandas.read_excel(decrypted, sheet_name=0, header=0) # 将保存到内存中的文件用pandas打开
# 输出表头
print(pd_excel.head())
# 关闭
decrypted.close()
file.close()
[1] http://t.csdn.cn/OZ609
[2] https://www.runoob.com/python/python-func-open.html
[3] https://msoffcrypto-tool.readthedocs.io/en/latest/msoffcrypto.html
[4] pandas. https://www.cnblogs.com/yfacesclub/p/11232736.html
[5] BytesIO. http://t.csdn.cn/1eyBR