原生JS使用Blob导出csv文件


偷来的 怕忘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
let sourceData = {

复制代码
head: [ '时间', '成交价格', '成交数量', '手续费', '成交金额', ],
data: [
{time: '2019-10-17 14:54:52', tradePrice: '30.0022.001.32 TWD', fee:'0 TWD', tradeAmount: '660.00',},
{time: '2019-10-17 14:54:36', tradePrice: '30.0089.005.34 TWD', fee:'0 TWD', tradeAmount: '2,670.00',},
{time: '2019-10-17 14:54:07', tradePrice: '21.00500.0021 TWD', fee:'0 TWD', tradeAmount: '10,500.00',},
]
}
// 格式化
const data = [sourceData.head.join(',')].concat(sourceData.data.map(item => {
return [
item.time,
`"${item.tradePrice}"`,
`"${item.fee}"`,
`"${item.tradeAmount}"`,
].join(',')
}))
// 创建Blob对象 传入一个合适的MIME类型
const blob = new Blob(['\ufeff' + data.join('\n')], {type: 'text/csv,charset=UTF-8'}); // 参考链接 https://developer.mozilla.org/zh-CN/docs/Web/API/Blob
// 使用 Blob 创建一个指向类型化数组的URL
const csvUrl = URL.createObjectURL(blob); // 参考链接 https://developer.mozilla.org/zh-CN/docs/Web/API/URL/createObjectURL
let link = document.createElement('a');
link.download = `details_${new Date().getTime()}.csv`; //文件名字
link.href = csvUrl;
// 触发下载
link.click();

1
2
3
4
genUrl(encoded, options) {
const dataBlob = new Blob([`\ufeff${encoded}`], { type: 'text/plain;charset=utf-8' });//返回的格式
return window.URL.createObjectURL(dataBlob);
},
1
2
3
4
5
6
7
8
9
10
11
downloadByPeople(){

this.$http.FileGet(this.pageParams).then(res => {
const url = this.genUrl(res.data.data.workhour_csv_data, {});//{}指的是表头,res.data.data.workhour_csv_data是后台返 回来的数据
const a = document.createElement('a');
a.href = url;
a.download = "工时统计文件.csv";
a.click();
window.URL.revokeObjectURL(url);
});
},


注意事项:

  1. 数据中存在 ‘,’ 逗号问题处理:将整个数据用双引号(英文格式)包裹起来,这样会显示成一个单元格。

  2. 拼接后的数据如何直接下载,不需要用户在操作:动态创建a标签,并调用点击事件

  3. 中文乱码解决方案:在数据前面加上字符串”\ufeff”即可