el-table使用xlsx实现导入文件编辑功能

news2024/11/17 21:40:32

需求:列表根据xlsx文件导入后,和列表进行对比,之后实现编辑功能

 1.下载xlsx

我下的是之前的版本,新版不知道兼不兼容,这个包900多k

npm install xlsx@0.14.5

2.在需要使用表格导入的页面引入

import XLSX from "xlsx";

3.写个导入的el-upload

 <el-upload
                ref="upload"
                action="/"
                :on-change="onChangeFile"
                :auto-upload="false"
                :show-file-list="false"
                accept=".xls, .xlsx"
                class="dialog-upload"
            >
                <el-button type="primary" icon="el-icon-folder-add">导入</el-button>
            </el-upload>
        // 导入表格
        onChangeFile(file) {
            console.log(file);
            // 保存当前选择文件
            this.fileData = file;
            // 调用读取数据的方法
            this.readExcel();
        },
        // 读取数据
        readExcel() {
            const files = this.fileData;
            if (!files) {
                // 没有文件
                return false;
            } else if (!/\.(xls|xlsx)$/.test(files.name.toLowerCase())) {
                this.$message.error('请上传xls或者xlsx文件');
                return false;
            }
            const fileReader = new FileReader();
            fileReader.onload = e => {
                try {
                    const data = e.target.result;
                    const workbook = XLSX.read(data, {
                        type: 'binary',
                        cellDates: true,//设为true,将天数的时间戳转为时间格式
                    });
                    if (workbook.SheetNames.length >= 1) {
                        this.$message.success('导入成功');
                    }
                    // 取第一张表
                    const wsname = workbook.SheetNames[0];
                    console.log(wsname,'e.target.result');
                    // 生成json表格内容
                    const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]);
                    // this.$emit('getUploadData', ws);
                    console.log(ws, '生成json表格内容');
                    this.endPoint(ws);
                    // 清空value值,不然页面为刷新时无法重复使用
                    this.$refs.upload.value = '';
                } catch (e) {
                    return false;
                }
            };
            fileReader.readAsBinaryString(files.raw);
        },

得到的json格式如下

表格数据如下 

 

 4.比对文件后数据回填

findIndex:如果有符合条件的会返回索引值

  endPoint(ws) {
            // 遍历从Excel导入的数据
            for (const data of ws) {
                const name = data['姓名'];
                const updUsername = data['修改姓名'];
                const updAddress = data['修改地址'];

                // 在另一个表格中查找对应的点名
                const matchedRowIndex = this.tableData.findIndex(row => row.name == name);
                console.log(matchedRowIndex,'对应数据信息');

                // 如果找到了匹配的行,则进行数据回填
                if (matchedRowIndex !== -1) {
                    this.tableData[matchedRowIndex].updName = updUsername;
                    this.tableData[matchedRowIndex].updAddress = updAddress;
                }
                // 将数组赋值给另一个变量以触发Vue响应式更新
                this.tableData = [...this.tableData];
                console.log(this.tableData, '点名筛选');
            }
        },

5.完整代码

<template>
    <div class="content-box">
        <div class="container">
            <el-upload
                ref="upload"
                action="/"
                :on-change="onChangeFile"
                :auto-upload="false"
                :show-file-list="false"
                accept=".xls, .xlsx"
                class="dialog-upload"
            >
                <el-button type="primary" icon="el-icon-folder-add">导入</el-button>
            </el-upload>
            <el-table :data="tableData" style="width: 100%">
                <el-table-column prop="date" label="日期" width="180"> </el-table-column>
                <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
                <el-table-column prop="address" label="地址"> </el-table-column>
                <el-table-column label="修改姓名">
                    <template slot-scope="scope">
                        <el-input
                            size="small"
                            v-model="scope.row.updName"
                            oninput="if(value==0)value=null"
                            placeholder="修改日期"
                            type="text"
                        ></el-input>
                    </template>
                </el-table-column>
                <el-table-column label="修改地址">
                    <template slot-scope="scope">
                        <el-input
                            size="small"
                            v-model="scope.row.updAddress"
                            oninput="if(value==0)value=null"
                            placeholder="修改姓名"
                            type="text"
                        ></el-input>
                    </template>
                </el-table-column>
            </el-table>
            <el-button @click="saveData">保存</el-button>
        </div>
    </div>
</template>

<script>
import XLSX from "xlsx";
export default {
    data() {
        return {
            tableData: [
                {
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀区金沙江路 1518 弄',
                    updAddress:null,
                    updName:null
                },
                {
                    date: '2016-05-04',
                    name: '王小二',
                    address: '上海市普陀区金沙江路 1517 弄',
                    updAddress:null,
                    updName:null
                },
                {
                    date: '2016-05-01',
                    name: '王小三',
                    address: '上海市普陀区金沙江路 1519 弄',
                    updAddress:null,
                    updName:null
                },
                {
                    date: '2016-05-03',
                    name: '王小四',
                    address: '上海市普陀区金沙江路 1516 弄',
                    updAddress:null,
                    updName:null
                }
            ],
            fileData:""
        };
    },
    mounted() {},
    methods: {
        // 导入表格
        onChangeFile(file) {
            console.log(file);
            // 保存当前选择文件
            this.fileData = file;
            // 调用读取数据的方法
            this.readExcel();
        },
        // 读取数据
        readExcel() {
            const files = this.fileData;
            if (!files) {
                // 没有文件
                return false;
            } else if (!/\.(xls|xlsx)$/.test(files.name.toLowerCase())) {
                this.$message.error('请上传xls或者xlsx文件');
                return false;
            }
            const fileReader = new FileReader();
            fileReader.onload = e => {
                try {
                    const data = e.target.result;
                    const workbook = XLSX.read(data, {
                        type: 'binary',
                        cellDates: true,//设为true,将天数的时间戳转为时间格式
                    });
                    if (workbook.SheetNames.length >= 1) {
                        this.$message.success('导入成功');
                    }
                    // 取第一张表
                    const wsname = workbook.SheetNames[0];
                    console.log(wsname,'e.target.result');
                    // 生成json表格内容
                    const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]);
                    // this.$emit('getUploadData', ws);
                    console.log(ws, '生成json表格内容');
                    this.endPoint(ws);
                    // 清空value值,不然页面为刷新时无法重复使用
                    this.$refs.upload.value = '';
                } catch (e) {
                    return false;
                }
            };
            fileReader.readAsBinaryString(files.raw);
        },
        endPoint(ws) {
            // 遍历从Excel导入的数据
            for (const data of ws) {
                const name = data['姓名'];
                const updUsername = data['修改姓名'];
                const updAddress = data['修改地址'];

                // 在另一个表格中查找对应的点名
                const matchedRowIndex = this.tableData.findIndex(row => row.name == name);
                console.log(matchedRowIndex,'对应数据信息');

                // 如果找到了匹配的行,则进行数据回填
                if (matchedRowIndex !== -1) {
                    this.tableData[matchedRowIndex].updName = updUsername;
                    this.tableData[matchedRowIndex].updAddress = updAddress;
                }
                // 将数组赋值给另一个变量以触发Vue响应式更新
                this.tableData = [...this.tableData];
                console.log(this.tableData, '点名筛选');
            }
        },
        saveData(){
            // 保存的话这边只用判断下修改姓名或者修改地址是否有值之后再把修改后的数据进行提交到后台就可以了
        }
    }
};
</script>

<style lang="scss" scoped></style>

文章到此结束,希望对你有所帮助~~

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

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

相关文章

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】 1 实现\封装Message模块 zinx/ziface/imessage.go package zifacetype IMessage interface {GetMsdId() uint32GetMsgLen() uint32GetMsgData() []byteSetMsgId(uint32)SetData([]byte)SetData…

MySQL数据库 【索引事务】

目录 一、概念 二、索引的优缺点 1、索引的优点 2、索引的缺陷 三、索引的使用 1、查看索引 2、创建索引 3、删除索引 四、索引底层的数据结构 1、B树 2、B树 五、索引事务 1、概念和回滚 2、事务的使用 3、事务的基本特性 4、并发会遇到的问题 &#xff08…

Python程序设计基础:字典与集合(二)

文章目录 一、字典的整体操作1、字典的遍历2、字典的排序3、字典的合并 二、创建与访问集合1、集合的创建2、集合的访问 三、集合的基本操作1、集合的增、删、查2、集合的数学运算 一、字典的整体操作 字典的整体操作是指以字典为操作对象&#xff0c;对字典进行遍历、排序以及…

hdu foreverlasting and fried-chicken

题意&#xff1a; 在一个有n个点和m条边的图中找到形状是上图的子图&#xff0c;输出个数 思路&#xff1a; 仔细观察上图&#xff0c;设第二行的那个点为x&#xff0c;最后一行的点为y&#xff0c;那么可以知道&#xff0c;如果x和y都和相同的所有点中取四个点分别和xy相连…

DUBBO服务多网卡,服务调用失败

如果服务器是多网卡的&#xff0c;比如安装了docker&#xff0c;有一个docker虚拟网卡&#xff0c;一个实体网卡eth0&#xff0c;当我们运行springboot应用后&#xff0c;dubbo注入到zk的地址是 docker虚拟网卡的地址172网段&#xff0c;而不是实际内网地址192网段&#xff0c;…

OpenLayers实战,OpenLayers使用wind-layer插件实现风场动态效果

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解如何使用OpenLayers的气象风场插件wind-layer实现气象风场动态效果,该插件除了可用于OpenLayers之外,还可用于mapgl、leaflet和cesuim等二维/三维地图引擎,还是很强大的,废话少谈,让我们立刻开始实现吧。 二、依赖和…

如何将论文中的字快速复制出来?图片如何提取文字?

在日常的办公中&#xff0c;我们经常会遇到需要将纸质文件里的文字提取出来&#xff0c;再转换为电子档的情况&#xff0c;如果我们采用手动输入的话&#xff0c;不仅速度太慢&#xff0c;而且还可能因此耽误到后边的工作&#xff0c;是不是已经有小伙伴遇到这种现象&#xff0…

element中tabs组件,click事件点击拿到当前item的所有数据

话不多说&#xff0c;直接上代码&#xff1a; 添加一个:value&#xff0c;然后在用JSON.stringify(item)转一下就可以了&#xff0c;这样就会存在$attrs.value这个里面了。 接着在点击事件里面获取使用el.$attrs.value&#xff0c;注意这里在拿到这个值时&#xff0c;再用JSON…

锌离子荧光探针TSQ,109628-27-5,具有很好的选择性荧光探针

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ PART1----外观以及性质&#xff1a; 锌离子荧光探针TSQ&#xff08;CAS号&#xff1a;109628-27-5&#xff09;&#xff0c;锌离子荧光探针TSQ是用于检测锌离子的荧光探针。 TSQ与Zn离子结合后&#xff0c;吸收波长和发射波…

如何创建一个SpringBoot项目

欢迎来到南方有乔木的博客&#xff01;&#xff01;&#xff01; 博主主页&#xff1a;点击点击&#xff01;戳一戳&#xff01;&#xff01; 博主名:南方有乔木 博主简介&#xff1a; 一名在校大学生&#xff0c;正在努力学习Java语言编程。穷且意坚&#xff0c;不坠青云之…

sort排序报错:java.lang.UnsupportedOperationException: null

文章目录 问题原因解决方式 问题 Groovy 调用 .sort{} 排序报错:java.lang.UnsupportedOperationException: null solutionScenario2SolutionProcessList.sort { it.idx } 原因 调用的sort的对象是Collections的内部类对象UnmodifiableRandomAcessList 解决方式 调用 coll…

数据结构:单链表的实现(C语言)

个人主页 &#xff1a; 水月梦镜花 个人专栏 &#xff1a; 《C语言》 《数据结构》 文章目录 前言一、单链表实现思路和图解1.节点的定义(SListNode)2.申请一个节点(BuySListNode)3.单链表打印(SListPrint)4.单链表尾插(SListPushBack)5.单链表的头插(SListPushFront)6.单链表的…

【ChatGPT辅助学Rust | 基础系列 | Hello, Rust】编写并运行第一个Rust程序

文章目录 前言一&#xff0c;创建项目二&#xff0c;两种编译方式1. 使用rustc编译器编译2. 使用Cargo编译 总结 前言 在开始学习任何一门新的编程语言时&#xff0c;都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中&#xff0c;将会介绍如何在Rust中编写并运…

音频编辑必备技能:怎么将音频转换mp3

丽萨&#xff1a;嘿&#xff0c;听说你最近在研究音频格式转换的方法&#xff0c;有眉目了吗&#xff1f; 凯瑞&#xff1a;没错&#xff0c;我下载了很多高清音乐&#xff0c;发现有些格式的音频文件在我的播放器上打不开&#xff0c;所以想一个转换工具。但是网上软件太多&a…

使用腾讯云 Cloud studio 实现调度百度AI实现文字识别

文章目录 前言导入模块设置百度AI的APP_ID、API_KEY和SECRET_KEY定义路径和文件列表打开文本文件准备写入数据逐个处理图片文件关闭文本文件重复处理其他图片文件完整代码解释说明 运行效果 前言 今天我们也来高大上一下&#xff0c;玩一把人工智能。那就是免费调用百度AI实现图…

站外引流效果差?一文带你搞懂解海外主流社交媒体算法!

在流量成本越来越高的当下&#xff0c;无论是平台卖家还是独立站卖家都在努力拓展流量渠道。站外引流是推动业务增长的关键策略&#xff0c;很多卖家会把重点放在内容营销上&#xff0c;但其实除了做好内容之前&#xff0c;了解社交媒体的算法才能让营销效果最大化。 01.Faceb…

操作系统专栏2进程管理from 小林coding

进程管理 基本概念进程控制进程上下文切换 线程进程和线程的比较进程通信管道消息队列共享内存信号量信号socket 基本概念 进程:一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元.并行和并发:状态: 其中挂起是指没有给程序分配实际…

一百三十八、ClickHouse——使用clickhouse-backup备份ClickHouse库表

一、目标 使用clickhouse-backup在本地全库备份ClickHouse的数据库 二、前提 已经安装好clickhouse-backup 注意&#xff1a;由于之前同事已经按照好clickhouse-backup&#xff0c;所以我就没有安装 如有需要请参考其他人的博客安装一下&#xff0c;下面是我认为比较好的一…

如何看待前端已死这个问题(大学生篇)

小编刚大学毕业&#xff0c;还记得是大三的时候选择的前端开发方向&#xff0c;那个时候行情其实并没有这么差&#xff0c;最近互联网上讨论这一个很火的话题&#xff0c;叫前端已死。那么我就说说我的看法吧&#xff0c;虽然可能比起行业的大佬会比较短浅&#xff0c;但我想就…

盘点12个Vue 3的高颜值UI组件库

今天给大家盘点12个Vue 3的高颜值UI组件库&#xff0c;凡是用过Vue 框架开发项目的老铁们最少有用过其中一种或者二种以上的UI组件库&#xff0c;用广东话讲&#xff1a;个个都靓。 今天给大家盘点12个Vue 3的高颜值UI组件库&#xff0c;凡是用过Vue 框架开发项目的老铁们最少有…