IT评测·应用市场-qidao123.com技术社区

标题: vue3 excel文件导入 [打印本页]

作者: tsx81428    时间: 3 天前
标题: vue3 excel文件导入
前言

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

先下载js库
  1. npm install xlsx
复制代码
为了提高代码的复用性 我将它写成了一个通用的函数
  1. import apiClient from "@/api/axios";
  2. import * as XLSX from "xlsx";
  3. interface UserData {
  4.   姓名: string;
  5.   学号: string;
  6.   邮箱: string;
  7.   班级: string;
  8.   年级: string;
  9.   组别: string;
  10.   电话: string;
  11.   QQ: string;
  12. }
  13. // 验证文件后缀
  14. function validateFileExtension(fileName: string): boolean {
  15.   return fileName.toLowerCase().endsWith(".xlsx");
  16. }
  17. // 验证Excel字段
  18. async function validateExcelFields(file: File): Promise<string | boolean> {
  19.   return new Promise((resolve, reject) => {
  20.     const reader = new FileReader();
  21.     reader.onload = (e) => {
  22.       try {
  23.         const data = new Uint8Array(e.target?.result as ArrayBuffer);
  24.         const workbook = XLSX.read(data, { type: "array" });
  25.         const firstSheet = workbook.Sheets[workbook.SheetNames[0]];
  26.         const jsonData = XLSX.utils.sheet_to_json<UserData>(firstSheet);
  27.         if (jsonData.length === 0) {
  28.           reject("Excel文件内容为空");
  29.           return;
  30.         }
  31.         const requiredFields = [
  32.           "姓名",
  33.           "学号",
  34.           "班级",
  35.           "年级",
  36.           "组别",
  37.           "电话",
  38.           "QQ",
  39.         ];
  40.         const missingFields = requiredFields.filter(
  41.           (field) => !(field in jsonData[0]),
  42.         );
  43.         if (missingFields.length > 0) {
  44.           reject(`文件缺少必要字段`);
  45.           return;
  46.         }
  47.         resolve(true);
  48.       } catch (error) {
  49.         reject("文件解析失败");
  50.       }
  51.     };
  52.     reader.onerror = () => reject("文件读取失败");
  53.     reader.readAsArrayBuffer(file);
  54.   });
  55. }
  56. //批量导入
  57. export async function processFiles(file: File) {
  58.   if (!validateFileExtension(file.name)) {
  59.     throw "请上传.xlsx格式的文件";
  60.   }
  61.   try {
  62.     const validationResult = await validateExcelFields(file);
  63.     if (validationResult !== true) {
  64.       throw validationResult as string;
  65.     }
  66.     const formData = new FormData();
  67.     formData.append("file", file);
  68.     return await apiClient.post("/userManager/teamInfo/addUsers", formData, {
  69.       headers: {
  70.         "Content-Type": "multipart/form-data",
  71.       },
  72.     });
  73.   } catch (error) {
  74.     // 修改此处:将返回改为抛出
  75.     if (error instanceof Error) {
  76.       throw error.message;
  77.     }
  78.     throw typeof error === "string" ? error : "未知错误";
  79.   }
  80. }
  81. // 模拟非.xlsx 文件
  82. const nonXlsxFile = new File([], "example.txt", { type: "text/plain" });
  83. processFiles(nonXlsxFile).then((result) => {
  84.   console.log(result);
  85. });
复制代码
该文件可以在用户上传时查抄上传的文件后缀是否为xlsx 以及假如上传的文件后缀是xlsx
那么查抄表格中是否有该有的字段 假如没有则直接拦截不发送哀求
在vue文件中的使用

  1. const handleXlsx = (e: Event) => {
  2.   const target = e.target as HTMLInputElement;
  3.   if (target.files) {
  4.     processFiles(target.files[0])
  5.       .then((response) => {
  6.         showAlert("上传成功", "pass");
  7.         updateData(grade.value, group.value);
  8.         target.value = "";
  9.       })
  10.       .catch((error) => {
  11.         showAlert(error, "error");
  12.       });
  13.   }
  14. };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4