vue3 导入excel数据

所需包

bash 复制代码
"xlsx": "^0.18.5"

页面导入包

bash 复制代码
import * as XLSX from 'xlsx';
import {genFileId,  UploadProps, UploadRawFile,ElTable } from 'element-plus';

页面

bash 复制代码
	<el-upload  accept=".xlsx" :on-change="changeExcel" :on-exceed="handleExceed" :limit="1" :auto-upload="false" :show-file-list="false"  ref="upload">
		<el-button type="primary" size="default">导入Excel</el-button>
	</el-upload>



//js
let tableData=ref([])
const upload = ref<InstanceType<typeof ElTable>>();
const handleExceed: UploadProps['onExceed'] = (files) => {
	upload.value!.clearFiles();
	const file = files[0] as UploadRawFile;
	file.uid = genFileId();
	upload.value!.handleStart(file);
};


function changeExcel(e, fileList) {
	console.log('changeExcelProject---------->');
	if (fileList.length > 1) {
		fileList.splice(0, 1);
	}
	const files = e.raw;
	console.log('files------>', files);
	// 读取表格
	const fileReader = new FileReader();
	fileReader.onload = (ev) => {
		const workbook = XLSX.read(ev.target.result, {
			type: 'binary',
		});

		const wsname = workbook.SheetNames[0];
		const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname], {
			defval: '',
		});
		console.log('ws=', ws); // 转换成json的数据
		//可以选择构建列
		let columnsproject = [];
		if (ws && ws.length > 0) {
			const obj = ws[0] as Object;
			for (const key in obj) {
				if (obj.hasOwnProperty(key)) {
					columnsproject.push({
						label: key,
						prop: key,
					});
				}
			}
		}

		tableDataproject.value = [...ws];
		fieldMap.set('姓名', 'name');
		fieldMap.set('年龄', 'age');
		fieldMap.set('性别', 'sex');
	

		let	tableDataArr = [...ws];
		let dataNew: any[] = [];
		for (let i = 0; i < tableDataArr.length; i++) {
			const item = tableDataArr[i];
			const obj: any = buildingObj(item);
			dataNew.push(obj);
		}
        tableData.value=dataNew
		console.error("tableData",tableData)
	};
	fileReader.readAsBinaryString(files);
}

function buildingObj(item: object) {
	const obj = {};
	for (const [key, value] of fieldMap) {
		obj[value] = item[key];
	}
	return obj;
}
相关推荐
啊啊啊~~几秒前
歌词滚动效果
javascript·html
球球和皮皮1 小时前
Babylon.js学习之路《四、Babylon.js 中的相机(Camera)与视角控制》
javascript·3d·前端框架·babylon.js
Java&Develop1 小时前
Vue ElementUI原生upload修改字体大小和区域宽度
vue.js
郭尘帅6662 小时前
vue3基础学习(上) [简单标签] (vscode)
前端·vue.js·学习
njsgcs2 小时前
opencascade.js stp vite webpack 调试笔记
开发语言·前端·javascript
T0uken3 小时前
【前端】:单 HTML 去除 Word 批注
前端·html·word
st紫月3 小时前
用vue和go实现登录加密
前端·vue.js·golang
岁岁岁平安3 小时前
Vue3学习(组合式API——计算属性computed详解)
前端·javascript·vue.js·学习·computed·计算属性
HWL56794 小时前
Express项目解决跨域问题
前端·后端·中间件·node.js·express
刺客-Andy4 小时前
React 第三十九节 React Router 中的 unstable_usePrompt Hook的详细用法及案例
前端·javascript·react.js