白话大前端 - 前端操作 execl

184 阅读1分钟

前端操作 execl 需要用到 xlsx 库

通过npm安装

npm install xlsx

或者直接引入

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>

直接上例子:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>xlsx</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
</head>

<body>
  <button onclick="handleDownload()">点击下载 execl</button>
</body>
<script>
  const sheetData1 = [{
    '姓名': '',
  }];
  // 支持多 sheet
  // const sheetData2 = [{
  //   '年龄': '',
  // }];
  // const sheetData3 = [{
  //   '性别': ''
  // }];
  // ...

  const sheet1 = XLSX.utils.json_to_sheet(sheetData1);
  // 支持多 sheet
  // const sheet2 = XLSX.utils.json_to_sheet(sheetData2);
  // const sheet3 = XLSX.utils.json_to_sheet(sheetData3);
  const wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, sheet1, '收件人列表');
  // 支持多 sheet
  // XLSX.utils.book_append_sheet(wb, sheet2, '表格 sheet2');
  // XLSX.utils.book_append_sheet(wb, sheet2, '表格 sheet2');
  const workbookBlob = workbook2blob(wb);



  // 将workbook装化成blob对象
  function workbook2blob(workbook) {
    // 生成excel的配置项
    var wopts = {
      // 要生成的文件类型
      bookType: 'xlsx',
      // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
      bookSST: false,
      // 二进制类型
      type: 'binary'
    }
    var wbout = XLSX.write(workbook, wopts)
    var blob = new Blob([s2ab(wbout)], {
      type: 'application/octet-stream'
    })
    return blob
  }

  // 将字符串转ArrayBuffer
  function s2ab(s) {
    var buf = new ArrayBuffer(s.length)
    var view = new Uint8Array(buf)
    for (var i = 0; i != s.length; ++i) {
      view[i] = s.charCodeAt(i) & 0xff
    }
    return buf
  }

  // 将blob对象创建bloburl,然后用a标签实现弹出下载框
  function openDownloadDialog(blob, fileName) {
    if (typeof blob == 'object' && blob instanceof Blob) {
      blob = URL.createObjectURL(blob) // 创建blob地址
    }
    var aLink = document.createElement('a')
    aLink.href = blob
    // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,有时候 file:///模式下不会生效
    aLink.download = fileName || ''
    var event
    if (window.MouseEvent) event = new MouseEvent('click')
    //   移动端
    else {
      event = document.createEvent('MouseEvents')
      event.initMouseEvent(
        'click',
        true,
        false,
        window,
        0,
        0,
        0,
        0,
        0,
        false,
        false,
        false,
        false,
        0,
        null
      )
    }
    aLink.dispatchEvent(event)
    URL.revokeObjectURL(blob)
  }

  // 下载
  function handleDownload() {
    // 导出最后的总表
    openDownloadDialog(workbookBlob, '收件人列表.xlsx');
  }
</script>

</html>

页面展示如下:

image.png

文档地址:github.com/SheetJS/she…