使用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的无头模式自动模拟手动打开重存的操作,无需人工介入:
- 先安装LibreOffice到本地,将安装目录下的program文件夹路径添加到系统环境变量
- 代码中下载文件后调用命令行转存:
import subprocess # 下载文件后执行以下代码 subprocess.run(["soffice", "--headless", "--convert-to", "xlsx", "file_66.xlsx", "--outdir", "./"], capture_output=True) # 转存后的文件直接用openpyxl正常打开即可
内容的提问来源于stack exchange,提问作者Yamabusia
相关产品推荐
相关产品推荐

