如何为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
相关产品推荐
相关产品推荐

