如何用Pandas to_excel批量将float64格式化为BRL货币字符串?
Pandas导出Excel时自动将所有float64列格式化为巴西雷亚尔(BRL)货币格式的实现方案
我正在使用Pandas的
to_excel方法导出DataFrame至Excel文件,需要将所有float64类型的数值(无需指定具体列,因为列是可变的)导出为巴西雷亚尔(BRL)货币格式的字符串。代码示例如下:
import pandas as pd df = pd.DataFrame({'Numero': {0: '044121', 1: '044121'}, 'Serie': {0: '0', 1: '0'}, 'Finalidade': {0: '1', 1: '1'}, 'CNPJ_CPF_Emit': {0: '01039778000177', 1: '01039778000177'}, 'Rz_Emit': {0: 'VINHEDOS INDUSTRIA E COMERCIO DE PAPEIS LTDA.', 1: 'VINHEDOS INDUSTRIA E COMERCIO DE PAPEIS LTDA.'}, 'PIS_Valor': {0: 1620.98, 1: 1210.42}, 'COFINS_Valor': {0: 7466.32, 1: 5575.28}, 'Valor_IPI': {0: 3628.22, 1: 2709.28}, 'Valor_ICMS': {0: 13396.5, 1: 10003.5}, 'Valor_Total_Nota': {0: 201337.5, 1: 201337.5}, 'Valor_Frete': {0: '', 1: ''}}) df.to_excel(my_path, index=False, freeze_panes=(1,0))当前导出结果不符合需求,期望将数值列格式化为BRL货币字符串。请问是否可行?最优实现方式是什么?能否通过
float_format参数实现?
可行性与实现方案
1. 关于float_format参数的局限性
float_format是to_csv专属的参数,to_excel并不支持这个参数,所以没法直接用它来实现Excel中的货币格式设置。
2. 最优实现方式:用xlsxwriter引擎设置单元格格式
要动态识别所有float64列并设置BRL货币格式,推荐用xlsxwriter引擎操作单元格格式,既能保留数值的可计算性,又能实现需求的显示效果,步骤如下:
- 先安装依赖:
pip install xlsxwriter - 核心逻辑:遍历DataFrame列,判断类型是否为
float64,给这些列设置Excel的巴西雷亚尔货币格式(格式代码为R$ #,##0.00)
示例代码:
import pandas as pd df = pd.DataFrame({'Numero': {0: '044121', 1: '044121'}, 'Serie': {0: '0', 1: '0'}, 'Finalidade': {0: '1', 1: '1'}, 'CNPJ_CPF_Emit': {0: '01039778000177', 1: '01039778000177'}, 'Rz_Emit': {0: 'VINHEDOS INDUSTRIA E COMERCIO DE PAPEIS LTDA.', 1: 'VINHEDOS INDUSTRIA E COMERCIO DE PAPEIS LTDA.'}, 'PIS_Valor': {0: 1620.98, 1: 1210.42}, 'COFINS_Valor': {0: 7466.32, 1: 5575.28}, 'Valor_IPI': {0: 3628.22, 1: 2709.28}, 'Valor_ICMS': {0: 13396.5, 1: 10003.5}, 'Valor_Total_Nota': {0: 201337.5, 1: 201337.5}, 'Valor_Frete': {0: '', 1: ''}}) # 创建Excel写入对象,指定xlsxwriter引擎 writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter') df.to_excel(writer, index=False, freeze_panes=(1,0)) # 获取工作簿和工作表对象 workbook = writer.book worksheet = writer.sheets['Sheet1'] # 定义巴西雷亚尔货币格式 brl_format = workbook.add_format({'num_format': 'R$ #,##0.00'}) # 遍历所有列,设置float64列的格式 for col_num, col_name in enumerate(df.columns): if df[col_name].dtype == 'float64': # 同时设置列宽优化显示(可选) worksheet.set_column(col_num, col_num, 18, brl_format) # 保存文件 writer.close()
3. 备选方案:转成BRL格式字符串再导出
如果不需要保留数值的可计算性,只需要展示为固定格式的字符串,可以先将float列转为R$ XXXX.XX格式的字符串,再导出Excel:
示例代码:
# 遍历列,转换float64列为BRL格式字符串 for col in df.columns: if df[col].dtype == 'float64': # 处理千分位和小数点的巴西格式(逗号做小数点,点做千分位) df[col] = df[col].apply(lambda x: f'R$ {x:,.2f}'.replace(',', 'temp').replace('.', ',').replace('temp', '.')) # 导出Excel df.to_excel('output.xlsx', index=False, freeze_panes=(1,0))
注意:这种方式会把数值转为字符串,Excel中无法直接进行计算,仅适合纯展示场景。
内容的提问来源于stack exchange,提问作者Lucas Marques
相关产品推荐
相关产品推荐

