Python加密Excel

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

最近编写一个软件需要对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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python