Python中打开加密Excel后,如何读取数据至最后一行?
衔接加密Excel解密方法的读取方案(读到最后一行)
嘿,我知道你已经按照帖子里的方法成功打开了加密Excel,但用openpyxl直接加载又踩坑了——这很正常,因为openpyxl本身不支持直接读取加密文件嘛。下面给你几个能完美衔接之前解密操作的方案,轻松读取到最后一行数据:
方案1:直接用win32com读取(不用换库)
如果你之前用的是win32com打开加密文件,那完全可以在同一个会话里完成读取,没必要再碰openpyxl。直接看示例:
import win32com.client as win32 # 这部分就是你之前用的打开加密文件的代码 excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False # 后台运行,不弹出Excel窗口 wb = excel.Workbooks.Open(r'sample.xlsx', False, True, None, '你的文件密码') ws = wb.ActiveSheet # 要是指定工作表就改成wb.Worksheets('Sheet1') # 读取到最后一行的核心操作 # 先拿到最后一行的行号(用xlUp常量定位最后有数据的行) last_row = ws.Cells(ws.Rows.Count, 1).End(-4162).Row # 循环读取每一行数据 all_data = [] for row_num in range(1, last_row + 1): current_row = [] # 遍历当前行的所有已使用列 for col_num in range(1, ws.UsedRange.Columns.Count + 1): current_row.append(ws.Cells(row_num, col_num).Value) all_data.append(current_row) # 别忘了收尾,关掉Excel进程 wb.Close(False) excel.Quit()
方案2:解密后存临时文件,再用openpyxl读取
要是你偏爱openpyxl的语法,那可以先把加密文件解密后存成无密码的临时文件,再用openpyxl正常读取:
import win32com.client as win32 import openpyxl import os # 第一步:解密并另存为无密码文件 excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False wb = excel.Workbooks.Open(r'sample.xlsx', False, True, None, '你的文件密码') wb.SaveAs(r'temp_no_pass.xlsx', Password='') # 密码设为空就是无保护版本 wb.Close(False) excel.Quit() # 第二步:用openpyxl读取临时文件到最后一行 wb = openpyxl.load_workbook('temp_no_pass.xlsx') ws = wb.active last_row = ws.max_row # 用iter_rows快速读取所有行,values_only=True直接获取单元格值 all_data = [row for row in ws.iter_rows(min_row=1, max_row=last_row, values_only=True)] # 可选:用完临时文件后删除它 os.remove('temp_no_pass.xlsx')
方案3:用msoffcrypto解密后直接内存读取(无需存文件)
如果之前用的是msoffcrypto-tool这个库解密,那可以直接在内存里处理,不用生成临时文件,更高效:
import msoffcrypto from io import BytesIO import openpyxl # 解密文件到内存流 with open('sample.xlsx', 'rb') as f: office_file = msoffcrypto.OfficeFile(f) office_file.load_key(password='你的文件密码') decrypted_stream = BytesIO() office_file.decrypt(decrypted_stream) # 重置流指针到开头,然后用openpyxl读取 decrypted_stream.seek(0) wb = openpyxl.load_workbook(decrypted_stream) ws = wb.active last_row = ws.max_row all_data = [row for row in ws.iter_rows(min_row=1, max_row=last_row, values_only=True)]
这几个方案都能完美衔接你之前的解密操作,避开openpyxl直接读加密文件的报错,还能轻松读取到最后一行的数据~
内容的提问来源于stack exchange,提问作者Nav
相关产品推荐
相关产品推荐

