Pandas 如何快速打开加密的 Excel 文件
import win32com.client as win32
import pandas as pd
import time
def df_from_pswxlsx(filename,password,gl_excel_com,sheetname):
"""
调用格式:
df=df_from_pswxlsx(“D:\amlui\pivot\aa.xlsx”,“Xyl19765225”,“KET.Application”)
参数一:文件路径
参数二:文件密码
参数三:不同配置的 Excel-COM 参数,WPS excel 用’KET.Application’,
MS office Excel 文件用’Excel.Application’
参数四:excel 工作簿中要处理的 sheet 名。
return: 解密后输出的 pandas 格式的 df,df 就可以参与各种运算了。
於策 2020 年 7 月 7 日调试成功,算法改进后运行速度超级快。
1437 条记录从 47 秒减至 2.7 秒
3410 条记录从 105 秒减至 3.05 秒
"""
psw_xlsx=win32.DispatchEx(gl_excel_com) #这个功能创建新进程,不会打扰用户手动进程
psw_xlsx.DisplayAlerts=0 #不显示警告,SaveAS 的弹框就不出来了。
wb = psw_xlsx.Workbooks.Open(filename, UpdateLinks=False, ReadOnly=False, Format=None, Password=password, WriteResPassword=password)
#获取工作表具体情况
data_lst=list(wb.Worksheets(sheetname).UsedRange()) #数据存入,“原始数据”,2-“借贷求和计数”…数字与表名可以互换
df=pd.DataFrame(data_lst[1:],columns=data_lst[0]) #data_lst[1:] 除了表头(只有一行)以外的所有数据,data_lst[0], 原 excel 表的第一行表头作为列索引。
wb.Close()
psw_xlsx.DisplayAlerts=1
psw_xlsx.Application.Quit() #只清掉我自己开启的进程
return df #返回的 excel 表数据形成的 df.
t1=time.time()
df=df_from_pswxlsx(“D:\amlui\pivot\dd.xlsx”,“Xyl197655225”,“KET.Application”,“原始数据”)
print(time.time()-t1) #约 6 秒,有点慢 200 条记录,13 列
#46“,1437 条记录,13 列,不可接受,方法改进后,变是 2.7“
print(df)