前端如何将接口传来的列表数据(数组)直接下载成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 |

相关推荐
IT_陈寒16 分钟前
JavaScript开发者必知的5个性能杀手,你踩了几个坑?
前端·人工智能·后端
跟着珅聪学java20 分钟前
Electron 精美菜单设计
运维·前端·数据库
日光倾20 分钟前
【Vue.js 入门笔记】闭包和对象引用
前端·vue.js·笔记
一只程序熊27 分钟前
UniappX 未找到 “video“ 组件,已自动当做 “view“ 组件处理。请确保代码正确,或重新生成自定义基座后再试。
前端
林小帅28 分钟前
【笔记】xxx 技术分享文档模板
前端
雾岛心情34 分钟前
【HTML&CSS】HTML为文字添加格式和内容
前端·css·html
心.c42 分钟前
如何在项目中减少 XSS 攻击
前端·xss
Rsun045511 小时前
Vue相关面试题
前端·javascript·vue.js
TON_G-T1 小时前
前端包管理器(npm、yarn、pnpm)
前端
卤炖阑尾炎1 小时前
Web 技术基础与 Nginx 网站环境部署全解析
前端·nginx·microsoft