Skip to content

两种方式实现表格的下载

  • csv:按一定格式排列文本输出,可用excel查看
  • xlsx:常规excel表格,可实现多表

csv

按以下规则排列文本:

  1. 在文本开头标识格式:
javascript
  // 乱码问题
  // 在文件最前面加入BOM(Byte order)。如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
  const table = '\uFEFF'
  1. 行与行之间使用\n分割,单元格与单元格之间使用,分割
  2. 若单元格内容中包含,,则使用双引号将内容包裹起来,若内容中还有双引号则进行转义:text.replace(/"/g, '""')
javascript
  if (value.includes(',')) {
    if (value.includes('"')) {
      value = value.replace(/"/g, '""');
    }
    value = `"${value}"`;
  }

操作步骤:

javascript

// 1. 生成表格文本:
const header = ['name','age'].map(cellFormat)
const data = ['jielun',20].map(cellFormat)
let table = `\uFEFF`
table+=header.join(',')
table+='\n'
table+=data.join(',')

// 2. 触发下载
downloadBlobData(table,'table.csv','text/csv')

xlsx

使用xlsx模块实现:

  1. 安装依赖
bash
npm install xlsx --save
  1. 生成 sheet
javascript
// 引入
import {utils,write} from "xlsx" 

// 源数据
const data = [
  {
    id:1,
    name:'hon',
    phone:138,
    time:'today'
  },
  {
    id:2,
    name:'don',
    phone:137,
    time:'yestoday'
  }
]

// sheet
const sheetData = data.map(item=>{
  return {
    ID:item.id,
    "名称":item.name,
    "手机":item.phone,
    "时间":item.time
  }
})
const sheet = utils.json_to_sheet(sheetData);

// 生成一个工作簿
const wb = utils.book_new(); 

// 将 sheet 添加到工作簿
utils.book_append_sheet(wb, sheet, '名单信息');

// 将工作簿转化为二进制
const workbookBlob = workbook2blob(wb);

// 导出
downloadBlobData(workbookBlob, '收件人列表.xlsx', "application/octet-stream");

相关方法:

javascript
// 将workbook装化成blob对象
function workbook2blob(workbook) {
  // 生成excel的配置项
  var wopts = {
    // 要生成的文件类型
    bookType: "xlsx",
    // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
    bookSST: false,
    type: "binary"
  };
  
  // 将字符串转ArrayBuffer
  var wbout = write(workbook, wopts);
  var buf = new ArrayBuffer(wbout.length);
  var view = new Uint8Array(buf);
  for (var i = 0; i != wbout.length; ++i) view[i] = wbout.charCodeAt(i) & 0xff;

  return buf;
}


// 下载数据
const downloadBlobData = function(data, fileName, contentType) {
    var blob = new Blob([data], { type: contentType })
    var downloadElement = document.createElement('a')
    var href = window.URL.createObjectURL(blob) // 创建下载的链接
    downloadElement.href = href
    downloadElement.download = fileName // 下载后文件名
    document.body.appendChild(downloadElement)
    downloadElement.click() // 点击下载
    document.body.removeChild(downloadElement) // 下载完成移除元素
    window.URL.revokeObjectURL(href) // 释放掉blob对象
}

// 单元格格式化
const cellFormat = cell => {
  let formatCell = cell
  if (typeof cell === "string" && cell.includes(',')) {
    if (cell.includes('"')) {
      formatCell = cell.replace(/"/g, '""');
    }
    formatCell = `"${cell}"`;
  }
  return formatCell
}