JS导出CSV大文件小技巧

实现思路

  1. 使用json2csv将后台json数据转化为csv格式数据

  2. 创建一个a标签,设置href和download属性

  3. 触发a标签的点击事件实现下载

  4. 移除a标签

相关代码:

import json2csv from 'json2csv'

exportCsv () {
    try {
    let columns = this.$refs.table.$children.filter(t => t.prop != null)
    const fields = columns.map(t => t.prop)
    const fieldNames = columns.map(t => t.label)

    var link = document.createElement("a");
    var result = json2csv({ data: data, fields: fields, fieldNames: fieldNames });
    var csvContent = "data:text/csv;charset=GBK,\uFEFF" + result;
    var encodedUri = encodeURI(csvContent);
    link.setAttribute("href", encodedUri);
    link.setAttribute("download", "my_data.csv");
    document.body.appendChild(link); // Required for FF
    link.click(); // This will download the data file named "my_data.csv".
    document.body.removeChild(link); // Required for FF
    } catch (err) {
    // Errors are thrown for bad options, or if the data is empty and no fields are provided.
    // Be sure to provide fields if it is possible that your data array will be empty.
    console.error(err);
    }
}

调用以上方法就实现了csv文件的导出,但是笔者在开发时遇到了一个小坑,当数据量较大时以上导出代码会失效,并且catch不到err,Chrome执行下载不成功:

这是因为url有最大长度限制,encodeURI是会把字符串转化为url,超出限制长度部分数据丢失导致下载失败,为此我采用创建Blob(二进制大对象)的方式来存放缓存数据,具体代码如下:

var blob = new Blob(["\ufeff" + result], {type: 'text/csv'}); //解决大文件下载失败
link.setAttribute("href", URL.createObjectURL(blob));

Chrome 执行下载成功:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,691评论 7 249
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,327评论 4 61
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,798评论 19 139
  • 坐在工作室里,呆呆的望着窗外,虽然看了几天的书了,可是脑子里面一片空白!这里虽然暖气如春,可是依旧温暖不了...
    杨小凸阅读 1,241评论 0 0
  • 周郁鸳 一个小镇街道集市上半年开了一家新饭店,属夫妻店,两口子是中年人,平时的生意...
    周郁鸳阅读 3,226评论 4 2