vue+elementui导入、导出excel

1、安装插件xlsx

npm install xlsx --save-dev

2、引入:将方法封装为一个类,创建excel.js文件

import * as xlsx from 'xlsx'
class mExcel{
	constructor(){
	}
	//将文件按照二进制进行读取
	readFile(file){
		return new Promise(resolve=>{
			let reader = new FileReader();
			reader.readAsBinaryString(file);
			reader.onload = ev =>{
				resolve(ev.target.result )
			}
		})
	}
	//导入excel  ------ 将二进制转json (file是文件流,typeObj是传给后端的表格字段,suc是成功的回调,err是错误的回调)
	async ByteToJson(file,typeObj,suc,err){
		let data = await this.readFile(file);
		let workbook = xlsx.read(data, { type: "binary" }),
		  worksheet = workbook.Sheets[workbook.SheetNames[0]];
		data = xlsx.utils.sheet_to_json(worksheet);
		let arr = [];
		data.forEach(item => {
		     let obj = {};
		     for (let key in typeObj) {
		       if (!typeObj.hasOwnProperty(key)) break;
		       let v = typeObj[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);
		 });
		 if(arr.length!=0){
			 suc(arr)
		 }else{
			 err()
		 }
	}
	//导出excel --------
	exportExcel(excelData){
		//excelData是外部传进来的对象{excelArr:表格数组,excelName:excel文件命名}
		let data = excelData.excelArr;
		let excelName = excelData.excelName; 
		let sheet = xlsx.utils.json_to_sheet(data)
		let book = xlsx.utils.book_new()
			xlsx.utils.book_append_sheet(book,sheet,'sheet1')
			xlsx.writeFile(book,`${excelName}.xlsx`)
	}
	
}
 export function initExcel(){
	 return new mExcel();
 }

注:xlsx.writeFile(book,${excelName}.xlsx) 使用 .lsx后缀导出到excel最大函数为65535条,如果数据量过大可以使用.xlsx后缀,可以保存1048576条数据

3、使用mExcel类:在main.js中引入这个js文件并实例化

import './utils/excel.js'
let mExcel = initExcel();
vue.prototype.$mExcel = mExcel;  //挂载到vue上面,这样在任何页面只要使用this.$mExcel就可以了 

与element组件结合使用案例
1) 导出:


<el-button type="warning" @click="exportE">导出</el-button>

async exportE(){
//这里的name、adress、code值可以通过v-model绑定实现导出搜索的数据
	let data = {
		name:this.name,
		adress: this.adress,
		code: this.code
	}
	//调用接口 await getGoodsListApi(data) == this.$http.post('url',data).then()
	let resAll = await getGoodsListApi(data);
		if(resAll.data.length==0){
			this.$message.error("没有数据可以导出哦!");
			return;
		}
		//对请求的数据做处理
		let excelArr = resAll.data.map(item=>{
			return{
				"名字":item.name,
				"住址":item.adress,
				"编码":item.code
				}
			});
			
			let excelData = {
				excelArr:excelArr,
				excelName:'信息表',
			}
			//直接调用对象的方法即可
			this.$myExcel.exportExcel(excelData);	
	},

2)导入

 <el-upload
	class="upload-exls"
	action
	:auto-upload="false"
	accept=".xls, .xlsx"
	:limit="1"
	:show-file-list="false"
	:on-change="handle"
	>
<el-button  type="primary" icon="el-icon-upload el-icon--right">导入</el-button>
</el-upload>
 async handle(file, fileList){
		  console.log(file); //文件流放在file.raw中
		  //定义字段即将导入的excel表中的数据显示在el-table中,这些字段是显示的部分(同时需要将导入的数据传给后端)
		  let typeObj = {
			name:{
				text:"名字",
				type:"string"
			},
			adress: {
				text:"地址",
				type:"string"
			},
			code: {
				text:"编码",
				type:"number"
			}
		  };
		  //  接口 :/test/msg
		  //  请求参数:
		  //     {
		  //		name:'',
		  //		adress:'',
		  //		code:'',
		  //		text:''
		  //	}
		 this.$myExcel.ByteToJson(file.raw,typeObj,(res)=>{
		 	//如果请求接口还需要别的字段就需要对数据做处理例如添加text字段
			 res.forEach((item)=>{
				item.text =""
			 })
		//调用导入的接口,这里是调用批量插入的接口,将数组传给后端	
		this.$http.post(this.api.commonURL + "/test/msg",res).then(res=>{
			if(res.message =="success"){
				this.$message.success(`成功导入${res.data.count}条数据!`)
			}
			}).catch(err=>{
				console.log(err)
			})
		 },()=>{
			 this.$message.err("导入失败了!")
		 });
	  },

参考文章:https://www.jb51.net/article/221160.htm

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您可以使用 `xlsx` 库和 `FileSaver.js` 库来实现Vue和Element UI导出Excel文件的功能。以下是一个简单的示例: 1. 首先,安装 `xlsx` 和 `file-saver` 包: ```bash npm install xlsx file-saver ``` 2. 在 Vue 组件中引入所需的库: ```javascript import XLSX from 'xlsx'; import { saveAs } from 'file-saver'; ``` 3. 创建一个方法来导出Excel文件: ```javascript methods: { exportToExcel() { // 创建工作簿和工作表 const workbook = XLSX.utils.book_new(); const worksheet = XLSX.utils.json_to_sheet(this.data); // 将工作表添加到工作簿 XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); // 生成Excel文件的二进制数据 const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); // 将二进制数据转换为Blob对象 const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); // 使用FileSaver.js保存文件 saveAs(blob, 'data.xlsx'); } } ``` 在上面的代码中,`this.data` 是要导出的数据,可以是一个数组或对象。 4. 在模板中添加一个按钮来触发导出操作: ```html <template> <div> <button @click="exportToExcel">导出Excel</button> </div> </template> ``` 这样,当用户点击“导出Excel”按钮时,将会触发 `exportToExcel` 方法,并导出Excel文件。 请注意,为了使上述代码正常工作,您需要在项目中正确引入 `xlsx` 和 `file-saver` 库,并将相关的样式和依赖项加载到您的项目中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值