导出的 xlsx 里手机号显示成 1.39E+10,双击单元格才看到完整 11 位,重新保存后又变回科学计数法。乍看像缓存或者权限的锅,追下去往往不是。
from openpyxl import Workbook
wb = Workbook(); ws = wb.active
c = ws.cell(row=1, column=1, value='13900001111')
c.number_format = '@'
wb.save('users.xlsx')
追下去是这么回事:单元格按数字类型写入,Excel 对超过 11 位的数字自动用科学计数法显示。number_format 没设成 @,值本身就是数字而不是文本。
碰到「openpyxl 科学计数法」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,写入前把单元格 number_format 设成 '@';值按字符串写入 不要传 int;用 Excel 和 WPS 各打开一次 确认列宽内显示完整号码。
验收就看一点,打开导出文件,手机号列完整显示 11 位,不再出现 E+10。
