加\t是解决excel将长数字误转为科学计数法的最轻量方案。它利用excel对末尾制表符的文本识别机制,避免浮点精度丢失,无需改源码、引新库或依赖后端,导出即生效。
直接在长数字字段末尾加 \t(制表符)是最轻量、最稳定、兼容性最好的解法。 不改源码、不引新库、不依赖后端,导出即生效,excel 打开就识别为文本。
为什么加 \t 就能骗过 Excel?
Excel 解析 CSV 时判断单元格类型,不是靠双引号,而是看内容“像不像数字”。纯数字 ≥15 位(如身份证、订单号、银行卡号)会被强制转双精度浮点——此时精度已丢,无法还原。而 \t 是 Excel 明确认可的文本标记之一,只要字段值末尾带它,哪怕被双引号包裹,Excel 也会放弃数值解析,按文本处理。
其他方式对比:
-
'12345678901234567890(单引号前置):部分 Excel 版本会显示单引号,影响阅读 -
"12345678901234567890"(纯双引号):Layui 默认就加了,但对长数字无效——Excel 仍当数值 - 用
sheetjs重写导出:引入 500KB+ 体积,与 Layui 2.x 的 Promise 链易冲突,导出按钮可能无响应
在哪加 \t?优先用 templet 字段级控制
这是最可控、最易维护的方式,不污染全局逻辑,且能配合业务做脱敏或格式化。
- 在列定义中对目标字段显式加
templet:{ field: 'idCard', title: '身份证号', templet: function(d) { return d.idCard ? d.idCard + '\t' : ''; } } - 如果字段可能为
null或undefined,必须判空,否则 JS 报错:Cannot read property 'length' of null - 不要用
parseInt/parseFloat再转一次——那又掉回浮点陷阱里了 - 避免在
templet中拼接空格、换行、逗号,否则 CSV 解析会错乱
如果要用 exportFile 全局处理,改哪?
仅建议项目已稳定、升级频率低、且多个表都需统一处理时采用。修改点在 layui/lay/modules/table.js 中 exportFile = function 的主体逻辑内,关键替换位置是遍历单元格值的那段:
- 找到原生拼接
vals.push('"' + (item2 || '') + '"');的地方 - 替换成带正则判断的逻辑:
var val = item2 || ''; if (/^\d{15,}$/.test(val)) { vals.push('"' + val + '\t"'); } else { vals.push('"' + val + '"'); } - 注意:新版 Layui(如 2.9+)导出路径已调整,老教程 patch 位置可能失效;IE 下走
navigator.msSaveBlob,非 IE 走data:URL,两处都要覆盖
真正容易被忽略的是:导出内容本身是完好的(用记事本打开可见完整数字),问题只出在 Excel 的自动类型识别上。所以所有方案本质都是「提前声明类型」,而不是「修复数据」。加 \t 是目前唯一既符合 CSV 规范、又不增加额外依赖、还能跨 Excel 版本稳定的声明方式。











