如何在Ajax调用中获取yyyyMMddhhmmss格式日期拼接Excel导出文件名
实现带指定格式日期后缀的Excel导出文件名
问题原因
现有代码无法正常生成文件名的核心问题有两个:
- 直接调用的全局
date()方法不存在,JavaScript原生没有这个全局函数 - 原生
Date对象没有内置format()格式化方法,直接调用会抛出类型错误
修复方案
方案1:无依赖原生JS实现(无需引入额外库)
通过原生方法补零格式化日期字段,拼接成符合要求的文件名,完整可运行代码如下:
$.ajax({ url: kendo.format('@(Server.UrlDecode(Url.Action("myExcel", "NewOrder", new { orderKeys = "{0}" })))', ids.join()), method: 'POST', xhrFields: { responseType: 'blob' }, success: function (data) { // 生成yyyyMMddHHmmss格式的当前时间字符串(24小时制,避免上下午文件名重名) const getFormatDateStr = () => { const now = new Date(); const padZero = (num) => num.toString().padStart(2, '0'); return [ now.getFullYear(), padZero(now.getMonth() + 1), // 月份默认从0开始计数,需要+1 padZero(now.getDate()), padZero(now.getHours()), padZero(now.getMinutes()), padZero(now.getSeconds()) ].join(''); }; var a = document.createElement('a'); var url = window.URL.createObjectURL(data); a.href = url; a.download = `myOrder${getFormatDateStr()}.xlsx`; document.body.append(a); a.click(); a.remove(); window.URL.revokeObjectURL(url); } });
注意:如果严格需要12小时制的小时格式,把
padZero(now.getHours())替换为padZero(now.getHours() % 12 || 12)即可,业务导出场景推荐使用24小时制,避免下午时段导出的文件小时数和上午重复。
方案2:复用页面已引入的Kendo UI能力
现有代码已经在使用kendo.format做字符串拼接,Kendo本身内置了日期格式化能力,不需要额外编写工具函数,仅需修改download属性的赋值逻辑即可:
success: function (data) { var a = document.createElement('a'); var url = window.URL.createObjectURL(data); a.href = url; // kendo格式化规则中HH代表24小时制,hh代表12小时制,按需替换即可 a.download = 'myOrder' + kendo.format('{0:yyyyMMddHHmmss}', new Date()) + '.xlsx'; document.body.append(a); a.click(); a.remove(); window.URL.revokeObjectURL(url); }
两种方案最终生成的文件名,都和示例myOrder20220704073533.xlsx的格式完全匹配。
内容的提问来源于stack exchange,提问作者user1531040
相关产品推荐
相关产品推荐

