js xlsx

作者: xueyueshuai | 来源:发表于2023-10-12 14:35 被阅读0次
    <template>
      <div>
        <fieldset style="padding: 20px;margin:20px;">
          <legend>读</legend>
    
          <input type="file" ref="fileInput"/>
          <button @click="onRead">onRead</button>
        </fieldset>
    
        <fieldset style="padding: 20px;margin:20px;">
          <legend>写</legend>
          <button @click="onWrite">onWrite</button>
        </fieldset>
      </div>
    </template>
    
    <script>
    import * as XLSX from 'xlsx'
    
    export default {
      data() {
        return {
          file: null,
          wb: null,
          xlsxData: [],
        }
      },
      methods: {
        onRead() {
          if (this.$refs['fileInput'].files.length === 0) {
            alert('请选择文件')
            return false
          }
          let file = this.$refs['fileInput'].files[0] // 使用传统的input方法需要加上这一步
    
          // 文件格式是否符合
          const fileType = file.name.substring(file.name.lastIndexOf(".") + 1)
          if (!['xlsx', 'xlc', 'xlm', 'xls', 'xlt', 'xlw', 'csv'].includes(fileType)) {
            alert('格式错误!请重新选择')
            return false
          }
    
          this.fileExchange(file).then(res => {
            console.log(res)
          })
    
        },
    
        fileExchange(file) {
          return new Promise(function (resolve, reject) {
            const reader = new FileReader()
    
            reader.onload = function (e) {
              const data = e.target.result
              this.wb = XLSX.read(data, {
                type: 'binary'
              })
              const result = []
              this.wb.SheetNames.forEach((sheetName) => {
                result.push({
                  sheetName: sheetName,
                  sheet: XLSX.utils.sheet_to_json(this.wb.Sheets[sheetName])
                })
              })
              resolve(result)
            }
    
            reader.readAsBinaryString(file) // 传统input方法
          })
        }
        ,
    
    
        onWrite() {
          // 将workbook装化成blob对象
          function workbook2blob(workbook) {
            // 生成excel的配置项
            let wopts = {
              // 要生成的文件类型
              bookType: "xlsx",
              // // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
              bookSST: false,
              type: "binary"
            };
            let wbout = XLSX.write(workbook, wopts);
    
            // 将字符串转ArrayBuffer
            function s2ab(s) {
              let buf = new ArrayBuffer(s.length);
              let view = new Uint8Array(buf);
              for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
              return buf;
            }
    
            return new Blob([s2ab(wbout)], {
              type: "application/octet-stream"
            });
          }
    
          // 将blob对象创建bloburl,然后用a标签实现弹出下载框
          function openDownloadDialog(blob, fileName) {
            if (typeof blob == "object" && blob instanceof Blob) {
              blob = URL.createObjectURL(blob); // 创建blob地址
            }
            let aLink = document.createElement("a");
            aLink.href = blob;
            // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,有时候 file:///模式下不会生效
            aLink.download = fileName || "";
            let 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);
          }
    
    
          const data1 = [{
            id: '1',
            name: '张三丰',
            phone: '16834567890',
          }]
          const sheetData1 = data1.map(item => ({
            'ID': item.id,
            '收件人': item.name,
            '手机号': item.phone,
          }));
          // 支持多 sheet
          // const sheetData2 = data2.map(item => ({
          //   // 在这里设置表头和对应项的值
          // }));
          // const sheetData3 = data3.map(item => ({
          //   // 在这里设置表头和对应项的值
          // }));
          // ...
    
          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);
          // 导出最后的总表
          openDownloadDialog(workbookBlob, '收件人列表.xlsx');
        }
    
      },
    }
    </script>
    <style lang="scss" scoped>
    
    </style>
    
    

    相关文章

      网友评论

          本文标题:js xlsx

          本文链接:https://www.haomeiwen.com/subject/cfcobdtx.html