Vue2使用el-upload做excel上传导入功能

1、安装插件

npm install xlsx
或
yarn add xlsx

2、页面引入使用

<el-upload :auto-upload="false" :before-remove="beforeRemove" :file-list="fileList" :on-change="handleChange" :on-remove="handleRemove" :show-file-list="true" accept=".xlsx, .xls" action class="upload-box">
	<el-button size="small" type="primary">点击上传</el-button>
	<div class="el-upload__tip" slot="tip" v-show="!fileList[0]">未选择任何文件</div>
	<div slot="tip" class="el-upload__tip">仅支持.xlsx, .xls类型文件</div>
</el-upload>
<script>
	import * as XLSX from 'xlsx/xlsx.mjs'
	export default {
		data() {
			return {
				lastUid: null,
				fileList: [],
			}
		},
		methods: {
			async handleChange(ev, fileList) {
				if (fileList.length > 0) {
					this.fileList = [fileList[fileList.length - 1]]
				} else {
					this.fileList = fileList[0]
				}
				let file = ev.raw
				if (this.lastUid == file.uid) {
					return
				}
				this.lastUid = file.uid
				if (file) {
					console.log(file)
					if (
						file.name.indexOf('.xls') != -1 ||
						file.name.indexOf('.xlsx') != -1
					) {
						let data = await this.readFile(file)
						let workbook = XLSX.read(data, {
							type: 'binary',
							cellDates: true
						})
						let worksheet = workbook.Sheets[workbook.SheetNames[0]]
						let secondsheet = workbook.Sheets[workbook.SheetNames[1]]
						let resultExcel = XLSX.utils.sheet_to_json(worksheet)
						let tableHead = Object.keys(resultExcel[0]);
						console.log(resultExcel, '解析后表格数据')
				        console.log(tableHead, '解析后表格头')
					}
				}
			},
			readFile(file) {
				return new Promise(resolve => {
					let reader = new FileReader()
					reader.readAsBinaryString(file)
					reader.onload = ev => {
						resolve(ev.target.result)
					}
				})
			},
			handleRemove(file, fileList) {
				this.fileList = []
				this.resultExcel = []
			},
			beforeRemove(file, fileList) {
				return this.$confirm(`确定移除 ${file.name}?`)
			},
		}
	}
</script>

3、封装全局组件globalUpload.vue

在components文件夹下新建globalUpload.vue
<template>
	<div>
		<el-upload :auto-upload="false" :before-remove="beforeRemove" :file-list="fileList" :on-change="handleChange"
			:on-remove="handleRemove" :show-file-list="true" accept=".xlsx, .xls" action class="upload-box">
			<el-button size="small" type="primary">点击上传</el-button>
			<div class="el-upload__tip" slot="tip" v-show="!fileList[0]">未选择任何文件</div>
			<div slot="tip" class="el-upload__tip">仅支持.xlsx, .xls类型文件</div>
		</el-upload>
	</div>
</template>

<script>
	import * as XLSX from 'xlsx/xlsx.mjs'
	export default {
		data() {
			return {
				lastUid: null,
				fileList: [],
			}
		},
		methods: {
			async handleChange(ev, fileList) {
				if (fileList.length > 0) {
					this.fileList = [fileList[fileList.length - 1]]
				} else {
					this.fileList = fileList[0]
				}
				let file = ev.raw
				if (this.lastUid == file.uid) {
					return
				}
				this.lastUid = file.uid
				if (file) {
					console.log(file)
					if (
						file.name.indexOf('.xls') != -1 ||
						file.name.indexOf('.xlsx') != -1
					) {
						let data = await this.readFile(file)
						let workbook = XLSX.read(data, {
							type: 'binary',
							cellDates: true
						})
						let worksheet = workbook.Sheets[workbook.SheetNames[0]]
						let secondsheet = workbook.Sheets[workbook.SheetNames[1]]
						let resultExcel = XLSX.utils.sheet_to_json(worksheet)
						let tableHead = Object.keys(resultExcel[0]);
						this.$emit('handleChange',{
							resultExcel,
							tableHead
						})
					}
				}
			},
			readFile(file) {
				return new Promise(resolve => {
					let reader = new FileReader()
					reader.readAsBinaryString(file)
					reader.onload = ev => {
						resolve(ev.target.result)
					}
				})
			},
			handleRemove(file, fileList) {
				this.fileList = []
				this.resultExcel = []
			},
			beforeRemove(file, fileList) {
				return this.$confirm(`确定移除 ${file.name}?`)
			},
		}
	}
</script>

<style lang="scss" scoped></style>

4、全局注册:main.js文件引入注册

import globalUpload from './components/globalUpload.vue';
Vue.component('global-upload', globalUpload);

5、单页面使用:

<template>
	<div>
		<global-upload @handleChange='handleChange'></global-upload>
		<el-table :data="resultExcel" style="width: 100%" v-if="resultExcel.length > 0" border max-height="600">
			<el-table-column v-for="column in tableHead" :key="column" :prop="column" :label="column" show-overflow-tooltip>
			</el-table-column>
		</el-table>
	</div>
</template>

<script>
	export default {
		name: 'sailSoft',
		data() {
			return {
				resultExcel: [], //解析后表格数据
				tableHead: [], //动态表头数据
			}
		},
		methods: {
			handleChange(e){
				this.resultExcel = e.resultExcel
				this.tableHead = e.tableHead
				console.log(this.resultExcel, '解析后表格数据')
				console.log(this.tableHead, '解析后表格头')
			}
		}
	}
</script>

<style lang="scss" scoped></style>

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
El-UploadElement UI 中的一个组件,用于实现文件上传。要使用 El-Upload 来实现表格导入功能,您需要按照以下步骤进行操作: 1. 在页面中引入 Element UI 和 XLSX 库 ```html <!-- 引入 Element UI --> <link rel="stylesheet" href="//unpkg.com/element-ui/lib/theme-chalk/index.css"> <script src="//unpkg.com/vue/dist/vue.js"></script> <script src="//unpkg.com/element-ui/lib/index.js"></script> <!-- 引入 XLSX 库 --> <script src="//unpkg.com/xlsx/dist/xlsx.full.min.js"></script> ``` 2. 在页面中添加 El-Upload 组件 ```html <template> <el-upload class="upload-demo" action="/upload" :on-success="handleSuccess" :before-upload="beforeUpload" :headers="{'Authorization': token}" :accept="'.xlsx'" :limit="1"> <el-button size="small" type="primary">点击上传</el-button> </el-upload> </template> ``` 3. 在 Vue 实例中定义上传前的操作和上传成功后的操作 ```js <script> export default { data() { return { token: '', // 接口认证 token tableData: [] // 存储上传后的数据 }; }, methods: { // 上传前的操作 beforeUpload(file) { const fileType = file.name.split('.').pop(); if (fileType !== 'xlsx') { this.$message.error('仅支持上传 .xlsx 类型的文件'); return false; } }, // 上传成功后的操作 handleSuccess(response, file) { const reader = new FileReader(); reader.onload = e => { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; this.tableData = XLSX.utils.sheet_to_json(worksheet); }; reader.readAsArrayBuffer(file.raw); } } } </script> ``` 以上代码会在上传成功后读取 Excel 文件内容,将其解析为 JSON 格式并存储在 tableData 变量中。 注意:在上传前,需要对文件类型进行验证,只允许上传 .xlsx 类型的文件。另外,由于解析 Excel 文件需要使用 XLSX 库,因此需要在页面中引入该库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值