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

使用Pandas与ExcelWriter写入Excel时末尾4位被转为0的问题

解决Pandas+Xlsxwriter写入19位长数字被舍入的问题

嘿,这个坑我之前踩过!你遇到的问题本质上不是格式设置的问题,而是Excel本身的数字存储机制在搞鬼:

Excel默认用双精度浮点数存储数字,而双精度浮点数最多只能精确表示15位十进制整数。超过15位的部分会被自动舍入,所以你的19位数字9223781998151429879才会变成9223781998151420000——这时候再设置数字格式已经晚了,因为Excel存储的数值本身就已经被修改了。

要解决这个问题,核心思路是让Excel把这个长数字当成文本存储,而不是数字类型。下面给你两种可行的方案:

方案1:先把DataFrame中的列转为字符串(最简单)

在写入Excel之前,直接把包含长数字的列转为字符串类型,这样Pandas会以文本形式写入,Excel就不会做浮点数转换了:

# 假设你的长数字列名为'long_num_col',替换成你实际的列名
df['long_num_col'] = df['long_num_col'].astype(str)

writer = pd.ExcelWriter("pandas_column_formats.xlsx", engine='xlsxwriter')
df.to_excel(writer, sheet_name='Result 1', index=False)

workbook = writer.book
worksheet = writer.sheets['Result 1']

# 设置文本格式,防止Excel自动把文本转成数字(可选但推荐)
text_format = workbook.add_format({'num_format': '@'})
worksheet.set_column('M:M', 20, text_format)

writer.close()

方案2:逐单元格写入字符串(不修改原DataFrame)

如果不想改动原DataFrame的结构,可以用Xlsxwriter的write_string方法手动写入每个单元格,强制以文本形式存储:

writer = pd.ExcelWriter("pandas_column_formats.xlsx", engine='xlsxwriter')
df.to_excel(writer, sheet_name='Result 1', index=False)

workbook = writer.book
worksheet = writer.sheets['Result 1']

text_format = workbook.add_format({'num_format': '@'})

# 遍历M列的所有数据行(表头在第1行,所以从第2行开始)
for row_idx in range(1, len(df) + 1):
    # 获取对应行的长数字,转为字符串
    long_num_str = str(df.iloc[row_idx - 1]['long_num_col'])
    # M列对应的索引是12(A列是0,以此类推)
    worksheet.write_string(row_idx, 12, long_num_str, text_format)

writer.close()

注意事项

  • 如果之后需要在Excel中对这个列做数值计算,文本格式的数字需要手动转换为数字类型,但如果只是用于展示、导出或匹配场景,文本格式完全够用。
  • 你之前设置的#,##0.00是数字格式,本质上还是让Excel把单元格当成数字处理,所以无法解决精度问题,必须换成文本格式@。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:50:29