Python对Excel的常规操作 之 读取带密码的文件,解除Sheet密码

Python对Excel的常规操作 之 读取带密码的文件,解除Sheet密码

一些废话

最近一直在给部门写一个参数校验的小程序。因为参数的设置问题,到达客户的产品出现通信故障,不能正常使用的情况屡见不鲜。这直接导致了公司的形象受损,而且客户可能会怀疑产品性能是否可靠。另外,检验员也被多次罚款,工作过程压力也很大,害怕再次出错。为解燃眉之急部门决定做一个自动检验的程序,操作员更改完毕后,由程序进行double check。因此前面的树莓派学习暂且搁置,后期会更新的,因为还有一个质量改进可能会用到树莓派。

软件的编写由我负责,后期由我和其他几位工程师进行模板文件的维护。当前编写大体已经完成,目前进入测试阶段。在编写过程中学习了很多,今天继续分享一下对Excel的操作。

待检验的文件是一个TXT文件,包含产品的所有配置信息,每行一个数据,代表不同的参数,参数个数199个或206个不等。软件的逻辑是读取TXT文件中某行数据,识别出该产品的要求。模板存放在一个Excel文件中,不同模板存放在不同的sheet,sheet名为模板名。每个模板中存放着TXT某一行的标准值,检验时,将对应模板读入软件,再与TXT文件进行比对。我应该没有说清楚😪,但这不重要。以后我会记录一些这个过程中学到的有用的东西。

马上我们要进入正题了······

读取加密的Excel

敲黑板
excel.Workbooks.Open(filename, UpdateLinks=False, ReadOnly=False, Format=None, Password=password)

读取之后就可以正常读取和写入文件了,读写具体操作参见 Python对Excel的常规操作 之 读取,写入(保留原格式写入).

from win32com.client import DispatchEx

def read_excel_password(filename, password):
    excel = DispatchEx("Excel.Application")  # 启动excel
    excel.Visible = False  # 去掉可视化
    
    demo = excel.Workbooks.Open(filename, UpdateLinks=False, ReadOnly=False, Format=None, Password=password)  # 打开文件并将密码传入

    xlSheet_1 = demo.Worksheets(1)  # 打开第一个sheet
    print(xlSheet_1.Cells(1, 1).Value)  # 打印第一个sheet的第一行一列数据
    demo.Close(True)  # 关闭文件
    
if __name__ == '__main__':
	filename = "D:\LEON\Sevenstar\Files\Demo.xlsx"
	password = "demo"
	read_excel_password(filename, password)

解除文件中Sheet的密码

领导要求,模板的更新由工程师完成,检验员可以查看到模板,但不允许进行修改。这就要求每个sheet需要设置一个密码。期初我是使用xlrd进行Excel的读取的,因为xlrd的读取速度比win32com要快。现在要给每个sheet加一个密码,xlrd是不支持读取加密码的文件的,写到这里我质疑了一下自己。刚试了一下xlrd确实不支持,但是xlrd支持读取Sheet加密的文件,所以我做了一些没有意义的工作😞。
复盘:我以为xlrd不能读取加密Sheet,实际上可以读取,因为加密的Sheet是可以读取的,只是不能写入。我想先用Win32com解除Sheet密码,再用xlrd读取,耍小聪明失败😌

不过这个功能确实可以批量解除Sheet的密码(密码已知)

import openpyxl
from win32com.client import DispatchEx
import os

def Unlock_Sheet_password(filename, password):
    excel = DispatchEx("Excel.Application")  # 启动excel
    excel.Visible = False  # 去掉可视化

    demo = excel.Workbooks.Open(filename)
    for i in range(1, len(sheet_name) + 1, 1):
        xlSheet_1 = demo.Worksheets(i)  # 打开第1个表
        xlSheet_1.Unprotect(password)  # 去除Sheet的密码

    demo.SaveAs("D:\\LEON\\Sevenstar\\Files\\Template_TEMP.xlsx")  # 另存为

    xlSheet_1 = demo.Worksheets(1)  # 打开第一个sheet
    print(xlSheet_1.Cells(1, 1).Value)  # 打印第一个sheet的第一行一列数据
    demo.Close(True)  # 关闭文件

    os.remove("D:\\LEON\\Sevenstar\\Files\\Template_TEMP.xlsx")  # 删除临时解锁的文件


if __name__ == '__main__':
    filename = "D:\LEON\Sevenstar\Files\Demo.xlsx"
    password = "demo"
    
    template_excel = openpyxl.load_workbook(filename)  # 获取文件中的Sheet名列表
    sheet_name = template_excel.sheetnames  # 存于sheet_name中
    
    Unlock_Sheet_password(filename, password)

写在后面

关于解除文件本身的密码,目前还没有查到有效的方法。

本次记录让我查到了自己的错误,绕了弯路,我会继续优化,后面我也会继续更新。希望早日完成软件,用到实际检验中,真正提高产品质量。

  • 8
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小Demo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值