加\t是最轻量稳定的解法,excel识别到制表符会强制按文本处理,避免15位以上数字转为科学计数法;templet中需判空并拼接\t,导出时才生效。

直接在目标字段的 templet 函数末尾加 \t(制表符),是最轻量、最稳定、无需改源码或引入新库的解法。Excel 识别到该字符就会强制按文本处理,15位以上数字(如身份证、银行卡号、订单号)不再转成 1.23E+17。
为什么加 \t 就能生效?
Excel 解析 CSV 时,并不依赖双引号判断类型,而是根据内容“像不像数字”做自动转换。纯数字 ≥15 位时,它会强制用双精度浮点存储——此时原始字符已不可逆丢失。而 \t 是 Excel 明确认可的文本标记之一:只要字段值末尾含它,哪怕被双引号包裹,Excel 也会跳过数值解析逻辑,原样当文本读取。
-
'12345678901234567890'(单引号前置):部分 Excel 版本会显示单引号,影响阅读 -
"12345678901234567890"(纯双引号):Layui 默认就加了,但对长数字无效 -
"12345678901234567890\t"(双引号 +\t):稳定识别为文本,页面渲染也不可见
列定义中怎么写 templet?
必须在表格列配置里显式声明,不能靠后端返回格式化后的字符串,也不能只靠 CSS 或 display 隐藏——导出走的是原始数据流。
- 字段可能为
null或undefined,必须判空:templet: function(d) { return (d.idCard || '') + '\t'; } - 不要拼接空格、换行、逗号或中文符号,否则 CSV 解析会错乱
- 别用
parseInt/parseFloat再转一次,那又掉回浮点精度陷阱 - 如果字段是数字类型(非字符串),先
String(d.idCard)再拼\t,避免隐式转换出错
全局统一处理要改哪?
仅建议多个表共用、项目已稳定、且不想每列都写 templet 时采用。修改点在 layui/lay/modules/table.js 的 exportFile 函数内,关键是要覆盖两处导出路径:
- 非 IE 浏览器走
data:URL方式,找到vals.push('"' + (item2 || '') + '"');这行 - IE 走
navigator.msSaveBlob,同样位置也要改 - 替换为带正则判断的逻辑:
if (/^\d{15,}$/.test(val)) { vals.push('"' + val + '\t"'); } else { vals.push('"' + val + '"'); } - 注意新版 Layui(如 2.9+)导出路径有调整,老教程 patch 位置可能失效
真正容易被忽略的是:这个方案只对导出有效,不影响页面渲染;但如果你同时需要脱敏(比如导出 “110101********1234”),templet 不起作用——因为导出时仍从 table.cache 拿原始值,必须重写 parseTempData 才行。











