由于工作的需要,拿到一批含有几百张表的加密xlsx文件,需要对其汇总进行分析,使用pandas 的read_excel()方法读取时, 提示XLRDError: Can't find workbook in OLE2 compound document
错误, 发现是由于xlsx加密的缘故,由于所有表数据均是一个密码,因此用下面方法进行进行解密数据进行输出。如果是 每个单表数据对应的密码不唯一, 有个猜想,可以吧文件和对应的密码生成一个dict,在每次读取添加密码的时候,可以根据文件进行自动获取密码。下面是标文件密码相同的解密方法。
import win32com.client
import pandas as pd
def get_datafram(filename,password):
"""
参数一:文件路径
参数二:文件密码
return: 解密后输出的df
"""
xlApp = win32com.client.Dispatch("Excel.Application")
xlwb = xlApp.Workbooks.Open(filename, False, True, None, Password=password)
#获取工作表具体情况
# 获取行数
rows=xlwb.Worksheets(1).UsedRange.Rows.Count
# 获取列数
col=xlwb.Worksheets(1).UsedRange.Columns.Count
#数据遍历重新写出
df_list=[]
for i in range(rows+1):
#每一行的值加入一个list
df_row_list=[]
for j in range(col+1):
#获取每个单元格的值
a=xlwb.Worksheets(1).Cells(i+1,j+1).Value
df_row_list.append(a)
df_list.append(df_row_list)
#转换写出
df=pd.DataFrame(df_list)
return df
由于xlwb.Worksheets(1).Cells(1,1).Value
中cells
的索引是从1 开始的, 故在原有数据的行数和列数的基础上+1.