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

使用xlsxwriter封装写DataFrame函数后workbook.close()报错如何解决

错误原因分析

该报错的核心是XlsxWriter在校验格式对象时,收到了字符串类型的输入而非预期的XlsxFormat实例,封装场景下90%以上的问题属于以下两类:

  • 封装page_setup函数时错误返回了工作表名称字符串,而非Worksheet实例对象,后续写入函数把字符串当成工作表对象传入,触发参数类型匹配错误
  • 封装write函数时直接把格式描述字符串(比如'bold')作为格式参数传入写入方法,没有提前调用Workbook.add_format()生成标准格式对象
错误复现样例

典型的错误封装写法如下:

import pandas as pd
import xlsxwriter

# 错误的page_setup函数,返回工作表名而非实例
def page_setup(wb, sheet_name):
    ws = wb.add_worksheet(sheet_name)
    ws.set_column('A:Z', 15)
    return sheet_name

# 错误的write函数,直接用字符串作为格式参数
def write_df(ws, df):
    header_format = 'bold'
    for col_num, value in enumerate(df.columns.values):
        ws.write(0, col_num, value, header_format)
    for row_num, row in enumerate(df.values, 1):
        for col_num, value in enumerate(row):
            ws.write(row_num, col_num, value)

if __name__ == '__main__':
    wb = xlsxwriter.Workbook('test.xlsx')
    df = pd.DataFrame({'a':[1,2], 'b':[3,4]})
    ws = page_setup(wb, 'Sheet1')
    write_df(ws, df)
    wb.close() # 此处触发报错
修复方案
  1. 调整page_setup函数返回值,返回Worksheet实例对象而非工作表名称字符串
  2. 所有单元格格式都需要通过Workbook.add_format()方法生成标准格式对象,禁止直接传字符串作为格式参数

修复后的代码样例:

import pandas as pd
import xlsxwriter

# 修复后的page_setup函数,返回Worksheet实例
def page_setup(wb, sheet_name):
    ws = wb.add_worksheet(sheet_name)
    ws.set_column('A:Z', 15)
    return ws

# 修复后的write函数,提前生成标准格式对象
def write_df(ws, df, wb):
    header_format = wb.add_format({'bold': True})
    for col_num, value in enumerate(df.columns.values):
        ws.write(0, col_num, value, header_format)
    for row_num, row in enumerate(df.values, 1):
        for col_num, value in enumerate(row):
            ws.write(row_num, col_num, value)

if __name__ == '__main__':
    wb = xlsxwriter.Workbook('test.xlsx')
    df = pd.DataFrame({'a':[1,2], 'b':[3,4]})
    ws = page_setup(wb, 'Sheet1')
    write_df(ws, df, wb)
    wb.close()
额外排查点

如果修改后仍报错,可检查以下场景:

  • Workbook/Worksheet对象在函数间传递时被意外转成了字符串
  • 写入单元格时参数顺序写反,把本该传值的位置传入了字符串,格式参数位置传入了值,导致XlsxWriter误把字符串识别为格式对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:24:04