You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用openpyxl打开Go Excelize生成的xlsx文件时报Fill类型错误如何解决

问题原因

这个报错是旧版本openpyxl对Go语言Excelize库生成的Excel文件样式兼容性差导致的,Excelize输出的填充样式格式不符合openpyxl的解析规则,所以加载时报错。手动用MS Excel打开重存的操作本质是Excel自动修正了样式格式,适配了标准Office规范。

自动化解决方案

方案1:加载文件时忽略样式(最推荐,无额外依赖)

如果你只需要读取单元格内容,不需要处理样式,直接在openpyxl.open(等价于openpyxl.load_workbook)时添加keep_styles=False参数即可跳过样式解析,直接读取数据。
修改后的代码如下:

import requests
import config
import openpyxl

link = 'https://api.telegram.org/file/bot' + config.TOKEN + '/documents/file_66.xlsx'

def save_open(link):
    filename = link.split('/')[-1]
    r = requests.get(link)
    with open(filename, 'wb') as new_file:
        new_file.write(r.content)
    # 新增keep_styles=False参数跳过样式解析
    wb = openpyxl.open('file_66.xlsx', keep_styles=False)
    ws = wb.active
    cell = ws['B2'].value
    print(cell)

save_open(link)

方案2:升级openpyxl到最新版本

该兼容性问题在openpyxl 3.1.0及以上版本已做了兼容处理,直接升级库即可:

pip install --upgrade openpyxl

升级后原代码无需修改即可正常运行。

方案3:使用命令行工具自动转存文件(需保留样式时使用)

如果后续需要修改文件并保留原有样式,可以用LibreOffice的无头模式自动模拟手动打开重存的操作,无需人工介入:

  1. 先安装LibreOffice到本地,将安装目录下的program文件夹路径添加到系统环境变量
  2. 代码中下载文件后调用命令行转存:
import subprocess
# 下载文件后执行以下代码
subprocess.run(["soffice", "--headless", "--convert-to", "xlsx", "file_66.xlsx", "--outdir", "./"], capture_output=True)
# 转存后的文件直接用openpyxl正常打开即可

内容的提问来源于stack exchange,提问作者Yamabusia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 21:27:03