js-excel-read-func.js

2024-06-23  本文已影响0人  xueyueshuai

简单实用

methods: {
    onTest(){
      this.readExcel(this.$refs.fileInput.files[0]).then(res => {
        console.log(res)
      })
    },
    readExcel(file) {
      return new Promise((resolve, reject) => {
        const reader = new FileReader();

        reader.onload = function (e) {
          let workBook = XLSX.read(e.target.result, {
            type: 'binary'
          })

          let sheetArr = []
          workBook.SheetNames.forEach((sheetName) => {
            const sheet = workBook.Sheets[sheetName]
            sheetArr.push({
              sheetName: sheetName,
              sheetRows: XLSX.utils.sheet_to_json(sheet),
            })
          })
          resolve(sheetArr)
        };

        reader.readAsArrayBuffer(file)
      })
    }
  }

使用

import * as XLSX from 'xlsx'

export function readExcel(file) {
  return new Promise(function (resolve, reject) {
    if (!file) {
      reject('file不能为控');
      return;
    }
    const getCellValue = (sheet, row, column) => {
      let cell = sheet[XLSX.utils.encode_cell({r: row, c: column})];
      let value = cell ? cell.v : '';
      return value
    }
    const rangeArr = (start, end) => {
      return Array(end - start).fill().map((_, index) => index + start)
    }

    const getSheetSize = (sheet) => {
      const range = XLSX.utils.decode_range(sheet['!ref']);
      const rowCount = range.e.r - range.s.r + 1; // 行数
      const columnCount = range.e.c - range.s.c + 1;// 列数
      return {rowCount, columnCount}
    }

    const getRows = (sheet) => {
      let {rowCount, columnCount} = getSheetSize(sheet)
      let rows = [];
      rangeArr(0, rowCount).forEach(rowIndex => {
        let row = []
        rangeArr(0, columnCount).forEach(columnIndex => {
          row.push(getCellValue(sheet, rowIndex, columnIndex))
        })
        rows.push(row)
      })
      return rows
    }


    const reader = new FileReader()
    reader.onload = function (e) {
      let workBook = XLSX.read(e.target.result, {
        type: 'binary'
      })

      let sheetArr = []
      workBook.SheetNames.forEach((sheetName) => {
        const sheet = workBook.Sheets[sheetName]
        sheetArr.push({
          sheetName: sheetName,
          sheetRows: XLSX.utils.sheet_to_json(workBook.Sheets[sheetName]),
          rows: getRows(sheet),
        })
      })
      resolve(sheetArr)
    }
    reader.readAsArrayBuffer(file) // 传统input方法
  })
}
<template>
  <div>
    <input type="file" ref="fileInput"/>
    <el-button @click="getData">getData</el-button>
  </div>
</template>

<script>

import {readExcel} from "@/tool/utils";

export default {
  methods: {
    getData() {
      let file = this.$refs['fileInput'].files?.[0];
      if (file) {
        readExcel(file).then(res => {
          console.log(res)
        })
      }
    }
  }
}
</script>
上一篇 下一篇

猜你喜欢

热点阅读