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

XlsxWriter格式化修改不保存问题求助(Databricks环境)

在Databricks中使用Pandas+XlsxWriter修改Excel格式不生效的解决方法

问题描述

在Databricks上用Python生成多工作表Excel文件时,Pandas数据帧能正常写入Excel,但后续用XlsxWriter做的格式修改(比如写入表头、添加表格样式)完全不生效,也没有任何报错。尝试手动调用workbook.close()时,还会收到「调用close()于已关闭文件」的警告。

出错代码片段

with pd.ExcelWriter(fname, engine='xlsxwriter') as writer:
    pcpop.to_excel(writer, sheet_name=s1, startrow = 6)
    estgmp.to_excel(writer, sheet_name=s2, startrow = 6)
    jcwpp.to_excel(writer, sheet_name=s3, startrow = 6)
    cppan.to_excel(writer, sheet_name=s4, startrow = 6)
    aigmp.to_excel(writer, sheet_name=s5, startrow = 6)
    pcmtp.to_excel(writer, sheet_name=s6, startrow = 6)
    cpppan.to_excel(writer, sheet_name=s7, startrow = 6)
# 以上代码正常执行,以下代码无报错但完全不生效
workbook = writer.book
while sh < 7:
    print(sh)
    sn = slist[sh]
    sc = sclist[sh] + 6
    sc = str(sc)
    worksheet = writer.sheets[sn]
    worksheet.write('A1', 'KPI', {'bold':True})
    worksheet.write('A2', 'Bodyshop Reference', {'bold':True})
    worksheet.write('A3', 'Date', {'bold':True})
    worksheet.write('B1', sn)
    worksheet.write('B2', xlname)
    worksheet.write('B3', ts)
    worksheet.add_table('A6:B' + sc)
    sh = sh + 1

filepath = "//Report/" + xlname + ts + ".xlsx"
sftp.put(fname,filepath)

简化测试的代码也无效:

worksheet = writer.sheets['Paint Cost By Operator']
worksheet.write('A1', 'KPI')
filepath = "//Report/" + xlname + ts + ".xlsx"
sftp.put(fname,filepath)

问题根源

  1. with块作用域错误:所有格式修改代码都写在了with pd.ExcelWriter(...)的块外面。with块执行完毕时,writer会自动关闭并完成文件写入,后续对writer和worksheet的修改根本不会被保存到文件里。
  2. 最初尝试把格式代码缩进进with块时,直接用{'bold':True}这种字典作为格式参数导致报错,误以为缩进方式不对,实际上是XlsxWriter要求用专用格式对象,不能直接传字典。

解决方法

  1. 将所有格式修改逻辑完全放入with代码块内部,确保在writer自动关闭前完成所有编辑操作。
  2. 如果需要加粗等格式,先通过workbook.add_format()创建格式对象,再传入write()方法。

修正后的代码示例:

with pd.ExcelWriter(fname, engine='xlsxwriter') as writer:
    # 写入所有数据帧
    pcpop.to_excel(writer, sheet_name=s1, startrow = 6)
    estgmp.to_excel(writer, sheet_name=s2, startrow = 6)
    jcwpp.to_excel(writer, sheet_name=s3, startrow = 6)
    cppan.to_excel(writer, sheet_name=s4, startrow = 6)
    aigmp.to_excel(writer, sheet_name=s5, startrow = 6)
    pcmtp.to_excel(writer, sheet_name=s6, startrow = 6)
    cpppan.to_excel(writer, sheet_name=s7, startrow = 6)
    
    # 创建加粗格式对象
    bold_format = writer.book.add_format({'bold': True})
    
    # 循环修改每个工作表格式
    sh = 0
    while sh < 7:
        sn = slist[sh]
        sc = sclist[sh] + 6
        sc = str(sc)
        worksheet = writer.sheets[sn]
        # 使用格式对象设置加粗
        worksheet.write('A1', 'KPI', bold_format)
        worksheet.write('A2', 'Bodyshop Reference', bold_format)
        worksheet.write('A3', 'Date', bold_format)
        worksheet.write('B1', sn)
        worksheet.write('B2', xlname)
        worksheet.write('B3', ts)
        worksheet.add_table('A6:B' + sc)
        sh = sh + 1

# 上传文件
filepath = "//Report/" + xlname + ts + ".xlsx"
sftp.put(fname,filepath)

关键说明

  • pd.ExcelWriter配合with块使用时,会在块结束时自动调用close()完成文件写入,块外的操作无法影响已关闭的文件对象。
  • XlsxWriter的write()方法必须传入通过workbook.add_format()创建的格式对象,直接传格式字典会触发报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:53:13