需求:前端需要增加一个导入按钮,导入既定的Excel模板数据, 后端接口请求方法:post 参数格式:Form Data
const param = {
name: 'zhangsan',
code: '001',
id: 'A001',
file: excelData
}
分析:既然是Excel的导入或者导出首先我们就要安装 excel 的插件 xlsx
- 首先全局安装xlsx插件
npm install xlsx --save
- 前端代码:我们还是使用 element-ui 的 el-upload 组件,不过这个组件过于复杂和详细,它考虑的场景比较多,但是我们要删繁就简,只获取我们需要的东西即可。
<el-upload
ref="upload"
action
accept=".xlsx, .xls"
:show-file-list='false'
:on-change="handleUpLoad"
:auto-upload="false">
<el-button slot="trigger" type="primary">导入Excel文件</el-button>
</el-upload>
import readFile from '@/utils/index'
async handleUpLoad (ev) {
let file = ev.raw
if (!file) return
const extension = file.name.substring(file.name.lastIndexOf('.') + 1)
const fileType = ['xlsx', 'xls'].some(item => item === extension)
if (!fileType) {
this.$message('格式错误!请选择后缀是.xlsx, .xls 的文件')
return
}
let data = await readFile.readFile(file)
this.importExcelData(data)
}
const readFile = file => {
return new Promise(resolve => {
let reader = new FileReader()
reader.readAsBinaryString(file)
reader.onload = ev => {
resolve(ev.target.result)
}
})
}
async importExcelData (importData) {
const param = {
name: '张三',
code: '123',
id: '111',
file: importData
}
let res = await api.importData(param)
if (res.data && res.data.code === 'T') {
this.$message('导入成功')
}
}
后续补充:以上为完整的调用后端接口导入Excel数据,二进制数据流是后端处理的,那么,如果,我们要将导入的excel 数据填充到表格内来展示,如何做到呢?
问题:Excel中有列头有值,我们怎么解析excel中的数据为 json 格式,然后塞到 tableData 中?
<template>
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
prop="name"
label="姓名"
width="180">
</el-table-column>
<el-table-column
prop="studyCode"
label="学号"
width="180">
</el-table-column>
<el-table-column
prop="age"
label="年龄">
</el-table-column>
</el-table>
</template>
比如导入的excel 列头有姓名 学号 年龄 等字段,怎么解析这些列头字段呢?
同样的,我们在 utils.js 中定义一个列头对照对象:
import readFile from '@/utils/index'
import xlsx from 'XlSX'
export let columns = {
name: {
text: '姓名',
type: 'string'
},
studyCode: {
text: '学号',
type: 'string'
},
age: {
text: '年龄',
type: 'string'
}
}
处理获取到的excel工作目录中的数据:
async handleUpLoad (ev) {
let data = await readFile(file)
let workbook = xlsx.read(data, {type: 'binary'}),
worksheet = workbook.Sheets[workbook.Sheets[0]]
data = xlsx.utils.sheet_to_json(worksheet)
let arr = []
data.forEach(item => {
let obj = {}
for (let key in columns) {
if (!columns.hasOwnProperty(key)) break;
let v = columns[key],
text = v.text,
type = v.type
v = item[text] || ''
type === 'string' ? (v = String(v)) : null
type === 'number' ? (v = Number(v)) : null
obj[key] = v
}
arr.push(obj)
})
this.tableData = arr
}
|