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

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值