vue+node+Express+xlsx+emements-plus实现导入excel,并且将数据保存到数据库

devtools/2024/11/23 4:23:30/

excel_0">vue+node+Express+xlsx+emements-plus实现导入excel,并且将数据保存到数据库

前端:

pnpm i xlsx
import { utils, writeFileXLSX,read } from 'xlsx'

准备好DOM,采用的el-upload,使用http-request实现自定义上传,注意这里的action要为空

<el-uploadv-model:file-list="fileList"class="upload-demo":http-request="handleUpload" action=" ":limit="1"><el-button type="primary">上传</el-button></el-upload>

上传数据的接口

// 上传班级Excel
export function uploadClassExcelApi(data) {return request({url: '/info/importClass',method: 'post',data,headers: {'Content-Type': 'application/json'},})
}

注意:request是基于axios的二次封装

自定义处理文件的函数

/*** 处理文件上传功能* 该函数通过FileReader读取用户上传的文件,并将其转换为JSON格式的数据,以便进一步处理* @param {Event} e 文件上传事件,包含上传的文件信息*/
function handleUpload(e){// 获取上传的文件const file = e.file;// 创建一个FileReader实例const reader = new FileReader();// 当文件读取完成时触发该函数reader.onload = async(e) => {// 将读取的结果转换为Uint8Array格式const data = new Uint8Array(e.target.result);// 使用read函数读取Excel数据const workbook = read(data, { type: 'array' });// 获取第一个工作表的名称const sheetName = workbook.SheetNames[0];// 获取第一个工作表const worksheet = workbook.Sheets[sheetName];// 将工作表转换为JSON格式的数据const jsonData = utils.sheet_to_json(worksheet);// 这里可将jsonData发送到后端进行进一步处理// 调用后端API上传Excel数据,并包含当前日期const res=await uploadClassExcelApi({jsonData,create_time:dayFormat(new Date())})// 打印API返回的结果console.log(res);};// 以ArrayBuffer格式读取文件reader.readAsArrayBuffer(file);
}

node

const multer=require('multer')
const storage = multer.memoryStorage();
const uploadExcel = multer({ storage });
// 班级导入Excel
router.post('/importClass',uploadExcel.single('excelFile'),infoHandler.importClass)
// 封装一个返回 Promise 的函数来执行数据库查询
function querys(sql, params) {return new Promise((resolve, reject) => {db.query(sql, params, (err, results) => {if (err) {reject(err);} else {resolve(results);}});});
}

该函数会在下面的路由处理调用

exports.importClass = async (req, res) => {const data = req.body.jsonData;const sql = 'insert into class set ?';const sqls = 'select * from class where college=? and major=? and class=?';try {for (const item of data) {/***********以下可以根据需求进行更改***********/// 查重班级const results = await querys(sqls, [item.学院, item.专业, item.班级]);if (results.length !== 0) {return res.cc('班级已存在');}await querys(sql, {college: item.学院,major: item.专业,class: item.班级,delete: 0,create_time: req.body.create_time});}return res.cc('导入班级成功', 0);} catch (err) {return res.cc(err);}
}

主要的流程是:前端读取Excel文件的数据,将数据转换成json格式,然后将数据交给后端处理,然后封装个方法返回promise,可以保证批量保存到数据库的顺序,避免报错


http://www.ppmy.cn/devtools/136204.html

相关文章

手写模拟Spring Boot启动过程功能

引言 Spring Boot自推出以来&#xff0c;因其简化了Spring应用的初始搭建和开发过程&#xff0c;迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理&#xff0c;并通过Java代码手写模拟Spring Boot的启动过程&am…

Qt模块学习 —— 数据库连接

目录 前言 架构层说明 驱动程序层 SQL API 层 用户界面层 SQL API 层 数据库实例&#xff1a;QSqlDataBase API Public Functions Static Public Members Protected Functions QSqlRecord 绑定值的方法 API QSqlField API 构造函数与析构函数 成员函数 操作符…

快速简单的视频下载器——lux

文章目录 前言1.环境检查1.1 检查 lux 安装1.2 检查FFmpeg安装1.3 备注 2. lux指令2.1 无OPTIONS2.2 -i 指令2.3 - f 指令2.4 -c 指令2.5 -o 指令2.6 备注 3.结语 前言 在学习之余&#xff0c;发现了一个简单并且高效的视频下载器lux,能够帮你快速且高效的下载文件&#xff08…

HarmonyOs学习笔记-布局单位

鸿蒙开发中布局存在很多单位 鸿蒙的默认单位是vp 下方先展示一下在RrkTsUI中我们应该怎么书写&#xff0c;然后讲一下各大单位具体的含义。 Text("这是一个文本, 用默认单位进行展示&#xff0c;也就是vp") .width(100) .height(100);//此段代码与上方代码是一样的…

Day03_AJAX原理 (黑马笔记)

Day03_AJAX原理 目录 Day03_AJAX原理 学习目标 01.XMLHttpRequest - 基础使用 目标 讲解 小结 02.XMLHttpRequest - 查询参数 目标 讲解 小结 03.案例 - 地区查询 目标 讲解 小结 04.XMLHttpRequest - 数据提交 目标 讲解 小结 05.认识_Promise 目标 讲解…

java: spire.pdf.free 9.12.3 create pdf

可以用windows 系统中文字体&#xff0c;也可以从文件夹的字体文件 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司* 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎* 描述&#xff1a;* # Author : geovindu,Geovin Du 涂…

SSM post接口传递json 报错 HTTP状态 415 - 不支持的媒体类型

这篇文章是写给哪些在小破站学习ssm教程的兄弟们&#xff0c;我们都是萌新&#xff0c;大佬就让行吧感谢理解&#xff01; 本文章主要讲解B站赵伟风SSM教程第108节(JSON数据的接收) 我所有的配置都跟老师一样&#xff0c;老师就很顺利发出去了&#xff0c;我的就是一直415&am…

如何利用谷歌浏览器提高网络安全

在当今数字化时代&#xff0c;网络安全已成为我们不可忽视的重要议题。作为全球最受欢迎的网络浏览器之一&#xff0c;谷歌浏览器不仅提供了快速、便捷的浏览体验&#xff0c;还内置了多种安全功能来保护用户的在线安全。本文将详细介绍如何通过谷歌浏览器提高您的网络安全&…