当前位置: 首页 > news >正文

vue3 excel文件导入

文章目录

  • 前言
  • 使用
  • 在vue文件中的使用

前言

最近写小组官网涉及到了excel文件导入的功能 场景是导入小组成员年级 班级 邮箱 组别 姓名等基本信息的excel表格用于展示各组信息

使用

先下载js库

npm install xlsx

为了提高代码的复用性 我将它写成了一个通用的函数

import apiClient from "@/api/axios";
import * as XLSX from "xlsx";interface UserData {姓名: string;学号: string;邮箱: string;班级: string;年级: string;组别: string;电话: string;QQ: string;
}// 验证文件后缀
function validateFileExtension(fileName: string): boolean {return fileName.toLowerCase().endsWith(".xlsx");
}// 验证Excel字段
async function validateExcelFields(file: File): Promise<string | boolean> {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = (e) => {try {const data = new Uint8Array(e.target?.result as ArrayBuffer);const workbook = XLSX.read(data, { type: "array" });const firstSheet = workbook.Sheets[workbook.SheetNames[0]];const jsonData = XLSX.utils.sheet_to_json<UserData>(firstSheet);if (jsonData.length === 0) {reject("Excel文件内容为空");return;}const requiredFields = ["姓名","学号","班级","年级","组别","电话","QQ",];const missingFields = requiredFields.filter((field) => !(field in jsonData[0]),);if (missingFields.length > 0) {reject(`文件缺少必要字段`);return;}resolve(true);} catch (error) {reject("文件解析失败");}};reader.onerror = () => reject("文件读取失败");reader.readAsArrayBuffer(file);});
}//批量导入
export async function processFiles(file: File) {if (!validateFileExtension(file.name)) {throw "请上传.xlsx格式的文件";}try {const validationResult = await validateExcelFields(file);if (validationResult !== true) {throw validationResult as string;}const formData = new FormData();formData.append("file", file);return await apiClient.post("/userManager/teamInfo/addUsers", formData, {headers: {"Content-Type": "multipart/form-data",},});} catch (error) {// 修改此处:将返回改为抛出if (error instanceof Error) {throw error.message;}throw typeof error === "string" ? error : "未知错误";}
}// 模拟非.xlsx 文件
const nonXlsxFile = new File([], "example.txt", { type: "text/plain" });
processFiles(nonXlsxFile).then((result) => {console.log(result);
});

该文件可以在用户上传时检查上传的文件后缀是否为xlsx 以及如果上传的文件后缀是xlsx
那么检查表格中是否有该有的字段 如果没有则直接拦截不发送请求

在vue文件中的使用

const handleXlsx = (e: Event) => {const target = e.target as HTMLInputElement;if (target.files) {processFiles(target.files[0]).then((response) => {showAlert("上传成功", "pass");updateData(grade.value, group.value);target.value = "";}).catch((error) => {showAlert(error, "error");});}
};
http://www.xdnf.cn/news/48547.html

相关文章:

  • MAC-从es中抽取数据存入表中怎么实现
  • C语言状态字与库函数详解:概念辨析与应用实践
  • 2025-2030:视频联网平台的六大技术演进趋势
  • Java开发软件
  • 每日算法-250420
  • Java中的锁
  • 【C++】 —— 笔试刷题day_21
  • ARM裸机开发——I.MX6U_汇编LED灯驱动
  • 大模型技术解析与应用 | 大语言模型:从理论到实践(第2版)| 复旦大学 | 533页
  • 地级市-城镇化率(2003-2023年)-社科数据
  • 驱动开发硬核特训 · Day 15:电源管理核心知识与实战解析
  • typeScript基础(类型)
  • Scratch——第18课 列表接龙问题
  • 基于javaweb的SpringBoot儿童爱心管理系统设计与实现(源码+文档+部署讲解)
  • llamafactory的包安装
  • ArcPy Mapping 模块基础(下)
  • 动态调整映射关系的一致性哈希负载均衡算法详解
  • 计算机网络基础
  • 抽象类是“模板”,接口是“契约”——深度对比 Java 两大抽象机制
  • NLP 梳理03 — 停用词删除和规范化
  • git reset和git revert的区别
  • DQN在Gym的MountainCar环境的实现
  • SpringCloud实战
  • 软考复习——知识点软件开发
  • 提示词设计:动态提示词 标准提示词
  • 深入理解 Java 中的 synchronized 关键字
  • 【JavaWeb后端开发02】SpringBootWeb + Https协议
  • OpenCV 对图像进行阈值处理 cv2.threshold
  • 基于 pnpm + Monorepo + Turbo + 无界微前端 + Vite 的企业级前端工程实践
  • Linux教程-Shell编程系列二