解决办法:TypeError: expected <class ‘openpyxl.styles.fills.Fill‘

通过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文件。

这个错误是因为在设置填充颜色时,传递的参数类型不正确。`openpyxl` 中的 `PatternFill` 类的 `start_color` 和 `end_color` 参数需要接收 `openpyxl.styles.colors.Color` 类型的对象。 你可以使用 `openpyxl.styles.colors` 模块中的 `Color` 类来创建颜色对象,然后将其传递给 `PatternFill` 类的参数。以下是一个修正后的示例代码: ```python import pandas as pd from openpyxl import load_workbook from openpyxl.styles import PatternFill from openpyxl.styles.colors import Color # 读取 Excel 文件 df = pd.read_excel('your_file.xlsx') # 创建一个样式对象,设置填充颜色为红色 red_fill = PatternFill(start_color=Color(rgb="FF0000"), end_color=Color(rgb="FF0000"), fill_type="solid") # 修改指定单元格的颜色 # 假设你要修改第一行第一列的单元格颜色 cell_coord = 'A1' sheet_name = 'Sheet1' # 修改为你的工作表名称 # 将 DataFrame 数据写入已存在的 Excel 文件,并保留原有样式 with pd.ExcelWriter('your_file.xlsx', engine='openpyxl') as writer: writer.book = load_workbook('your_file.xlsx') df.to_excel(writer, sheet_name=sheet_name, index=False) writer.sheets[sheet_name][cell_coord].fill = red_fill writer.save() ``` 在上述代码中,我们使用 `Color(rgb="FF0000")` 来创建红色的颜色对象,并将其传递给 `PatternFill` 类的 `start_color` 和 `end_color` 参数。 请确保将 `'your_file.xlsx'` 修改为你要操作的 Excel 文件的路径,将 `'Sheet1'` 修改为你要操作的工作表名称,将 `cell_coord` 修改为你要修改的单元格坐标。希望这次能解决你的问题!如果还有其他疑问,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值