前端实现导出element-plus表格和从后端获取数据导出,支持勾选导出

article/2025/8/11 15:44:46

1. 纯前端实现导出

安装file-saver和xlsx
file-saver: 用于在浏览器中触发文件的保存下载(保存为本地文件)。
使用场景: 当已经在 JavaScript 中生成了文件(如 Blob 对象),并想让用户保存它时使用。

npm install file-saver

xlsx: 读写 Excel 文件(.xlsx),支持从数据生成 Excel 文件或从 Excel 文件中解析数据。
使用场景:从前端导出 JSON 为 .xlsx 文件;从 .xlsx 文件中读取数据进行展示或处理。

npm install xlsx

在这里插入图片描述

导出element-plus表格,支持勾选导出,不勾选默认导出全部数据:

只导出勾选项:
在这里插入图片描述

<template><el-button:disabled="tableData.length === 0"@click="handleExport()"style="margin-bottom: 6px">导出</el-button><el-table:data="tableData"style="width: 100%"@selection-change="handleSelectionChange"><el-table-column type="selection" width="55" /><el-table-column prop="date" label="日期" width="120"></el-table-column><el-table-column prop="name" label="姓名" width="120" /><el-table-column prop="address" label="地址" /><el-table-column prop="status" label="状态" width="85"><template #default="{ row }"><el-tag effect="dark" size="small" :type="getStatusTagType(row.status)" disable-transitions>{{ getStatusText(row.status) }}</el-tag></template></el-table-column></el-table>
</template><script setup>
import { ref, computed } from 'vue';
import * as XLSX from 'xlsx';
import FileSaver from 'file-saver';const tableData = [{date: '2016-05-04',name: 'Aleyna Kutzner',address: 'Lohrbergstr. 86c, Süd Lilli, Saarland',status: 0,},{date: '2016-05-03',name: 'Helen Jacobi',address: '760 A Street, South Frankfield, Illinois',status: 1,},{date: '2016-05-02',name: 'Brandon Deckert',address: 'Arnold-Ohletz-Str. 41a, Alt Malinascheid, Thüringen',status: 2,},{date: '2016-05-01',name: 'Margie Smith',address: '23618 Windsor Drive, West Ricardoview, Idaho',status: 1,},
];
const mergeRows = ref([]);
const STATUS_TEXT = {0: '未处理',1: '已处理',2: '已取消',
};
const STATUS_TAG_TYPE = {0: 'danger',1: 'primary',2: 'info',
}
const getStatusText = computed(() => status => STATUS_TEXT[status]);
const getStatusTagType = computed(() => status => STATUS_TAG_TYPE[status]);const handleSelectionChange = selection => {mergeRows.value = selection;
};const handleExport = async (fileName = 'export.xlsx') => {const originalData =mergeRows.value.length === 0 ? tableData : mergeRows.value;const headers = [{ key: 'date', title: '日期', width: 20 },{ key: 'name', title: '姓名', width: 30 },{ key: 'address', title: '地址', width: 60 },{ key: 'status', title: '状态', width: 20, formatter: getStatusText.value },];const data = originalData.map(row =>Object.fromEntries(headers.map(({ key, title, formatter }) => [title,formatter ? formatter(row[key]) : row[key],])));// 生成 Sheetconst worksheet = XLSX.utils.json_to_sheet(data);// 设置列宽worksheet['!cols'] = headers.map(({ width }) => ({ wch: width }));const workbook = XLSX.utils.book_new();XLSX.utils.book_append_sheet(workbook, worksheet);// 导出 Excelconst excelBuffer = XLSX.write(workbook, {bookType: 'xlsx',type: 'array',});const blob = new Blob([excelBuffer], { type: 'application/octet-stream' });FileSaver.saveAs(blob, fileName);// 浏览器将下载 export.xlsx文件
};
</script>

2. 从后端获取数据导出

  1. 情形1:后端返回链接的导出:window.location.href = 链接地址
  2. 情形2:返回二进制/base数据的导出:先将得到的数据转成二进制,再用 new Blob()处理二进制生成文件,使用 createObjectURL() 生成链接,创建 a 标签元素模拟点击事件
async function handleExport() {const params = {selected_ids: mergeRows.value.map(row => row.id),};const res = await exportReservation(params);if (res.status===200) {// 返回的是base64编码const fileContent = res.data;// base64转为二进制const binaryString = atob(fileContent);const bytes = new Uint8Array(binaryString.length);for (let i = 0; i < binaryString.length; i++) {bytes[i] = binaryString.charCodeAt(i);}// 生成blobconst blob = new Blob([bytes], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});// 创建下载链接const url = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'xxx.xlsx';document.body.appendChild(a);a.click();// 清理window.URL.revokeObjectURL(url);document.body.removeChild(a);ElMessage.success('导出成功');} else {ElMessage.error('导出失败';}
}

http://www.hkcw.cn/article/YTQCRLqmhK.shtml

相关文章

Stable Diffusion学习指南【ControlNet上篇】- 功能介绍、安装和使用

&#xff08;注&#xff1a;文末扫码获取AI工具安装包和AI学习资料&#xff09; 自 SD 系列教程发布这几个月&#xff0c;已被大家多次催更 ControlNet 的教程&#xff0c;相信很多朋友也都听说过这款神奇的控图工具。ControlNet 到底是什么&#xff1f;为什么作为一款插件它可…

论文阅读 | CVPR | MambaOut:视觉任务真的需要 Mamba 吗?

文章目录 论文阅读 | CVPR | MambaOut&#xff1a;视觉任务真的需要 Mamba 吗&#xff1f;摘要引言创新点概念讨论Mamba到底适合处理什么样的任务&#xff1f;视觉任务具有很长的序列吗&#xff1f;如何计算Transformer 模块的浮点运算次数&#xff08;FLOPs&#xff09;?定义…

基于 Q-learning 的城市场景无人机三维路径规划算法研究,可以自定义地图,提供完整MATLAB代码

一、引言 随着无人机技术的不断发展&#xff0c;其在城市环境中的应用越来越广泛&#xff0c;如物流配送、航拍测绘、交通监控等。然而&#xff0c;城市场景具有复杂的建筑布局、密集的障碍物以及多变的飞行环境&#xff0c;给无人机的路径规划带来了巨大的挑战。传统的路径规…

Vivado IP核之定点数累加Accumulator使用说明

Vivado Accumulator IP核的使用说明 配置步骤 目录 前言 一、Accumulator IP配置步骤 二、仿真 三、仿真分析 总结 前言 在现代数字信号处理和通信系统中&#xff0c;对数据进行快速而精确的累加操作是至关重要的。Vivado Accumulator IP核提供了一种灵活、可配置的硬件累…

中科院自动化所万字长文最新综述!当无人机遇上大模型:低空机动性智能体的综述与展望

作者&#xff1a;Yonglin Tian, Fei Lin, Yiduo Li, Tengchao Zhang, Qiyao Zhang, Xuan Fu, Jun Huang, Xingyuan Dai, Yutong Wang, Chunwei Tian, Bai Li, Yisheng Lv, Levente Kovacs, Fei-Yue Wang 单位&#xff1a;中科院自动化所多模态人工智能系统国家重点实验室&…

(35)远程识别(又称无人机识别)(一)

文章目录 前言 1 更改 2 可用的设备 3 开放式无人机ID 4 ArduRemoteID 5 终端用户数据的设置和使用 6 测试 7 为OEMs添加远程ID到ArduPilot系统的视频教程 前言 在一些国家,远程 ID 正在成为一项法律要求。以下是与 ArduPilot 兼容的设备列表。这里(here)有一个关于远…

Uniapp 自定义TabBar + 动态菜单实现教程(Vuex状态管理详解)

大家好&#xff0c;我是一诺。今天跟大家分享一下uniapp 封装自定义底部导航栏&#xff08;TabBar&#xff09; 过程中的思考和实践。通过本文&#xff0c;你将学会如何打造一个功能完善、可自由定制的TabBar组件&#xff01; 先看效果&#xff1a; 支持自定义图标和样式动态…

图数据库Neo4j和JDK安装与配置教程(超详细)

目录 前言 一、Java环境配置 &#xff08;一&#xff09;JDK的下载与安装 &#xff08;二&#xff09;JDK环境配置 &#xff08;三&#xff09;检测JDK17是否配置成功 二、Neo4j的安装与配置 &#xff08;一&#xff09;Neo4j的下载与安装 &#xff08;二&#xff09;N…

【机器人-基础知识】欧拉角、旋转矩阵和四元数

文章目录 1. 欧拉角1.1. 欧拉角的定义1.2. 欧拉角的公式1.3. 欧拉角的常见问题 2. 旋转矩阵2.1. 旋转矩阵的定义2.2. 常见旋转矩阵的公式1. 二维旋转矩阵2. 三维旋转矩阵 2.3. 旋转矩阵的示例1. 二维示例2. 三维示例 2.4. 旋转矩阵的问题 3. 四元数3.1. 四元数的定义3.2. 四元数…

arcane:Docker 管理的现代 Web 界面

arcane&#xff1a;Docker 管理的现代 Web 界面 arcane Simple and Elegant Docker Management UI written in Typescript and SvelteKit 项目地址: https://gitcode.com/gh_mirrors/arcane2/arcane 项目介绍 在容器化技术日益普及的今天&#xff0c;Docker 已经成为开…

对话肖风博士(上):美元稳定币立法是技术创新的胜利,但影响将非常复杂

【导言】随着美国参议院通过美元稳定币法案的投票动议&#xff0c;以及香港立法会通过港元稳定币条例草案&#xff0c;稳定币快速成为最热门的行业话题&#xff0c;并且吸引了更广泛的关注。人们普遍预期&#xff0c;随着美元稳定币法案的落地&#xff0c;区块链数字经济将迎来…

极氪能源三方桩规模突破130万枪 构建全域充电生态

5月30日,极氪能源宣布其接入的第三方充电桩规模已突破130万枪。这一成就源于极氪能源与近50家主流运营商的合作,形成了战略合作生态。目前,极氪能源三方规模已实现地级行政单位全覆盖,拥有5604座高速站点和7943座超快充站,显著提升了新能源出行效率和用户充电体验。极氪能…

成都通报男子伤人后自伤颈部 警方发布警情详情

新京报讯 5月30日,成都市公安局锦江区分局发布警情通报:编辑 毛天宇责任编辑:0764

清华大学发布李兆杰讣告 沉痛悼念国际法学者

5月29日晚,清华大学法学院发布讣告,沉痛悼念李兆杰教授。李兆杰教授于2025年5月29日在北京因病逝世,享年70岁。李兆杰是汉族,籍贯山东省东明县,1955年出生于吉林省长春市。他曾在北京大学国际法研究所和清华大学法学院任教。作为改革开放以来我国新一代国际法学者中的领军…

SMS凭据管理系统:实现跨平台特权账号安全管理的创新实践

引言&#xff1a;数字化转型中的特权账号管理困境 在数字化转型加速的今天&#xff0c;企业IT架构呈现混合云、多平台、异构数据库并存的复杂态势。据Gartner统计&#xff0c;超过75%的数据泄露事件与特权账号滥用相关&#xff0c;而传统静态密码管理方案已无法满足动态安全需…

端午将至民俗体验游热度上升 亲子家庭成出行主力

今年端午节假期恰逢儿童节,亲子家庭成为出行主力军。短途游和民俗体验游热度持续上升。端午节假期旅游市场主要以本地游和周边游为主,微度假与民俗体验相结合的旅游方式受到游客青睐。数据显示,今年端午节假期,周边游预订量同比增长23%,市场整体呈现稳步增长态势,端午民俗…

ResNet改进(44):深度可分离卷积在ResNet50中的应用

1.创新点分析 在深度学习领域,卷积神经网络(CNN)一直是计算机视觉任务的主力架构。 然而,随着模型复杂度的增加,如何在保持性能的同时减少计算量和参数数量成为了一个重要课题。本文将深入解析一个将深度可分离卷积(Depthwise Separable Convolution)应用于ResNet50的Pyth…

2025年 Java 面试八股文(20w字)

> &#x1f345;我是小宋&#xff0c; 一个只熬夜但不秃头的Java程序员。 > &#x1f345;关注我&#xff0c;带你**过面试,读源码**。提升简历亮点&#xff08;14个demo&#xff09; > &#x1f345;我的面试集已有12W 浏览量。 > 号&#xff1a;…

《苍穹外卖》电商实战项目(java)知识点整理(P1~P65)【上】

史上最完整的《苍穹外卖》项目实操笔记&#xff0c;跟视频的每一P对应&#xff0c;全系列10万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。 《苍穹外卖》项目实操笔记【中】&#xff1a;P66~P…

安装openjdk21

1、官网 官网地址&#xff1a;OpenJDK 下载地址&#xff1a;Archived OpenJDK GA Releases 2、下载openjdk > wget https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz --2024-12-21 11:40:20--…