使用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() # 此处触发报错
修复方案
- 调整
page_setup函数返回值,返回Worksheet实例对象而非工作表名称字符串 - 所有单元格格式都需要通过
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
相关产品推荐
相关产品推荐

