纯前端实现简单表格数据下载功能

280 阅读2分钟

前端下载通常分为两种情形:

1、后端直接给一个文件地址,通过浏览器打开就可以下载;

2、另外一种则需要发送请求,后端返回二进制流数据,前端解析流数据,生成URL,实现下载。

一、原生写法(最简单的办法)

原理:通过a标签的download形式去下载

举栗

const exportExcel = (id: string, name: string) => {
      const exportFileContent = document.getElementById(id).outerHTML;
      let blob = new Blob([exportFileContent], { type: 'text/plain;charset=utf-8' }); //使用Blob
      blob = new Blob([String.fromCharCode(0xfeff), blob], { type: blob.type }); //解决中文乱码问题

      const link = window.URL.createObjectURL(blob); //设置链接
      const a = document.createElement('a'); //创建a标签
      a.download = name; //设置被下载的超链接目标(文件名)
      a.href = link; //设置a标签的链接
      document.body.appendChild(a); //a标签添加到页面
      a.click(); //设置a标签触发单击事件
      document.body.removeChild(a);
};

// jsx
<Button
  type="link"
  onClick={() => exportExcel('download_table', '分布分析详细数据报表.xlsx')}>
</Button>

补充说明

  • Blob 对象表示一个不可变、原始数据的类文件对象。

图片.png

(1)区别

innerHTML: 从对象的起始位置到终止位置的全部内容, 不包括HTML标签。

outerHTML: 除了包含innerHTML的全部内容外, 还包含对象标签本身。

(2)例子

<div id="test">
    <span style="color:red">test1</span> test2
</div>

innerHTML的值:<span style="color:red">test1</span> test2

outerHTML的值:<div id="test"><span style="color:red">test1</span> test2</div>

二、xlsx下载

xlsx:引用方式的坑

tsx文件的引入方式踩坑(原因可能是解析tsx解析出来的暴露方式有点问题,所以调用不到XLSX下面的方法)

import XLSX from 'xlsx';

XLSX.utils // 报错undefined

// 正确的方式
import * as XLSX from 'xlsx';

// 或者
const XLSX = require('xlsx');

缺点:不太适用于复杂的表格数据,比如合并单元格之类的表格

Last but not least,推荐阅读:

导出表格与设置表头相关

前端如何实现下载功能