使用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
相关产品推荐
相关产品推荐

