vue3表格导入导出.xlsx

在这次使用时恰好整出来了,希望大家也能学习到,特此分享出来

使用前确保安装以下模块,最好全局配置element-plus

### 展示一下

###

###导出选项

###

###导入de数据

###

安装的模块

npm install js-table2excel // 安装js-table2excel
npm install xlsx // 安装xlsx
npm install dayjs // 安装dayjs
npm install axios // 安装axios
element-plus全局配置地址:快速开始 | Element Plus

依次根据官网步骤进行引入即可,不在过多介绍

接口文件配置,例如utlis/api.js
// api.js
import axios from 'axios'

const api = axios.create({
  baseURL: 'http://localhost:3000', // 后端接口地址
  timeout: 5000,
})

export default api;

vue页面的构局/前端

样式部分
<template>
    <div>
        <el-card class="box-card1">
            <div style="display: flex; align-items: center;margin: 15px;">
                <el-upload action="#" :show-file-list="false" :before-upload="importBefore" accept=".xls,.xlsx"
                    style="margin: 0 12px;display: flex;align-items: center;">
                    <el-button type="success" plain>表格导入</el-button>
                </el-upload>
                <el-button type="success" plain @click="userExport">导出表格</el-button>
            </div>

            <div style="margin-left:1.875rem; margin-top: 2.125rem;">
                <el-table :data="tableData" style="width:100%" ref="tableRef">
                    <el-table-column type="selection" width="50" align="center" />
                    <el-table-column width="100">
                        <template #default="scope">
                            <!-- {{scope.row.name}} -->
                            <template v-if="scope.row.level === '1'"><el-button type="danger" round size="small">重大
                            </el-button></template>
                            <template v-else-if="scope.row.level === '2'"><el-button type="success" round size="small">非重大
                            </el-button></template>
                        </template>
                    </el-table-column>
                    <el-table-column width="280">
                        <template #default="scope">
                            <div>
                                <h4>案件编码:{{ scope.row.anjbm }}</h4>
                            </div>
                            <div><span>案件名称:{{ scope.row.name }}</span></div>
                        </template>
                    </el-table-column>
                    <el-table-column width="280">
                        <template #default="scope">
                            <div><span>我方地位:{{ scope.row.mypos }}</span></div>
                            <div><span>提交时间:{{ dayjs(scope.row.date).format("YYYY-MM-DD hh:mm:ss") }}</span></div>
                        </template>
                    </el-table-column>
                    <el-table-column width="200">
                        <template #default="scope">
                            <div><span>案件类型:{{ scope.row.style }}</span></div>
                            <template v-if="scope.row.status === 1">
                                <div><span>案件进展:进展中</span></div>
                            </template>
                            <template v-else-if="scope.row.status === 2">
                                <div><span>案件进展:暂无进展</span></div>
                            </template>
                            <template v-else-if="scope.row.status === 3">
                                <div><span>案件进展:已审理结案</span></div>
                            </template>
                            <!-- <div><span>状态:{{ scope.row.status == 1 ? '进展中' : scope.row.status == 2 ? '暂无进展' : '已审理结案' }}</span></div> -->
                        </template>
                    </el-table-column>
                    <el-table-column width="200">
                        <template #default="scope">
                            <el-progress :percentage="scope.row.schedule" />
                        </template>
                    </el-table-column>
                    <el-table-column width="280">
                        <template #default="scope">
                            <div>
                                <template v-if="scope.row.flag === 1">
                                    <el-button size="small" link>新增执行</el-button>
                                    <el-button size="small" text>修改执行</el-button>
                                    <el-button size="small" text>执行结果</el-button>
                                </template>
                                <template v-else-if="scope.row.flag === 2">
                                    <el-button size="small" link>新增执行</el-button>
                                </template>
                                <template v-else-if="scope.row.flag === 3">
                                </template>
                            </div>
                        </template>
                    </el-table-column>
                </el-table>
            </div>
        </el-card>
</template>
功能部分
<script setup>
import { ElMessage, ElButton, ElLoading } from 'element-plus'
import table2Excel from 'js-table2excel'
import * as XLSX from "xlsx"
import api from '../utils/api'
import dayjs from "dayjs";
import { ref, onMounted, reactive, toRefs, h } from 'vue'
import axios from 'axios'
import { ElMessageBox } from 'element-plus'
const dialogVisible = ref(false)

const state = reactive({
    tableData: [
        // {
            // level:'1',
            // anjbm:'A202311111009',
            // name:'某某酒驾撞人案件',
            // mypos:'被告',
            // date:'2023-11-19 09:42:09',
            // style:'劳动争议案件',
            // status:1
            // schedule:80
            // flag:1
        // }
    ],  //模拟请求数据
    exportConfig: [  //导出Excel表格配置
        {
            title: '案件级别',
            key: 'level',
            type: 'text'
        },
        {
            title: '案件编码',
            key: 'anjbm',
            type: 'text'
        },
        {
            title: '案件名称',
            key: 'name',
            type: 'text'
        },
        {
            title: '我方地位',
            key: 'mypos',
            type: 'text'
        },
        {
            title: '提交时间',
            key: 'date',
            type: 'text'
        },
        {
            title: '案件类型',
            key: 'style',
            type: 'text'
        },
        {
            title: '案件进展',
            key: 'status',
            type: 'text'
        },
        {
            title: '案件进度',
            key: 'schedule',
            type: 'text'
        },
        {
            title: '功能区',
            key: 'flag',
            type: 'text'
        },
        //  图片配置
        // {
        //   title: '头像',
        //   key: 'imgs',
        //   type: 'image'
        // },

    ],
    formatColumns: [ // 导出特殊字段处理
        {
            prop: 'status',
            option: {
                '1': '进展中',
                '2': '暂无进展',
                '3': '已审理结案'
            },
        },
        {
            prop: 'level',
            option: {
                '1': '重大',
                '2': '非重大',
                '3': '已结案'
            },
        },
    ]
})
const { tableData, exportConfig, formatColumns } = toRefs(state)

const tableRef = ref()

// 表格导出
const userExport = () => {
    ElMessageBox({
        title: '导出Excel表格',
        draggable: true,
        showCancelButton: true,
        showConfirmButton: false,
        message: h('div', null, [ // 这里用到了h函数
            h(ElButton, { text: true, type: 'primary', innerHTML: '导出选中数据', onClick: assignExport }),
            h(ElButton, { text: true, type: 'success', innerHTML: '导出所有数据', onClick: allExport })
        ]),
        cancelButtonText: '取消',
    }).then((res) => { }).catch((res) => { })
}

// 选中数据导出
const assignExport = () => {
    // getSelectionRows  Element Plus table表格组件方法,获取当前选中的数据
    let arr = tableRef.value.getSelectionRows()
    if (!arr.length) {
        return ElMessage({
            message: '请选择需要导出的数据',
            type: 'warning',
        })
    }
    ElMessageBox.close() // 关闭弹出框
    const loading = ElLoading.service({ // 打开遮罩层
        lock: true,
        text: '请稍等...',
        background: 'rgba(255, 255, 255, 0.5)',
    })
    let list = JSON.stringify(tableRef.value.getSelectionRows())
    list = formatExportData(JSON.parse(list))
    table2Excel(state.exportConfig, list, '案件进展批量导出')
    loading.close() // 关闭遮罩层
}

// 所有数据导出
const allExport = () => {
    ElMessageBox.close() // 关闭弹出框
    const loading = ElLoading.service({ // 打开遮罩层
        lock: true,
        text: '请稍等...',
        background: 'rgba(255, 255, 255, 0.5)',
    })
    let list = JSON.stringify(state.tableData) // 用定义的数据
    list = formatExportData(JSON.parse(list))
    table2Excel(state.exportConfig, list, '案件进展全部导出')
    loading.close() // 关闭遮罩层
}

const formatExportData = (list) => {
    // 处理特殊字段
    list.forEach((item) => {
        state.formatColumns.forEach((i) => {
            item[i.prop] = i.option[item[i.prop]]
        })
        for (let key in item) {
            if (!item[key] && item[key] == null) {
                item[key] = ""
            }
        }
    });
    return list
}

// 表格导入
const importBefore = (file) => {
    const reader = new FileReader();
    reader.onload = (e) => {
        const data = e.target.result;
        const workbook = XLSX.read(data, { type: "array" });
        const firstSheetName = workbook.SheetNames[0];
        const worksheet = workbook.Sheets[firstSheetName];
        const results = XLSX.utils.sheet_to_json(worksheet);
        importAdd(results)
    };
    reader.readAsArrayBuffer(file);
}

const importAdd = (list) => {
    // 处理上传时excel中特殊字段
    list.forEach((item) => {
        state.exportConfig.forEach((i) => {
            item[i.key] = item[i.title]
            delete item[i.title]
        })
        for (let key in item) {
            if (key == "date") {
                item[key] = ExcelDateToJSDate(item[key])
            }
        }
    })
    list = convertImportData(list)
    // 调用后台接口进行批量添加
    api.post('/l/madd', list)
        .then(response => {
            getdata()
            console.log('res', response.data);
            return response.data
        })
        .catch(error => {
            throw new Error(error)
        })
}

// 处理日期时间
const ExcelDateToJSDate = (serial) => {
    // 原始的
    // var utc_days = Math.floor(serial - 25569);
    // var utc_value = utc_days * 86400;
    // var date_info = new Date(utc_value * 1000);
    // var fractional_day = serial - Math.floor(serial) + 0.0000001;
    // var total_seconds = Math.floor(86400 * fractional_day);
    // var seconds = total_seconds % 60;
    // total_seconds -= seconds;
    // var hours = Math.floor(total_seconds / (60 * 60));
    // var minutes = Math.floor(total_seconds / 60) % 60;
    // return new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate(), hours, minutes, seconds);

    // 更改后的,引入dayjs包后做的改进
    return dayjs(serial).format("YYYY-MM-DD hh:mm:ss")
}

// 返回上传的Excel文件
const convertImportData = (list) => {
    console.log(list);
    list.forEach((item) => {
        state.formatColumns.forEach((i) => {
            for (let key in i.option) {
                if (item[i.prop] == i.option[key]) {
                    item[i.prop] = key
                }
            }
        })
        for (let key in item) {
            if (!item[key] && item[key] == undefined) {
                item[key] = ""
            }
        }
    });
    return list
}

// 渲染数据的vue3钩子函数,并不会刷新页面
const getdata = onMounted(async () => {
    const { data } = await axios.get('/l/case/show')
    state.tableData = data.data
})
</script>

样式自己搭建即可,不再演示辣

vue后端接口的布局

之前已经讲解过数据库的搭建,mongoose搭建步骤 <-----查看创建步骤

也可根据mongoose官网:Mongoose.js中文网

以下是各接口的简单搭建

后端展示数据接口
// 数据全部展示
router.get("/case/show",async function(req,res){
  let data=await caseprogressModel.find()
  
  res.send({code:200,message:'caseshow ok',data})
})
后端批量添加接口
// 批量添加接口
router.post('/madd',async function(req, res, next) {
  const body= req.body
  console.log(body);
  const insertedData = await caseprogressModel.insertMany(body)
  res.send({code:"200",message:'madd ok',data: insertedData})
});

最终效果展示:

vue导入导出

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

翻译: LLMs离通用人工智能AGI有多远 20个小时学会开车 Artificial General Intelligence

AGI&#xff0c;即人工通用智能&#xff0c;是一个令人兴奋的概念。我认为围绕它的一些混淆源于“通用”这个词的使用。正如您所知&#xff0c;人工智能是一种通用技术&#xff0c;意味着它对许多不同的事情都有用。大型语言模型的崛起导致了像ChatGPT这样的单一模型可以用于许…

Java发起SOAP请求代码参考

目录 Java发起SOAP请求代码参考 代码1.组装参数2.加密参数3.发起连接4.解析返回数据 参考 文章所属专区 超链接 代码 1.组装参数 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&qu…

AUTOSAR CanTSyn模块配置与代码实现(二)

AUTOSAR CanTSyn模块配置与代码实现 1、FUP message处理 CanTSyn_process_FUP_message 先比较和SYNC报文的Sequence是否相等&#xff0c;如果不相等则不接受该报文。 然后调用CanTSyn_unpack_store_fup处理fup报文。 获取接收到FUP时的本地时间&#xff0c;并与接收到的SYNC…

虚拟机无法进入系统问题

概述 客户在华为云平台上创建了两台虚拟机并部署aarch64 V10 OS&#xff0c;2021-10-28其中一台虚拟机业务出现异常&#xff0c;运维重启虚拟机后系统进不去&#xff0c;左上角光标闪烁&#xff0c;接着重启另一台虚拟机同样起不来&#xff0c;现象一致。 分析 通过分析现场…

天眼销使用指南

刚做销售的你&#xff0c;打电话是不是总是被客户拒决&#xff1f;要不打过去就是空号错号、找不着人&#xff1f;更甚者连客户电话都不知道&#xff1f; 如何快~速找到目标客户准确的联系方式呢&#xff1f;赶紧把这份使用指南请收好&#xff0c;客户不用愁。 1、进入【天眼…

0. Java简介与安装配置

0. Java简介与安装配置 文章目录 0. Java简介与安装配置1.1 Java简介1.2 Java特性1.2 Linux环境安装1.3 Windows环境安装1.3.1 下载JDK安装包1.3.2 安装JDK3. 配置JAVA环境4. 检验安装是否成功 1.3 开发工具参考文献 1.1 Java简介 Java是一门面向对象]编程语言&#xff0c;不仅…

部分常用算法笔记

一、简单易考 1、冒泡排序 https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896 for i:0;i<length;i { for j:0;j<length-i-1;j { if array[j] > array[j1] { array[j1],array[j] array[j],array[j1] } } } 2、求数组最大最小值。 1&#xff09;O(…

Hudi 表类型和查询类型

数据湖hudi的表类型定义了数据在DFS上如何组织布局&#xff0c;同时实现一些timeline等操作&#xff08;表类型定定义数据是如何写入的&#xff09;&#xff1b;查询类型则是定义如何读取DFS上的数据。 Table typequery typeCopy-On-Write 快照查询&#xff1b; 增量查询&…

若依系列框架RuoYi(104集),RuoYi-Vue(121集)、RuoYi-Cloud(134集)最新完整视频.txt

若依系列框架RuoYi(104集),RuoYi-Vue&#xff08;121集&#xff09;、RuoYi-Cloud&#xff08;134集&#xff09;最新完整视频.txt

C/C++ BM1反转链表

文章目录 前言题目1.解决方案一1.1 思路阐述1.2 源码 2. 解决方案二2.1 思路阐述2.2 源码 总结 前言 这题是牛客网的BM1&#xff0c;主要涉及到链表的操作以及栈数据结构的使用。 题目 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的…

Arduino开发实例-液体流量测量

液体流量测量 文章目录 液体流量测量1、流量传感器介绍2、硬件准备及接线3、代码实现在本文中,将介绍如何流量传感器进行测量液体流量。 流量传感器用于测量液体流速。 市场上有不同类型的流量传感器,在本文中,我们将使用霍尔效应流量传感器。 这些类型的流量传感器是非侵入…

不是私域难做,是我们做私域的方法该换了!

最近&#xff0c;有一些声音在不断变多&#xff1a;私域越来越难做了&#xff01;许多过去做私域的成功经验&#xff0c;今天好像都不奏效了。 在业绩层面上&#xff0c;很多企业一开始还能通过大量拉新、信息轰炸这种“博概率”的方式获得销量&#xff0c;但时间一长&#xf…

Tomcat远程调试

windows环境 写一个 startup-debug.bat&#xff0c;指定tomcat的根目录&#xff0c;端口自己定义 rem *******设置Tomcat目录*******-- set CATALINE_HOMED:\asd\A8-2\tomcat d: rem 8787为可用端口,为远程调试监听端口-- cd %CATALINE_HOME%/bin set JPDA_ADDRESS8787 set J…

DriveWorks Solo捕获参数(三)

捕获参数 - 木门和矩形窗 木质门 下一个组件是木门本身。除了尺寸之外&#xff0c;门还具有需要控制的功能。 让我们首先捕获尺寸。 通过单击“捕获资源管理器”中的标题来激活“捕获的模型”部分。 双击任务窗格树中的模型木门以在 SOLIDWORKS 中将其打开。捕获以下尺寸。…

【Python目标识别】Yolo v5-7.0版本中文标签显示方法(附字体链接)

Yolo的程序之前已经定制化输出过了&#xff0c;但是最近业主突然想要中文的标签&#xff0c;所以赶紧去修改了一下源代码&#xff0c;从网上发现很多资料都改这改那&#xff0c;搞四五个文件结果还没成功。所以自己研究了一下&#xff0c;现在已经完美解决了。今天就和大家分享…

转移mysql中的数据

目录 1 mysqldump 2 将数据库中的数据转换为一个sql文件 3 执行sql文件 1 mysqldump 转移数据需要用到mysqldump。默认情况下mysqldump会自动被安装上&#xff0c;如果没有用不了&#xff0c;建议重新安装一下 参考 mysqldump 命令安装:_mob649e8162c013的技术博客_51…

0155 - Java 数组

1 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数(数据)组(一组)就是一组数据 2 数组的使用 2.1 使用方式一 2.2 使用方式二 3 数组使用注意事项和细节 数组是多个相同类型数据的组合&#xff0c;实现对这些数据…

为你自己学laravel - 15 - model的更新和删除

为你自己学laravel。 model的部分。 这一次讲解的是model当中怎么从数据库当中更新数据和删除数据。 先从数据库当中抓出来资料。 当然我们是使用php artisan tinker进入到终端机。 我们的做法是想要将available这个栏位修改成为true。 第一种更新方法 上面我们就是修改了对…

智能优化算法应用:基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.学生心理学算法4.实验参数设定5.算法…

RocketMQ系统性学习-RocketMQ原理分析之Broker接收消息的处理流程

Broker接收消息的处理流程&#xff1f; 既然要分析 Broker 接收消息&#xff0c;那么如何找到 Broker 接收消息并进行处理的程序入口呢&#xff1f; 那么消息既然是从生产者开始发送&#xff0c;消息是有单条消息和批量消息之分的&#xff0c;那么消息肯定是有一个标识&#…
最新文章