layui exportfile 导出 csv 不显示货币符号,因其仅提取原始数据而非渲染后内容;需手动格式化数据再导出,或改用 xlsx 库生成真正 excel 文件以支持格式。

导出Excel时数字列不显示货币符号,因为Layui exportFile 不处理格式化
Layui 的 table.exportFile 本质是把表格 DOM 或数据原样转成 CSV(不是真正的 Excel),它完全忽略单元格里渲染的 ¥12,345.00 这类格式化内容,只取 td 的纯文本或 data-field 对应的原始值。所以即使你在 templet 里写了 ¥{{d.price}},导出结果还是裸数字 12345。
实操建议:
- 导出前手动预处理数据:用
table.getData('id')拿到原始数据,对目标字段做格式化(如加 ¥、千分位),再传给exportFile - 别依赖
templet渲染结果——导出走的是数据流,不是视图流 - 如果用的是服务端导出(
url模式),那格式化必须在后端做,前端改不了
用 exportFile + 格式化数据实现货币符号导出
核心是绕过默认导出逻辑,自己构造带符号的数据数组,再调用 exportFile。注意:必须用 data 参数传入格式化后的数组,不能只靠 id。
示例(假设价格列字段名是 price):
const data = table.getData('demo'); // 原始数据
const formatted = data.map(item => ({
...item,
price: `¥${Number(item.price).toLocaleString('zh-CN', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
})}`
}));
table.exportFile('demo', formatted, 'csv');
常见错误现象:
- 直接传
data但没改字段名 → 导出列头还是price,但值已变成字符串¥12,345.00,Excel 会当文本处理(左对齐、无法求和) - 用
toLocaleString但没设minimumFractionDigits→100变成¥100,而不是¥100.00 - 字段名含空格或特殊字符 → 导出 CSV 时可能被截断或错列,建议保持英文下划线命名
导出为真正的 Excel(.xlsx)才能保留格式和样式
exportFile 默认只支持 CSV,而 CSV 本身不支持单元格格式(比如货币、颜色、边框)。想让 Excel 打开就显示带 ¥ 符号+右对齐+千分位,必须生成 .xlsx 文件。
可行路径:
- 前端用
xlsx库(如 SheetJS):把格式化后的数据写入Workbook,设置cell.z(数字格式码)为_"¥"_ * #,##0.00_ ;_"¥"_ * -#,##0.00_ ;_"¥"_ * "-"??_ ;_@_ - 后端生成:把原始数据发给接口,由服务端用 POI / EPPlus / openpyxl 渲染,更稳定、可控
- 别用
exportFile走捷径——它连小数点都保不住,更别说格式
性能影响:前端生成大文件(>1w 行)容易卡死;服务端导出更稳,但需额外接口和权限控制。
字段类型混淆导致 Excel 自动转义或截断
哪怕你加了 ¥,Excel 仍可能把 ¥12,345.00 当文本,也可能把纯数字 12345.67 当数值但按科学计数法显示(尤其超 15 位时)。根本原因是 CSV 没有类型定义,全靠 Excel 猜。
缓解办法:
- 对货币列,在字符串前加制表符
\t或单引号'强制当文本:'¥12,345.00 - 导出为
.xlsx时,用 SheetJS 显式设置cell.t = 's'(字符串类型) - 避免字段值以
-、+、=开头,否则 Excel 会误判为公式 → 加单引号前缀
最容易被忽略的一点:Layui 导出的 CSV 默认编码是 UTF-8,但 Windows Excel 打开时可能用 ANSI 解码,导致 ¥ 显示为乱码。解决方法是导出前加 BOM 头,或让用户用 WPS / Excel 2016+「从文本导入」并选 UTF-8。











