通过pandas的read_excel读取xlsx文件出现问题,会报*TypeError: expected <class ‘openpyxl.styles.fills.Fill’>*的错误
由于我是从腾讯文档上下载的xlsx文件,解决问题三步排查:
1、文件源
2、下载代码
3、读取代码
一、
首先看看读取的代码,注释掉从网络下载xlsx文件的步骤,直接从本地读取,报错
用WPS打开后重新保存,可以正常读取。
读取代码应该没问题
二、
然后看看下载的代码,加个打印,文件确实是下载下来了,但是用pandas的openpyxl库无法读取,那我就加个无限循环,检查确保他能被openpyxl读取了再保存。
def ensure_file_readable(self, file_name='BVID.xlsx'):
"""
确保下载的 Excel 文件可以用 pandas (engine='openpyxl') 正确读取。
如果文件无法被正确读取,尝试清理样式并使用 pandas 保存文件。
返回 True 表示文件可读,False 表示文件不可读。
"""
try:
# 尝试使用 pandas 和 openpyxl 引擎读取文件
df = pd.read_excel(file_name, engine='openpyxl')
print(f"文件 {file_name} 可以被 pandas (engine='openpyxl') 成功读取。")
return True
except Exception as e:
print(f"无法使用 pandas (engine='openpyxl') 读取文件 {file_name},错误信息:{e}")
# 尝试使用 openpyxl 清理样式并保存
try:
wb = openpyxl.load_workbook(file_name, read_only=True, data_only=True)
new_wb = openpyxl.Workbook()
ws = new_wb.active
for sheet in wb.worksheets:
for row in sheet.iter_rows(values_only=True):
ws.append(row)
new_wb.save(file_name)
print(f"文件 {file_name} 已经清理样式并重新保存。")
return True
except Exception as style_clean_error:
print(f"尝试清理样式并保存文件失败,错误信息:{style_clean_error}")
# 尝试使用 pandas 读取文件并保存为新的文件
try:
df = pd.read_excel(file_name, engine='openpyxl')
df.to_excel(file_name, index=False)
print(f"文件 {file_name} 已被 pandas 读取并重新保存。")
return True
except Exception as save_error:
print(f"尝试使用 pandas 读取并保存文件失败,错误信息:{save_error}")
return False
while not tx.ensure_file_readable('BVID.xlsx'):
print("文件格式有误,正在重新下载...")
tx.download_excel(check_progress_url, file_name)
tx.rename_and_overwrite_file(file_name, 'BVID.xlsx')
pandas库、openpyxl库、xlrd库轮了一遍火车,程序就一直循环,始终无法保存正确格式的文件。
三、(解决办法)
在本地新建一个xlsx表格,把旧表格里的东西复制,然后在新表格“粘贴为数值”,全部格式化。
猜测是因为旧表格里某个地方有宏,但是我懒得找了,直接全部格式化。
最后再把这个表格上云,然后测试一下,从腾讯文档下载下来,读取,操作,一切正常。
至此问题解决。
另
如果你不想全部格式化,尝试手动清除所有宏,直到另存为的时候默认不是保存为.xlsm文件而是.xlsx文件。