vue中使用exceljs组件库导入导出json到excel

逻辑:

1、json数据导出到excel

2、json数据从excel导入

3、导入导出前的验证

4、excel时间转换,

Vue模板代码:

<el-form :inline="true" label-width="120px"><el-form-item><el-button type="primary" @click="downloadExcelTemplate">下载模板</el-button></el-form-item><el-form-item><el-upload action="" accept=".xlsx" :auto-upload="false" :show-file-list="false" :limit="1"ref="upload" :before-upload="beforeExcelUpload" :on-change="handleExcelChange":data="{ directoryName: 'xlsx', sheetName: '设备能耗统计时间段' }"><el-button type="primary">导入</el-button></el-upload></el-form-item></el-form>

Vue,methods代码

downloadExcelTemplate () {if (this.subitemData.length == 0) return;let jsonData = [];let dropdownOptions = [];for (const subitem of this.subitemData) {dropdownOptions.push({ 设备名称: subitem.name, });}for (const subitem of this.subitemData) {let obj = {设备名称: '',生产开始时间: '',生产结束时间: '',}jsonData.push(obj);}const workbook = new ExcelJS.Workbook();const worksheet = workbook.addWorksheet('数据录入');const worksheet2 = workbook.addWorksheet('机列');worksheet2.state = 'hidden';// 定义边框样式const borderStyle = {top: { style: 'thin' },left: { style: 'thin' },bottom: { style: 'thin' },right: { style: 'thin' }};// 添加表头(假设所有对象有相同的键)const headers = Object.keys(jsonData[0]);worksheet.addRow(headers);worksheet2.addRow(Object.keys(dropdownOptions[0]));worksheet.getRow(1).eachCell((cell) => {cell.font = { bold: true };cell.border = borderStyle;});// 设置列宽headers.forEach((header, index) => {worksheet.getColumn(index + 1).width = 20; // 根据需要调整宽度});// 设置表头样式worksheet.getRow(1).eachCell((cell) => {cell.font = { bold: true };});// 使用 addRows 方法一次性添加所有数据行worksheet2.addRows(dropdownOptions.map(item => Object.values(item)));jsonData.forEach(item => {const row = worksheet.addRow(Object.values(item));row.eachCell(cell => {cell.border = borderStyle;});});// 设置数据验证以创建下拉列表worksheet.getColumn(1).eachCell((cell, rowNumber) => {if (rowNumber > 1) { // 跳过表头行cell.dataValidation = {type: 'list',formulae: [`机列!$A$2:$A${dropdownOptions.length + 1}`],allowBlank: true,showDropDown: true,};}});// 保存文件workbook.xlsx.writeBuffer().then((data) => {const blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });saveAs(blob, 'exported_data.xlsx');});},beforeExcelUpload (file) {// 创建一个Promisereturn new Promise((resolve, reject) => {const isExcel = /\.(xlsx)$/.test(file.name);if (!isExcel) {this.$message.error('只能上传.xlsx 文件!');reject();}toast.confirm({message: '上传后将重置本页面数据',confirm: () => {resolve(); // 允许上传},cancel: () => {toast.error("用户取消上传")reject(); // 不允许上传}})});},handleExcelChange (file) {const fileblob = file.raw;const reader = new FileReader();reader.onload = async (e) => {const data = new Uint8Array(e.target.result);const workbook = new ExcelJS.Workbook();try {await workbook.xlsx.load(data);const worksheet = workbook.getWorksheet('数据录入');const jsonData = [];// 获取表头作为键名const headers = worksheet.getRow(1).values.slice(1); // 忽略第一项(即行号)// 遍历所有行并构建 JSON 对象worksheet.eachRow((row, rowNumber) => {if (rowNumber === 1) return; // 跳过表头行const item = {};row.eachCell((cell, colNumber) => {if (colNumber > 0) { // 忽略第一项(即行号)item[headers[colNumber - 1]] = cell.text || cell.value;}});jsonData.push(item);});console.log('Imported JSON Data:', jsonData); // 这里可以替换为实际处理逻辑this.handleExcelData(jsonData)this.$refs.upload.clearFiles(); // 清空文件列表} catch (error) {console.error('读取文件失败:', error);}};reader.readAsArrayBuffer(fileblob);},handleExcelData (excelJson) {if (this.subitemData.length == 0) return;let inputDataList = [];for (const element of excelJson) {let subitemId = 0;let subitemName = element.设备名称;let inputTimeStart = element.生产开始时间;let inputDateTimeEnd = element.生产结束时间;let dateTimeRange = [];if (isEmpty(subitemName)) {toast.error("设备名称不能为空,模板已破坏,请重新下载模板");continue;}if (isEmpty(inputTimeStart) || isEmpty(inputDateTimeEnd)) {inputTimeStart = inputDateTimeEnd = null;}else {inputTimeStart = this.convertExcelDate(inputTimeStart).setSeconds(0, 0);inputDateTimeEnd = this.convertExcelDate(inputDateTimeEnd).setSeconds(0, 0);dateTimeRange = [inputTimeStart, inputDateTimeEnd];}let subitem = this.subitemData.find(s => s.name == subitemName);if (isEmpty(subitem)) continue;let inputData = {stationId: this.stationId,classificationSubitemId: subitem.id,classificationSubitemName: subitem.name,collectTime: inputTimeStart && moment(inputTimeStart).format('YYYY-MM-DD 00:00:00'),startTime: inputTimeStart && moment(inputTimeStart).format('YYYY-MM-DD HH:mm:ss'),endTime: inputDateTimeEnd && moment(inputDateTimeEnd).format('YYYY-MM-DD HH:mm:ss'),dateTimeRange: dateTimeRange,ref: `DateTime-${(Math.random() * 1000).toFixed(0)}`,key: `key-${(Math.random() * 1000).toFixed(0)}`,subitemData: [...this.subitemData]};for (let j = 0; j < inputData.subitemData.length; j++) {let subitem = inputData.subitemData[j]subitem.key = 'key-' + subitem.id + '-' + (Math.random() * 1000).toFixed(0)}inputDataList.push(inputData);};if (inputDataList.length > 0) {this.adddialog.addingData = inputDataList;}},convertExcelDate (serialNumber) {const epochStart = new Date(1900, 0, 1); // 1900-01-01const offsetMilliseconds = 5 * 60 * 1000 + 43 * 1000; // 323000 毫秒,历史原因需要减去 5 分钟和 43 秒epochStart.setTime(epochStart.getTime() + offsetMilliseconds);const daysSinceEpoch = serialNumber - 2; // 减去两天是因为 Excel 认为 1900 是闰年const date = new Date(epochStart.getTime() + daysSinceEpoch * 24 * 60 * 60 * 1000);return date;//return moment(date);},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/498092.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI对话机器人简单实现--智谱BigModel+SpringBoot+Vue2+ElementUI

成品展示 一、首先去注册个账号然后申请个API keys 二、引入依赖 <dependency><groupId>cn.bigmodel.openapi</groupId><artifactId>oapi-java-sdk</artifactId><version>release-V4-2.3.0</version></dependency><depend…

FPGA多路红外相机视频拼接输出,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的红外相机图像处理解决方案本博已有的已有的FPGA视频拼接叠加融合方案 3、工程详细设计方案工程设计原理框图红外相机FDMA多路视频拼接算法FDMA图像缓存视…

Navicat 连接 SQL Server 详尽指南

Navicat 是一款功能强大的数据库管理工具&#xff0c;它提供了直观的图形界面&#xff0c;使用户能够轻松地管理和操作各种类型的数据库&#xff0c;包括 SQL Server。本文将详尽介绍如何使用 Navicat 连接到 SQL Server 数据库&#xff0c;包括安装设置、连接配置、常见问题排…

【JAVA】Java常用注解汇总

一、注解的定义 Java注解是Java编程语言中的一种特殊形式的元数据&#xff0c;它们可以用于为程序的各个元素&#xff08;例如类、方法、字段等&#xff09;添加额外的信息和属性。注解是在Java 5中引入的&#xff0c;通过在代码中使用注解&#xff0c;开发人员可以提供关于程…

debian安装Nginx

编译安装Nginx sudo apt-get update 环境准备 编译Nginx需要gcc的环境支持&#xff0c;build-essential内包含gcc套件&#xff0c;所以我们安装build-essential即可&#xff1a; sudo apt-get install build-essential 因为nginx.conf中使用了正则表达式&#xff0c;所以编…

基于PLC的电梯控制系统(论文+源码)

1.系统设计 电梯采用了PLC控制方式&#xff0c;通过对PLC进行逻辑程序设计&#xff0c;电梯不仅在控制水平上得到了质的提升&#xff0c;同时在安全性上也得到了大大提高。控制系统在构造上实现了简洁化&#xff0c;不仅优化了硬件接线方便了线路施工&#xff0c;同时对控制要…

MySQL从入门到入土---MySQL表的约束 (内含实践)---详细版

目录 引入&#xff1a; null 与not null default&#xff1a; comment列描述 &#xff1a; not null 和 default&#xff1a; zerofill &#xff1a; 主键&#xff1a;primary key 复合主键&#xff1a; 自增长:auto_increment 唯一键&#xff1a;unique key 外键&a…

linux安装nginxs报错:openssl not found

系统&#xff1a; linux 版本&#xff1a;centOS7 nginx版本&#xff1a;nginx-1.20.2 linux安装nginx时 执行下面命令时报错&#xff1a; ./configure --with-http_stub_status_module --with-http_ssl_module --prefix/usr/local/nginxchecking for OpenSSL library ... not …

Flutter:打包apk,详细图文介绍

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

shell命令以及运行原理

目录 一、命令解释器 1、什么是命令行解释器 shell和bash联系 2、为什么用命令行解释器 作用 存在意义 二、Linux权限 1、用户分类 2、Linux权限管理 1&#xff09;权限身份 2&#xff09;文件类型和访问权限 3&#xff09;文件访问权限的相关设置方法 a. chmod …

精准识别花生豆:基于EfficientNetB0的深度学习检测与分类项目

精准检测花生豆&#xff1a;基于EfficientNet的深度学习分类项目 在现代农业生产中&#xff0c;作物的质量检测和分类是确保产品质量的重要环节。针对花生豆的检测与分类需求&#xff0c;我们开发了一套基于深度学习的解决方案&#xff0c;利用EfficientNetB0模型实现高效、准…

CSS利用浮动实现文字环绕右下角,展开/收起效果

期望实现 文字最多展示 N 行&#xff0c;超出部分截断&#xff0c;并在右下角显示 “…” “更多”&#xff1b; 点击更多&#xff0c;文字展开全部内容&#xff0c;右下角显示“收起”。效果如下&#xff1a; 思路 尽量使用CSS控制样式&#xff0c;减少JS代码复杂度。 利…

FOC控制原理-HALL传感器测量电角度

0、相关文章 【电机控制算法】基于霍尔位置传感器(HALL)估算连续电角度&#xff08;基于STM32F407CubeMXHAL&#xff09;_峰岹hall-CSDN博客 电机控制【FOC】_SimpleFOC_通过 Hall 计算电机角度和速度原理 - 大大通(简体站) (wpgdadatong.com.cn) STM32 FOC SDK2.0中使用hall传…

手机实时提取SIM卡打电话的信令声音-智能拨号器的SIP线路-双卡双待单通方案

手机实时提取SIM卡打电话的信令声音 --智能拨号器的SIP线路-双卡双待单通方案 一、前言 蓝牙电话的技术方案最初是从蓝牙耳机和车机蓝牙的使用领域延伸出来的技术方式。通过蓝牙的HFP协议&#xff0c;把手机通话的声音和通话事件状态提取出来进行复用和处理。但中国大陆现行…

C++--类与对象

1.封装 封装是c面向对象的三大特性之一 将属性和行为作为一个整体 将属性和行为加以权限控制 语法&#xff1a; class 类名{ 访问权限: 属性/行为 }; 访问权限 public 公共权限 类内类外均可以访问 protected 保护权限 类内可以访问&#xff0c;类外不可以访问 pr…

遗传算法与深度学习实战(29)——编码卷积自编码器架构

遗传算法与深度学习实战&#xff08;29&#xff09;——编码卷积自编码器架构 0. 前言1. 构建卷积自编码器2. 构建卷积自编码器基因序列3. 解析基因序列构建模型小结系列链接 0. 前言 使用遗传算法 (Genetic Algorithm, GA) 构建自编码器 (AutoEncoder, AE) 优化器时&#xff…

蓝桥杯(Java)(ing)

Java前置知识 输入流&#xff1a; &#xff08;在Java面向对象编程里面有提过相关知识&#xff09; // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new OutputStreamWriter…

Ajax数据爬取

有时我们用requests 抓取页面得到的结果&#xff0c;可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据&#xff0c;而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档&#xff0c;而浏览器中的页面是JavaScript 处理…

tcpdump 网络数据包分析工具

简介 用简单的话来定义tcpdump&#xff0c;就是&#xff1a;dump the traffic on a network&#xff0c;根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的…

手机发烫怎么解决?

在当今这个智能手机不离手的时代&#xff0c;手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感&#xff0c;长期过热还可能损害手机硬件、缩短电池寿命&#xff0c;甚至引发安全隐患。不过别担心&#xff0c;下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…