背景:有个项目表单数据字段过多,为了方便快速添入数据需要将表格中的数据导入至表单中,记录下来,方便以后查看。
所用插件:xlsx
一、装包 npm install xlsx --save
二、封装插件
<template>
<div>
<input
class="input-file"
type="file"
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
@change="exportData"
>
<button @click="btnClick">导入参数</button>
</div>
</template>
<script>
import XLSX from 'xlsx';
export default {
name: 'InputExcel',
props: {
accept: {
type: String,
default: '选择excel文件'
}
},
methods: {
btnClick() {
document.querySelector('.input-file').click();
},
exportData(event) {
if (!event.currentTarget.files.length) {
return;
}
const that = this;
// 拿取文件对象
var f = event.currentTarget.files[0];
// 用FileReader来读取
var reader = new FileReader();
// 重写FileReader上的readAsBinaryString方法
FileReader.prototype.readAsBinaryString = function(f) {
var binary = '';
var wb; // 读取完成的数据
var outdata; // 你需要的数据
var reader = new FileReader();
reader.onload = function(e) {
// 读取成Uint8Array,再转换为Unicode编码(Unicode占两个字节)
var bytes = new Uint8Array(reader.result);
var length = bytes.byteLength;
for (var i = 0; i < length; i++) {
binary += String.fromCharCode(bytes[i]);
}
// 接下来就是xlsx了,具体可看api
wb = XLSX.read(binary, {
type: 'binary'
});
outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
// 自定义方法向父组件传递数据
that.$emit('getResult', outdata);
};
reader.readAsArrayBuffer(f);
};
reader.readAsBinaryString(f);
}
}
};
</script>
<style scoped>
.input-file {
display: none;
}
</style>
三、页面中引用刚封装的xlsx组件
<template>
<div>
<xlsx @getResult="getMyExcelData">导入参数</xlsx>
</div>
</template>
<script>
import xlsx from '@/components/xlsx/xlsx';
export default {
components: {
xlsx
},
methods:{
getMyExcelData(data) {
// 处理你的数据
console.log(data);
}
}
</script>