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

如何为pandas.io.formats.style.Styler应用数字格式后导出到Excel

问题原因
  • 没有将生成的Styler对象写入ExcelWriter实例,自定义的列格式找不到对应的工作表对象生效
  • 代码中直接调用的workbook、worksheet未从当前ExcelWriter实例中获取,属于未定义的变量,操作不会作用到本次导出的文件上
  • 样式设置的顺序错误,数字格式配置需要在Styler写入工作表之后执行,否则会被pandas默认的导出样式覆盖
可行解决方案

有两种实现方式,按需选择即可:

方式1:保留xlsxwriter底层操作的写法

调整代码顺序,先写入Styler再配置列格式,修改后的完整代码如下:

from decimal import Decimal
import pandas as pd
from datetime import datetime

today = datetime.today()
# 此处补充你自己的path变量定义
path = "你的文件保存路径"

# 原有样式定义逻辑不变
diferenciaPermitida=Decimal('0.02')
styleNoEncontrado =lambda x: ['background-color: %s' % 'red' if x=="No Encontrado" else '' for x in dtCruzado.Estado_Cruce]
dt=dtCruzado.style\
    .apply(styleNoEncontrado, axis=0)

# 初始化ExcelWriter
writer = pd.ExcelWriter(path+"\\Cruce_"+today.strftime("%d-%B-%Y")+".xlsx",
                        engine='xlsxwriter',
                        datetime_format='mmm d yyyy',
                        date_format='mmmm dd yyyy')

# 先将Styler对象写入writer,指定工作表名
dt.to_excel(writer, sheet_name='Sheet1', index=False)

# 从当前writer中获取workbook和worksheet实例
workbook = writer.book
worksheet = writer.sheets['Sheet1']

# 再配置列格式,此时设置会生效
formatNumeric = workbook.add_format({'num_format': '#,##0.00'})
worksheet.set_column('O:O', 14, formatNumeric)
worksheet.set_column('P:P', 14, formatNumeric)

# 调整其他列宽等操作

# 保存文件
writer.save()

方式2:直接用Styler自带的格式配置(更简单,无需操作底层对象)

不需要调用xlsxwriter的接口,直接在Styler对象上设置列格式即可,代码更简洁:

diferenciaPermitida=Decimal('0.02')
styleNoEncontrado =lambda x: ['background-color: %s' % 'red' if x=="No Encontrado" else '' for x in dtCruzado.Estado_Cruce]

# 此处新增format配置,subset参数填O、P列对应的DataFrame列名即可
dt=dtCruzado.style\
    .apply(styleNoEncontrado, axis=0)\
    .format('{:,.2f}', subset=['O列的列名', 'P列的列名'])

# 后续直接导出即可,不需要额外配置worksheet
writer = pd.ExcelWriter(path+"\\Cruce_"+today.strftime("%d-%B-%Y")+".xlsx",
                        engine='xlsxwriter',
                        datetime_format='mmm d yyyy',
                        date_format='mmmm dd yyyy')
dt.to_excel(writer, sheet_name='Sheet1', index=False)
writer.save()
注意事项
  • 如果导出时需要保留索引,把to_excel的index=False改成index=True即可,对应列的序号要往后顺延一位
  • 方式2的subset参数需要传入的是DataFrame的列名字符串,不是Excel的列号,如果习惯用列号可以转成列名,比如第15列(O列)对应dtCruzado.columns[14]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:39:02