Appearance
Excel导入导出数据
今天实现一个导入和导出表格的功能。其实这个功能应该是后端做的,但是前端也要会啊,所以今天我做个功能简单的导入导出数据,纯属是想前端实现一下功能而已
测试文件:表格测试数据下载
安装两个库
npm i xlsx file-saver -S
npm i xlsx file-saver -S
import { readFile } from '../../utils/xlsx'
这个我另外导入了,其实不用抽出来也行的,我选择了抽
js
export const readFile = (file) => {
return new Promise(resolve => {
let reader = new FileReader()
reader.readAsBinaryString(file)
reader.onload = ev => {
resolve(ev.target.result)
}
})
}
export const readFile = (file) => {
return new Promise(resolve => {
let reader = new FileReader()
reader.readAsBinaryString(file)
reader.onload = ev => {
resolve(ev.target.result)
}
})
}
实现功能:
vue
<template>
<div>
<div style="display:flex;">
<el-upload
ref="uploadRef"
class="upload-demo"
action=""
accept=".xls,.xlsx"
:auto-upload="false"
:show-file-list="false"
:on-change="handleUploadChange"
>
<el-button round icon="upload" type="primary" >导入表格数据</el-button>
</el-upload>
<el-button round @click="handleExport" type="primary" >导出表格数据</el-button>
</div>
<div>
<el-table
:data="tableData"
style="width: 100%">
<el-table-column prop="name" label="名字" width="180"></el-table-column>
<el-table-column prop="phone" label="手机号" width="180"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
</el-table>
</div>
</div>
</template>
<script>
import * as XLSX from 'xlsx'
import { saveAs } from 'file-saver';
import { readFile } from '../../utils/xlsx'
export default {
data() {
return {
tableData:[]
}
},
methods: {
//导入
async handleUploadChange(file) {
let dataBinary = await readFile(file.raw);
//使用XLSX.read函数读取二进制数据,并将结果保存在workBook变量中
//cellDates: true选项表示将单元格中的日期数据读取为日期对象
let workBook = XLSX.read(dataBinary, { type: 'binary', cellDates: true })
//从工作簿中获取第一个工作表,并将其保存在workSheet变量中
let workSheet = workBook.Sheets[workBook.SheetNames[0]]
//使用XLSX.utils.sheet_to_json函数将工作表转换为JSON格式的数据,并将结果保存在data常量中
const data = XLSX.utils.sheet_to_json(workSheet)
// console.log(data)//这里已经能拿到转换后的json
this.tableData = data.map(item=>{
return{
'name':item['名字'],
'phone':item['手机号'],
'age':item['年龄']
}
})
},
//导出
async handleExport() {
let aoaList = [['名字','手机号','年龄']]
await this.tableData.forEach(item=>{
//这里手机号要加toString(),Excel自动将长数字(如手机号)识别为科学计数法的结果。当一个数字超过一定长度时,Excel会自动将其转换为科学计数法,不然就会变成1.57316+11这样的
aoaList.push([item.name,item.phone.toString(),item.age])
})
let workSheet = '';
//使用XLSX.utils.aoa_to_sheet函数将aoaList数组转换为一个工作表,并将结果保存在workSheet变量中
await (workSheet = XLSX.utils.aoa_to_sheet(aoaList));
//使用XLSX.utils.book_new函数创建一个新的工作簿
let workBook = XLSX.utils.book_new();
//使用XLSX.utils.book_append_sheet函数将workSheet工作表添加到workBook工作簿中,工作表的名称为’SheetJS’
await XLSX.utils.book_append_sheet(workBook, workSheet, 'SheetJS');
//使用XLSX.writeFile函数将workBook工作簿写入一个名为’output.xlsx’的Excel文件
await XLSX.writeFile(workBook, 'output.xlsx');
}
}
}
</script>
<template>
<div>
<div style="display:flex;">
<el-upload
ref="uploadRef"
class="upload-demo"
action=""
accept=".xls,.xlsx"
:auto-upload="false"
:show-file-list="false"
:on-change="handleUploadChange"
>
<el-button round icon="upload" type="primary" >导入表格数据</el-button>
</el-upload>
<el-button round @click="handleExport" type="primary" >导出表格数据</el-button>
</div>
<div>
<el-table
:data="tableData"
style="width: 100%">
<el-table-column prop="name" label="名字" width="180"></el-table-column>
<el-table-column prop="phone" label="手机号" width="180"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
</el-table>
</div>
</div>
</template>
<script>
import * as XLSX from 'xlsx'
import { saveAs } from 'file-saver';
import { readFile } from '../../utils/xlsx'
export default {
data() {
return {
tableData:[]
}
},
methods: {
//导入
async handleUploadChange(file) {
let dataBinary = await readFile(file.raw);
//使用XLSX.read函数读取二进制数据,并将结果保存在workBook变量中
//cellDates: true选项表示将单元格中的日期数据读取为日期对象
let workBook = XLSX.read(dataBinary, { type: 'binary', cellDates: true })
//从工作簿中获取第一个工作表,并将其保存在workSheet变量中
let workSheet = workBook.Sheets[workBook.SheetNames[0]]
//使用XLSX.utils.sheet_to_json函数将工作表转换为JSON格式的数据,并将结果保存在data常量中
const data = XLSX.utils.sheet_to_json(workSheet)
// console.log(data)//这里已经能拿到转换后的json
this.tableData = data.map(item=>{
return{
'name':item['名字'],
'phone':item['手机号'],
'age':item['年龄']
}
})
},
//导出
async handleExport() {
let aoaList = [['名字','手机号','年龄']]
await this.tableData.forEach(item=>{
//这里手机号要加toString(),Excel自动将长数字(如手机号)识别为科学计数法的结果。当一个数字超过一定长度时,Excel会自动将其转换为科学计数法,不然就会变成1.57316+11这样的
aoaList.push([item.name,item.phone.toString(),item.age])
})
let workSheet = '';
//使用XLSX.utils.aoa_to_sheet函数将aoaList数组转换为一个工作表,并将结果保存在workSheet变量中
await (workSheet = XLSX.utils.aoa_to_sheet(aoaList));
//使用XLSX.utils.book_new函数创建一个新的工作簿
let workBook = XLSX.utils.book_new();
//使用XLSX.utils.book_append_sheet函数将workSheet工作表添加到workBook工作簿中,工作表的名称为’SheetJS’
await XLSX.utils.book_append_sheet(workBook, workSheet, 'SheetJS');
//使用XLSX.writeFile函数将workBook工作簿写入一个名为’output.xlsx’的Excel文件
await XLSX.writeFile(workBook, 'output.xlsx');
}
}
}
</script>
结语:只是尝试一下这个功能前端怎么实现,现在实现也是功能比较简单的,如果表格数据繁杂,那也是麻烦啊,具体的可以网上找找资料