读取导入的excel表格内容,插入到表格,同时做去重,j前端通过js实现模糊查询

1.导入的excel模版
在这里插入图片描述
2.点击导入,显示excel导入弹窗
在这里插入图片描述
3.点击选择文件,会调用本地文件夹里面的excel文件
在这里插入图片描述
在这里插入图片描述
4.选中文件,点击 导入
在这里插入图片描述

html部分

      <a-button type="primary" @click="onImportXls">导入</a-button><a-modal v-model:visible="excelVisible" title="Excel导入" :centered="true" :width="500" @cancel="excelCancel" :footer="null"><div style="padding: 10px; box-sizing: border-box; padding-bottom: 20px; min-height: 250px"><div style="display: flex; justify-content: space-between; width: 400px"><div style="width: 200px !important"><a-upload name="file" accept=".xls,.xlsx" :multiple="false" :fileList="fileList" :beforeUpload="beforeUpload" :remove="handleRemove"><a-button>选择文件</a-button><span style="margin-left: 5px" v-if="fileList.length > 0">已选择 {{ fileList.length }} 个文件</span><span style="margin-left: 5px" v-else>未选择任何文件</span></a-upload></div><span @click="handleImport" style="cursor: pointer; color: #3e90ff">导入</span></div></div></a-modal>

js部分

const formInfo2 = ref({matId: '',wlName: '',
});
const dataSource= ref([]);
const fileList = ref([]);
const excelVisible = ref(false); function onImportXls() {fileList.value = [];excelVisible.value = true;
}function excelCancel() {excelVisible.value = false;fileList.value = [];
}function handleImport() {dataSource.value = [];highlightColumnList.value = [];if (fileList.value.length > 0) {const reader = new FileReader();reader.readAsArrayBuffer(fileList.value[0]);reader.onload = function () {const buffer = reader.result;const bytes = new Uint8Array(buffer);const length = bytes.byteLength;let binary = '';for (let i = 0; i < length; i++) {binary += String.fromCharCode(bytes[i]);}const wb = XLSX.read(binary, {type: 'binary',});const outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);let drr = [...outdata];let brr = [];for (let i = 0; i < drr.length; i++) {let ab = Object.entries(drr[i]);for (let j = 0; j < ab.length; j++) {//excel表头含有换行符时// ab[j][0] = ab[j][0].replaceAll('↵', '');//不生效ab[j][0] = ab[j][0].replaceAll('\n', ''); //去除成功}brr.push(Object.fromEntries(ab));}let data = brr;let arr = dataSource.value;//将excel表头和table的表头做个比对,赋值data.map((v, i) => {if (v['数量'] == undefined) {v.qty = '';} else {v.qty = v['数量'];}if (v['供应商编码'] == undefined) {v.vendorCode = '';} else {v.vendorCode = v['供应商编码'];}if (v['产品名称'] == undefined) {v.productName = '';} else {v.productName = v['产品名称'];}if (v['物料编号'] == undefined) {v.productCode = '';} else {v.productCode = v['物料编号'];}if (v['产品上级名称'] == undefined) {v.productParent = '';} else {v.productParent = v['产品上级名称'];}if (v['产品上级图号'] == undefined) {v.productParentFig = '';} else {v.productParentFig = v['产品上级图号'];}if (v['产品下级'] == undefined) {v.productChild = '';} else {v.productChild = v['产品下级'];}if (v['产品状态'] == undefined) {v.productState = '';} else {v.productState = v['产品状态'];}if (v['材质'] == undefined) {v.material = '';} else {v.material = v['材质'];}if (v['表面处理'] == undefined) {v.surfaceDeal = '';} else {v.surfaceDeal = v['表面处理'];}if (v['热处理'] == undefined) {v.headDeal = '';} else {v.headDeal = v['热处理'];}if (v['技术编号'] == undefined) {v.techNo = '';} else {v.techNo = v['技术编号'];}if (v['备注'] == undefined) {v.remark = '';} else {v.remark = v['备注'];}v.restId = new Date().getTime() + i;//对导入数据赋值一个唯一值});//含有中文或空去掉for (let i = 0; i < data.length; i++) {if (/[\u4E00-\u9FA5]/g.test(data[i].productCode) || data[i].productCode == '' || data[i].productCode == undefined) {data.splice(i, 1);}}if (arr.length > 0) {arr = arr.concat(data);} else {arr = data;}arr = unipFunc(arr);//去重处理dataSource.value = reduce(arr, 'productCode');//去重处理,若是导入数据的物料编号有重复的,则以最后一次导入数据的为主,把之前含有相同物料编号的数据替换掉sessionStorage.setItem('inData', JSON.stringify(dataSource.value));//对导入的表格数据做个本地缓存,后面搜索会用到excelVisible.value = false;createMessage.success('导入成功');};} else {createMessage.warning('请选择上传文件');}
}function unipFunc(arr) {var Arr = [];for (let i = 0; i < arr.length; i++) {for (let j = i + 1; j < arr.length; j++) {if (arr[i].productCode === arr[j].productCode && Arr.indexOf(arr[j].productCode) === -1) {arr[i] = arr[j];}}}return arr;
}function reduce(person, key) {const obj = {};person = person.reduce((cur, next) => {obj[next[key]] ? '' : (obj[next[key]] = true && cur.push(next));return cur;}, []);return person;
}//移除上传文件
function handleRemove(file) {const index = unref(fileList).indexOf(file);const newFileList = unref(fileList).slice();newFileList.splice(index, 1);fileList.value = newFileList;
}//上传前处理
function beforeUpload(file) {fileList.value = [...unref(fileList), file];
}

5.前端使用js进行搜索,做了个模糊查询
html部分

<a-form :model="formInfo2" name="basic" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }"><a-row :gutter="20"><a-col :span="8"><a-form-item label="物料名称" name="matName2"><a-input v-model:value="formInfo2.wlName" allowClear></a-input></a-form-item></a-col><a-col :span="8"><a-button type="primary" preIcon="ant-design:search-outlined" @click="handSearch" style="margin-right: 20px">搜索</a-button><a-button type="primary" preIcon="ant-design:search-outlined" @click="advancedSearch">高级搜索</a-button></a-col></a-row></a-form>

js部分

function handSearch() {console.log(formInfo2.value, '搜索内容');console.log(sessionStorage.getItem('inData'), '物料');let newArr = [];let inData = JSON.parse(sessionStorage.getItem('inData'));if (inData) {if (formInfo2.value.wlName) {for (let i = 0; i < inData.length; i++) {if (inData[i].productName.indexOf(formInfo2.value.wlName)!=-1) {newArr.push(inData[i]);}}} else {newArr = inData;}console.log(dataSource.value, '符合搜索条件的数据');dataSource.value = newArr;}
}

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

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

相关文章

初识Python之Networkx模块

初识Python之Networkx模块 文章目录 初识Python之Networkx模块简介安装Networkx导入模块、查看版本信息一些基本操作创建Graph添加边&#xff08;节点&#xff09;获取Graph的基本信息Graph的基本绘图 简单应用案例使用内置的Graph数据创建一个无向图创建一个有向图在计算机网络…

【halcon深度学习之那些封装好的库函数】find_dl_samples

函数简介 find_dl_samples 是一个用于检索满足特定条件的深度学习数据集样本索引的过程。让我们逐步详细解释它的输入参数和功能&#xff1a; Samples: 这是包含样本字典或样本字典元组的输入参数。这些样本是将要被搜索的对象。 KeyName: 用于指定要查找的条目的键名。在样本…

关于“Python”的核心知识点整理大全35

目录 13.3.4 重构 create_fleet() game_functions.py 13.3.5 添加行 game_functions.py alien_invasion.py 13.4 让外星人群移动 13.4.1 向右移动外星人 settings.py alien.py alien_invasion.py game_functions.py 13.4.2 创建表示外星人移动方向的设置 13.4.3 检…

【第七在线】可持续时尚与商品计划:减少库存浪费的方法

随着可持续时尚的崭露头角&#xff0c;服装企业越来越重视减少库存浪费。库存浪费不仅对环境造成负面影响&#xff0c;还对企业的经济可持续性产生负面影响。本文将深入探讨可持续时尚与商品计划之间的关系&#xff0c;以及一些减少库存浪费的方法&#xff0c;有助于改进商品计…

源码订货系统的优势

源码订货系统是一种企业购买后可以获得源代码的订货系统&#xff0c;它可以不受软件厂商的规模、发展而修改和使用。与SaaS订货系统相比&#xff0c;核货宝为您分享源码订货系统的四大优势&#xff1a; 一是开放性&#xff1a;源码订货系统是开源的&#xff0c;用户可以掌握源代…

解决IDEA编译/启动报错:Abnormal build process termination

报错信息 报错信息如下&#xff1a; Abnormal build process termination: "D:\Software\Java\jdk\bin\java" -Xmx3048m -Djava.awt.headlesstrue -Djava.endorsed.dirs\"\" -Djdt.compiler.useSingleThreadtrue -Dpreload.project.path………………很纳…

MySQL概括与SQL分类

文章目录 一、计算机语言二、SQL语言三、数据库系统四、MySQL简介 一、计算机语言 二、SQL语言 三、数据库系统 四、MySQL简介

【MySQL】事务、事务隔离级别、死锁

文章目录 1. 事务1.1 事务的属性 ACID1.2 创建事务1.3 autocommit 2. 并发和锁定2.1 并发问题 3. 事务隔离级别3.1 读未提交3.2 读已提交3.3 可重复读&#xff1a;MySQL的默认事务隔离级别3.4 序列化 4. 死锁 1. 事务 事务&#xff1a;单个工作单元的一组SQL语句。事务中的所有…

Python的环境搭建环境配置()

Python 环境搭建 一,下载Python 1.去官网 www.python.org 下载环境 2.如图点击Download 3.选择Windows 4.如图直接下载 5.直接勾选 6.后面就一直默认选项 Win11 安装目录 不能放在C盘的ProgramFIle路径下 二,测试环境是否安装成功 1.winR 输入cmd 2.输入python --versio…

【JS】事件循环机制

一、JS单线程、异步、同步概念 众所周知&#xff0c;JS是单线程&#xff08;如果一个线程删DOM&#xff0c;一个线程增DOM&#xff0c;浏览器傻逼了&#xff5e;所以只能单着了&#xff09;&#xff0c;虽然有webworker酱紫的多线程出现&#xff0c;但也是在主线程的控制下。we…

服务器数据恢复-服务器断电导致linux操作系统数据丢失的数据恢复案例

linux操作系统服务器数据恢复环境&#xff1a; 某品牌R730服务器MD3200系列存储&#xff0c;linux操作系统。 服务器故障&#xff1a; 机房意外断电导致服务器linux操作系统部分文件丢失。 服务器数据恢复过程&#xff1a; 1、将故障服务器连接到北亚企安数据恢复中心备份服务器…

【JVM】一、认识JVM

文章目录 1、虚拟机2、Java虚拟机3、JVM的整体结构4、Java代码的执行流程5、JVM的分类6、JVM的生命周期 1、虚拟机 虚拟机&#xff0c;Virtual Machine&#xff0c;一台虚拟的计算机&#xff0c;用来执行虚拟计算机指令。分为&#xff1a; 系统虚拟机&#xff1a;如VMware&am…

如何在Portainer部署一个web站点到Nginx容器并结合内网穿透远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

Appearance-Motion Memory Consistency Network for Video Anomaly Detection 论文阅读

Appearance-Motion Memory Consistency Network for Video Anomaly Detection 论文阅读 AbstractIntroductionRelated WorkMethodExperimentsConclusions阅读总结 论文标题&#xff1a;Appearance-Motion Memory Consistency Network for Video Anomaly Detection 文章信息&am…

Node.js-模块化(二)

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&…

大一C语言作业题目2

目录 字符串&#xff1f; struct&#xff1f; index细节&#xff1f; scanf细节&#xff1f; 7-2 找出总分最高的学生 给定N个学生的基本信息&#xff0c;包括学号&#xff08;由5个数字组成的字符串&#xff09;、姓名&#xff08;长度小于10的不包含空白字符的非空字符…

数据结构和算法笔记2:二分法

二分法网上有两种写法&#xff0c;一种左闭右闭&#xff0c;一种左闭右开&#xff0c;个人习惯左闭右闭的写法&#xff0c; 有序数组查找数 这是标准二分法&#xff0c;对应力扣的704. 二分查找&#xff1a; 求值为target的索引 int search(vector<int>& nums, i…

说说 style gan 中的感知路径长度(Perceptual Path Length)

我在之前的博库中介绍了 style gan 的基本原理&#xff0c;原文中有提出感知路径长度&#xff08;Perceptual Path Length&#xff09;的概念。这是一种评价生成器质量的方式。 PPL基本思想&#xff1a;给出两个随机噪声 z 1 , z 2 ​ &#xff0c;为求得两点的感知路径长度PPL…

利用ffmpeg cv2取h265码流视频(转换图片灰屏问题解决)

利用海康威视相机拍出来的视频是H265格式的&#xff0c;相比于常规的H264编码&#xff0c;压缩率更高&#xff0c;但因此如果直接用正常取流方法读取&#xff0c;会出现无法读取的情况 1. 如图h265码流取出图片为灰屏 2 、解决灰屏问题 import subprocess import cv2# 将h265流…

Spring事务管理—讲解、案例、应用

简介&#xff1a;Spring事务管理和数据库的事务管理的功能作用上是一样的&#xff0c;在学习数据库时&#xff0c;为了数据完整性&#xff0c;采用了事务管理&#xff0c;即开启事务、提交事务和管理事务。在SpringBoot框架中添加一个注解 Transactional 就可以将当前方法、类和…