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)
问题根源
- with块作用域错误:所有格式修改代码都写在了
with pd.ExcelWriter(...)的块外面。with块执行完毕时,writer会自动关闭并完成文件写入,后续对writer和worksheet的修改根本不会被保存到文件里。 - 最初尝试把格式代码缩进进with块时,直接用
{'bold':True}这种字典作为格式参数导致报错,误以为缩进方式不对,实际上是XlsxWriter要求用专用格式对象,不能直接传字典。
解决方法
- 将所有格式修改逻辑完全放入with代码块内部,确保在writer自动关闭前完成所有编辑操作。
- 如果需要加粗等格式,先通过
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
相关产品推荐
相关产品推荐

