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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 19:15:04