Python openpyxl调用wb.save()抛TypeError 保存的xlsx无法被Excel打开
问题场景
对现有xlsx文件完成编辑后,调用wb.save("TestReport.xlsx")另存为指定文件名时抛出TypeError异常。Python侧会正常生成对应名称的xlsx文件,但文件内容不完整,无法被Excel正常打开。
相关参考素材:
- 本地下载文件夹中生成的目标xlsx文件记录
- Excel打开损坏文件时的报错提示记录
现有实现代码
def formatReport(): os.chdir("C:\\Users\\awentz\\Downloads") files = sorted(os.listdir(os.getcwd()), key=os.path.getmtime) report = files[-1] logging.debug(str(report)) wb = openpyxl.load_workbook(report) ws = wb.active ws.delete_cols(1, 1) for row in ws.iter_rows(min_row=2, max_row=len(ws["A"]), min_col=4, max_col=4): for cell in row: if cell.value != "": cell.value = float(cell.value) / 1440 cell.number_format = 20 wb.save("TestReport.xlsx") wb.close()
触发的错误栈信息
Exception has occurred: TypeError expected <class 'str'> File "C:\Users\awentz\Desktop\Python Workspace\PullDailyUsageReport.py", line 90, in formatReport wb.save("TestReport.xlsx") File "C:\Users\awentz\Desktop\Python Workspace\PullDailyUsageReport.py", line 102, in <module> formatReport()
问题原因与修复步骤
- 触发TypeError的核心原因:openpyxl的
cell.number_format属性仅接受字符串类型的Excel格式规则,代码中直接给该属性传入整数20,在工作簿序列化写入磁盘的过程中,类型不匹配直接中断写入流程。生成的文件因为写入不完整,自然无法被Excel正常打开。 - 具体修改:将整数格式码替换为字符串形式的对应格式,Excel中索引为20的内置时间格式,对应字符串值为
"hh:mm",修改后的代码片段:cell.value = float(cell.value) / 1440 cell.number_format = "hh:mm" - 修复效果验证:修改后重新执行保存流程,序列化过程无类型不匹配问题,可生成完整合法的xlsx文件,正常被Excel打开。
内容的提问来源于stack exchange,提问作者Adam Wentz
相关产品推荐
相关产品推荐

