vue中使用xlsx导入excel文件并解析json数据

  • 安装xlsx插件

    1
    2
    3
    4
    5
    // 安装插件
    npm install xlsx --save

    // 在vue中导入XLSX
    import XLSX from 'xlsx'
  • 这里使用 element-ui 的上传组件
    关闭默认上传的操作,在on-change事件上绑定importExcel上传函数
    如果用传统的input上传组件也可以<input type="file" @change="importExcel($event.target)" />

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <el-upload
    ref="upload"
    action="/"
    :show-file-list="false"
    :on-change="importExcel"
    :auto-upload="false">
    <el-button
    slot="trigger"
    icon="el-icon-upload"
    size="small"
    type="primary">
    上传文件
    </el-button>
    </el-upload>
  • 上传文件的方法importExcel

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    importExcel(file) {
    // let file = file.files[0] // 使用传统的input方法需要加上这一步
    const types = file.name.split('.')[1]
    const fileType = ['xlsx', 'xlc', 'xlm', 'xls', 'xlt', 'xlw', 'csv'].some(item => item === types)
    if (!fileType) {
    alert('格式错误!请重新选择')
    return
    }
    this.file2Xce(file).then(tabJson => {
    if (tabJson && tabJson.length > 0) {
    this.xlsxJson = tabJson
    // xlsxJson就是解析出来的json数据,数据格式如下
    // [
    // {
    // sheetName: sheet1
    // sheet: sheetData
    // }
    // ]
    }
    })
    },
    file2Xce(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.raw)
    // reader.readAsBinaryString(file) // 传统input方法
    })
    }