三 views/HomeView.vue

96 阅读1分钟
  <div class="home">
    <el-button type="success" @click="exportExcel">导出</el-button>
    <hr />
    <el-upload class="upload-demo" accept=".xlsx,.csv,.xls" action="" :show-file-list="true" :on-change="importExcel">
      <el-button size="small" type="primary">导入</el-button>
    </el-upload>
    <hr />
    <el-table :data="tableData" style="width: 100%" class="table">
      <el-table-column prop="id" label="日期" width="180">
      </el-table-column>
      <el-table-column prop="name" label="姓名" width="180">
      </el-table-column>
      <el-table-column prop="age" label="年龄" width="180">
      </el-table-column>
      <el-table-column prop="address" label="地址">
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
import * as XLSX from 'xlsx'
import FileSaver from 'file-saver'
export default {
  name: 'HomeView',
  components: {
  },
  data() {
    return {
      tableData: []
    }
  },
  methods: {
    //导入表格
    // importExcel(file) {
    //   let that = this
    //   let { raw } = file
    //   let render = new FileReader()
    //   render.readAsArrayBuffer(raw)
    //   render.onload = function () { 
    //     const buffer = render.result
    //     const bytes = new Uint8Array(buffer)
    //     const length = bytes.byteLength
    //     let binary = ''
    //     for (let i = 0; i < length; i++) {
    //       binary += String.fromCharCode(bytes[i])
    //     }
    //     const bg = XLSX.read(binary, { type: 'binary' })
    //     const outData = XLSX.utils.sheet_to_json(bg.Sheets[bg.SheetNames[0]])
    //     console.log(outData, '数据')
    //     let outarr = [...outData]
    //     let arr = []
    //     outarr.map(v => {
    //       let obj = {}
    //       obj.id = v.序号
    //       obj.name = v.姓名
    //       obj.age = v.年龄
    //       obj.address = v.地址
    //       arr.push(obj)
    //     })
    //     that.tableData = arr
    //   }
    // },
    importExcel(file) {
      let that = this
      let { raw } = file
      let render = new FileReader()
      render.readAsArrayBuffer(raw)
      render.onload = function () {
        const buffer = render.result
        const bytes = new Uint8Array(buffer)
        const length = bytes.byteLength
        let binary = ''
        //每次处理的行数是多少
        const chunkSize = 50
        for (let i = 0; i < length; i++) {
          binary += String.fromCharCode(bytes[i])
        }
        const bg = XLSX.read(binary, { type: 'binary' })
        const outData = XLSX.utils.sheet_to_json(bg.Sheets[bg.SheetNames[0]])
        //创建空数组  用来存储数据
        let arr = []
        //定义一个初始的下标0
        let rowIndex = 0
        //处理数据的函数
        function processChunk() {
          //确定结束的索引
          const endRow = Math.min(rowIndex + chunkSize, outData.length)
          //从数组里提取数据
          const chunkData = outData.slice(rowIndex, endRow)
          //遍历每一行数据
          chunkData.map(v => {
            let obj = {}
            obj.id = v.序号
            obj.name = v.姓名
            obj.age = v.年龄
            obj.address = v.地址
            arr.push(obj)
          })
          //更新索引
          rowIndex += chunkSize
          if( rowIndex < outData.length ){
            setTimeout(processChunk,0)
            console.log('处理数据')
          }else{
            that.tableData = arr
          }
        }
        processChunk()
      }
    },
    //导出
    exportExcel() {
      //获取表格的DOM元素
      let table = document.querySelector('.table')
      //定义导出的参数,raw:true表示保留原始数据的格式
      let xlsxParam = { raw: true }
      //把表格中的数据导出到excel文件
      const tab = XLSX.utils.table_to_book(table, xlsxParam)
      console.log(tab, '???')
      //把数据转为二进制字符串
      let tabout = XLSX.write(tab, {
        bookSST: true,
        bookType: 'xlsx',
        type: 'array'
      })
      // console.log( tabout,'转后的数据' )
      try {
        //使用filesaver把导出的数据保存成文件
        FileSaver.saveAs(
          //创建Blob对象,并保存为文件
          new Blob([tabout], { type: 'application/octet-stream;chartset=UTF-8' }),
          //指定文件名称
          Math.random() + '.xlsx'
        )
      } catch (e) {
        console.log('导出失败', e)
      }
      return tabout
    }
  }
}
</script>