前端如何将接口传来的列表数据(数组)直接下载成csv文件

前言:最近遇到一个需求,需要实现一个下载表格数据的操作,一般来说是前端请求后端的下载接口,将文件流下载下来,但是因为这个项目任务时间比较紧,后端没时间做下载接口,所以暂时由前端直接调列表的git接口,把后端传给我们的数组直接下载成csv文件,情况如下图:

实现步骤:

1、先在util文件夹下新增一个js文件:Export2Csv.js,放转csv的插件代码:

javascript 复制代码
function processRow(row) {
  let finalVal = ''
  for (let j = 0; j < row.length; j++) {
    let innerValue = row[j] === null ? '' : row[j].toString()
    if (row[j] instanceof Date) {
      innerValue = row[j].toLocaleString()
    }

    let result = innerValue.replace(/"/g, '""')
    if (result.search(/("|,|\n)/g) >= 0) { result = '"' + result + '"' }
    if (j > 0) { finalVal += ',' }
    finalVal += result
  }
  return finalVal + '\n'
}

export function exportToCsv(filename, rows) {
  let csvFile = ''
  for (let i = 0; i < rows.length; i++) {
    csvFile += processRow(rows[i])
  }

  // 添加\ufeff头,标识excel可以打开UTF8编码的文件
  const blob = new Blob(['\ufeff', csvFile], { type: 'text/csv;charset=utf-8;' })
  if (navigator.msSaveBlob) { // IE 10+
    navigator.msSaveBlob(blob, filename)
  } else {
    const link = document.createElement('a')
    if (link.download !== undefined) { // feature detection
      // Browsers that support HTML5 download attribute
      const url = URL.createObjectURL(blob)
      link.setAttribute('href', url)
      link.setAttribute('download', filename)
      link.style.visibility = 'hidden'
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
    }
  }
}

export function exportDictArray2csv(data, filename) {
  const keys = Object.keys(data[0])

  const rows = []

  // writer header
  rows.push(keys)

  data.forEach(dict => {
    const row = []
    keys.forEach(key => {
      row.push(dict[key])
    })
    rows.push(row)
  })

  exportToCsv(filename, rows)
}

export default exportDictArray2csv

2、在需要用的页面引入

javascript 复制代码
import { exportDictArray2csv } from "@/utils/Export2Csv.js";

3、使用

javascript 复制代码
const filename = `data.csv`;
exportDictArray2csv(tableData.value, filename);

filename就是下载的文件名,可以自己自定义

tableData.value就是接口传给我们的数据

tableData.value的数据格式:

{aaa:1,bbb:2},{aaa:3,bbb:4}

下载下来的csv文件:

|-----|-----|
| aaa | bbb |
| 1 | 2 |
| 3 | 4 |

相关推荐
淑子啦3 分钟前
TS 和组件绑定深耕(泛型表格)
前端·javascript·react.js
道清茗1 小时前
【shell编程知识点汇总】第九章 HTML 清洗、多行合并与条件替换
前端·html
噢,我明白了2 小时前
表单的完整 CRUD 练习【极简个人记账本】(含前端后端链接mySQL)
java·前端·数据库·mysql
幽络源小助理2 小时前
MacCMSPro版视频影视系统源码_全开源高可用视频平台解决方案
前端·php·php源码
不会敲代码19 小时前
手写 Zustand:三十分钟带你搞懂状态管理库的核心原理
前端·javascript·源码
神奇的程序员9 小时前
重构了自己5年前写的截图插件
前端·javascript·架构
UXbot10 小时前
一人独立交付 UI + 前端:AI 驱动 UI 设计工具的五大功能模块深度评测
前端·低代码·ui·设计模式·交互
kobesdu10 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
诚实可靠王大锤10 小时前
React Native 输入框与按钮焦点冲突解决方案(rn版本0.70.3)
前端·javascript·react native·react.js
kyriewen11 小时前
测试妹子让我写单测,我偷偷用AI一天干完一周的活
前端·chatgpt·cursor