导出Excel时长数字变科学计数法或截断,主因是Excel将纯数字字符串误判为数值:CSV格式需字段前加英文单引号强制文本识别;xlsx格式须用SheetJS手动设单元格格式z="@",并确保导出前数据保持字符串类型,避免JSON解析或数字转换污染。
导出 Excel 时长数字变科学计数法或截断?不是 Layui 的锅
调用 table.exportfile() 导出后,身份证号、订单号、手机号(如 "13800138000")在 excel 里变成 1.38e+10 或末尾变 0,是因为 layui 默认把纯数字字符串当数值解析——而 excel 自动应用数字格式,导致精度丢失。这不是 bug,是 csv 文本被 excel “好心”识别的结果。
CSV 导出:加单引号强制文本,最轻量有效
如果你导出格式是 'csv'(推荐首选),只需在字段值前加英文单引号 ',Excel 打开时会原样保留为文本,不触发任何解析:
- 对目标字段(如
id_card、order_no)做预处理:item.id_card ? "'" + item.id_card : "" - 注意:单引号本身不会显示在 Excel 单元格内,仅作为“文本标记”,不影响内容可读性
- 不要用双引号包裹再加单引号(如
"'13800138000'"),这会导致 Excel 显示开头的' - 若字段已是数字类型(如后端返回
13800138000),先转字符串:"'" + String(item.id_card)
xlsx 导出:必须用 SheetJS 控制单元格类型
如果坚持用 table.exportFile(..., 'xlsx'),Layui 底层虽调用 SheetJS,但封装层屏蔽了样式控制。你无法通过传参让某列变成文本——必须绕过 exportFile,手动生成工作表:
本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd、xlwt和xlutils模块。另外还演示了如何通过Tcl tcom包对excel操作。感兴趣的朋友可以过来看看
- 引入
xlsx.full.min.js(务必 full 版,轻量版不支持样式) - 构造数据时,对长数字字段显式设为字符串:
String(item.order_no),避免parseInt或Number转换 - 关键一步:给对应列所有单元格设置
cell.z = "@"(Excel 文本格式代码),例如:ws[`${colLetter}${rowIndex}`].z = "@"; - 若列含混合类型(部分为空、部分为数字字符串),统一转字符串 +
z = "@"是唯一可靠方式
最容易被忽略的坑:字段类型在导出前就已“污染”
后端返回的 "00123" 到前端若被 JSON.parse 后又 parseFloat 过一次,就会变成 123,再加单引号也救不回开头的零。真正安全的做法是:
- 导出前检查原始字段类型:
typeof item.id_card === "string" && /^\d+$/.test(item.id_card) - 不信任任何中间转换,从
table.cache['xxx']拿到的值,能直接用就直接用 - 如果表格用了
templet渲染(比如把1显示成"启用"),导出时别复用渲染逻辑,单独为文本格式字段写映射函数










