使用Pandas和XlsxWriter时merge_range的add_format部分格式不生效问题求助
Pandas + XlsxWriter 合并单元格格式部分失效的问题排查
我正尝试使用Pandas和XlsxWriter为Excel文件添加标题,但
worksheet.merge_range的merge_format未达到预期效果。相关代码如下:df = pd.DataFrame.from_records(pd.json_normalize(data)) writer = pd.ExcelWriter("teste12.xlsx", engine='xlsxwriter') df.to_excel(writer, sheet_name=nome_tabela, index=False, startcol=0, startrow=5) workbook = xlsxwriter.Workbook(writer) merge_format = workbook.add_format() merge_format.set_border(True) merge_format.set_bold(True) merge_format.set_align("center") merge_format.set_align("vcenter") merge_format.set_font_size(20) worksheet = writer.sheets[nome_tabela] worksheet.merge_range(0,0,3,6,"Test", merge_format) writer.save()我也尝试按照文档示例设置merge_format:
merge_format = workbook.add_format({ 'bold': 1, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': 'yellow', 'font_size' : 20 })在这两种设置方式中,bold、border和align格式均正常生效,但font_size、valign和fg_color格式无法生效。请问我哪里操作出错了?
问题根源
你踩了一个很容易忽略的小坑:重复创建了Workbook对象!
当你用pd.ExcelWriter(..., engine='xlsxwriter')创建writer时,内部已经自动初始化了一个XlsxWriter的Workbook实例。但你之后又手动调用workbook = xlsxwriter.Workbook(writer)新建了一个独立的Workbook对象——你在这个新对象上定义的格式,和writer实际用来生成Excel的Workbook根本不是同一个。这就是为什么部分格式看似生效(其实是和Excel默认样式巧合重合),而font_size、valign这类需要精确绑定的设置完全失效的原因。
修正后的代码
只需要从writer中获取已存在的Workbook实例即可,不用手动新建:
import pandas as pd # 假设data和nome_tabela已提前定义 df = pd.DataFrame.from_records(pd.json_normalize(data)) writer = pd.ExcelWriter("teste12.xlsx", engine='xlsxwriter') df.to_excel(writer, sheet_name=nome_tabela, index=False, startcol=0, startrow=5) # 从writer中获取已创建的workbook,而非手动新建 workbook = writer.book # 字典方式定义格式更简洁,两种设置格式的方式都可以使用 merge_format = workbook.add_format({ 'bold': 1, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'fg_color': 'yellow', 'font_size': 20 }) worksheet = writer.sheets[nome_tabela] worksheet.merge_range(0, 0, 3, 6, "Test", merge_format) writer.save()
额外注意点
- 垂直对齐的参数在字典格式中是
'valign',对应方法调用的set_align('vcenter')是正确的,两者要对应上 - 后续如果要添加图表、其他单元格格式等,都要通过
writer.book获取Workbook实例,不要手动新建 - 调用
writer.save()前,确保所有格式、内容都绑定到了writer关联的Workbook和Worksheet上
内容的提问来源于stack exchange,提问作者Felipe Colussi-oliva
相关产品推荐
相关产品推荐

