vue3 导入excel数据

所需包

"xlsx": "^0.18.5"

页面导入包

import * as XLSX from 'xlsx';
import {genFileId,  UploadProps, UploadRawFile,ElTable } from 'element-plus';

页面

	<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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要导入Excel数据,可以使用Element UI提供的el-upload组件。首先需要安装并引入xlsx和file-saver库,然后在el-upload组件中设置accept属性为".xlsx",即只接受Excel文件。在上传成功后,可以使用xlsx库将Excel文件转换为JSON格式的数据,然后进行处理和展示。具体实现可以参考Element UI官方文档中的el-upload组件和xlsx库的使用。 ### 回答2: Vue是一种流行的JavaScript框架,ElementUI是建立在它之上的UI组件库,可以让您使用预制的组件轻松构建前端应用程序。在这篇文章中,我们将讨论使用Vue和ElementUI导入Excel数据的方法。 首先,您需要安装两个npm包,即element-ui和xlsx。在使用Vue CLI构建Vue应用程序时,您可以使用以下命令安装这些包: ```bash npm install element-ui xlsx ``` 然后,在Vue组件中,您需要定义一个data对象来存储导入数据: ```javascript data() { return { excelData: [], headers: [] } } ``` 这里,“excelData”即包含导入数据的数组,“headers”是一个保存Excel文件标题行的数组。接下来,您需要为用户提供一个上传Excel文件的按钮,并在用户上传时调用导入函数: ```html <el-upload accept=".xlsx" @change="handleImportExcel" > <el-button slot="trigger" type="primary"> <i class="el-icon-upload"></i> 上传Excel文件 </el-button> </el-upload> ``` 注意,“handleImportExcel”是一个在Vue组件中定义的方法,它将在用户上传Excel文件时被调用。下面是导入函数的代码: ```javascript handleImportExcel(file) { const reader = new FileReader() reader.onload = (event) => { const workbook = xlsx.read(event.target.result, {type: 'binary'}) const worksheet = workbook.Sheets[workbook.SheetNames[0]] const header = this.getHeaderRow(worksheet) const rows = xlsx.utils.sheet_to_json(worksheet) this.headers = header this.excelData = rows } reader.readAsBinaryString(file.raw) }, getHeaderRow(sheet) { const range = xlsx.utils.decode_range(sheet['!ref']) const header = [] let C const R = range.s.r for (C = range.s.c; C <= range.e.c; ++C) { const cell = sheet[xlsx.utils.encode_cell({c: C, r: R})] let hdr = 'UNKNOWN ' + C if (cell && cell.t) hdr = xlsx.utils.format_cell(cell) header.push(hdr) } return header } ``` 该函数使用FileReader对象读取上传的Excel文件。之后,它使用XLSX库解析Excel文件并将其转换为JavaScript对象。此时,它从Excel文件中获取标题行以及任何数据行。 最后,数据将存储在Vue组件的“excelData”和“headers”属性中,你可以使用这些数据来渲染组件的界面。 在本文中,我们演示了通过Vue和ElementUI展示导入Excel数据的方法。这样可以帮助您在前后端开发中更好地处理Excel文件。 ### 回答3: Vue ElementUI 是一种 UI 框架,提供了丰富的组件来帮助开发人员构建各种 Web 应用程序。其中包含了一个非常强大的 Excel 导入组件,可以轻松地将 Excel 数据导入到你的 Vue.js 应用程序中。 要实现 Excel 数据导入,我们需要先在项目中安装 element-ui 和 xlsx 插件。安装完成后,我们需要在组件中引入以下插件: ```javascript import { ElUpload, ElButton } from 'element-ui' import XLSX from 'xlsx' ``` 其中,ElUpload 和 ElButton 是 ElementUI 中的两个组件,用于提供上传按钮和触发导入事件的按钮。XLSX 则是一个用于处理 Excel 和 CSV 文件的 JavaScript 库,可以将 Excel 文件转换为 JSON 和其他格式。 接下来,我们需要在模板中添加以下代码: ```html <template> <div> <el-upload class="upload-excel" drag accept=".xlsx,.xls,.csv" :before-upload="beforeUpload" :on-success="onSuccess" :on-error="onError" > <i class="el-icon-upload"></i> <div class="el-upload__text">将文件拖到此处,或点击上传</div> <div class="el-upload__tip">支持 .xlsx,.xls,.csv 格式</div> </el-upload> <el-button @click="importExcel">导入数据</el-button> </div> </template> ``` 上面的代码中,我们使用 ElUpload 组件创建了一个文件上传区域,允许拖放、点击上传、接受 Excel 和 CSV 文件,并分别绑定了 beforeUpload、onSuccess 和 onError 事件。同时,我们使用 ElButton 组件创建了一个触发导入事件的按钮。 在 script 中,我们需要添加以下代码来处理上传和导入事件: ```javascript <script> export default { data() { return { excelData: [] // 导入Excel 数据 } }, methods: { beforeUpload(file) { // 校验文件类型和大小 }, onSuccess(response) { // 处理上传成功后的响应 // 读取 Excel 文件数据 const reader = new FileReader() reader.readAsBinaryString(response.file) reader.onload = (e) => { const data = e.target.result const workbook = XLSX.read(data, { type: 'binary' }) const worksheet = workbook.Sheets[workbook.SheetNames[0]] const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }) this.excelData = jsonData } }, onError(error) { // 处理上传失败后的响应 }, importExcel() { // 处理导入 Excel 数据 console.log(this.excelData) } } } </script> ``` 在上面的代码中,我们使用 FileReader 对象将上传的 Excel 文件读取为二进制数据,并使用 XLSX.read 方法将其转换为 workbook 对象。然后,我们使用 XLSX.utils.sheet_to_json 方法将工作表数据转换为 JSON 格式,并将其保存在 excelData 数组中。在导入按钮被点击的时候,我们可以使用 this.excelData 来处理所有的 Excel 数据。 综上所述,通过使用 ElementUI 中的 Excel 导入组件,我们可以轻松地将 Excel 数据导入Vue.js 应用程序中,并对其进行处理。同时,我们还可以使用其他的工具和库来扩展该功能,并根据实际需要进行多样化的配置和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值