当前位置: 首页 > news >正文

Vue项目中如何实现表格选中数据的 Excel 导出

一、安装

npm install xlsx

二、核心代码

<template><div class="statistics-container"><el-button type="primary" @click="handleExportSelected">导出选中</el-button><el-table:data="tableData"borderstyle="width: 100%"@selection-change="handleSelectionChange"><el-table-column type="selection" width="55" /><el-table-column prop="index" label="序号" width="90" /><el-table-column prop="nickName" label="昵称" width="170" /><el-table-column prop="username" label="账号名" width="150" /></el-table></div>
</template><script lang="ts" setup>
import * as XLSX from "xlsx";
// 表格数据
const tableData = ref([]);// 选中项
const selectedRows = ref<any[]>([]);
const handleSelectionChange = (val: any[]) => {selectedRows.value = val;
};
// 导出选中
const handleExportSelected = () => {if (selectedRows.value.length === 0) {ElMessage.warning("请先选择要导出的数据");return;}// 准备导出数据const exportData = selectedRows.value.map((item) => {return {用户ID: item.userId,客户昵称: item.nickName,账号名: item.username,};});// 创建工作簿const ws = XLSX.utils.json_to_sheet(exportData);const wb = XLSX.utils.book_new();XLSX.utils.book_append_sheet(wb, ws, "列表数据");// 导出文件const fileName = `列表数据_选中_${new Date().getTime()}.xlsx`;XLSX.writeFile(wb, fileName);ElMessage.success(`成功导出${selectedRows.value.length}条数据`);
};
</script>

三、设置表头样式、实现列宽自适应

安装xlsx-js-style,设置单元格样式

npm install xlsx-js-style

import XLSX from "xlsx-js-style";
// 导出选中
const handleExportSelected = () => {if (selectedRows.value.length === 0) {ElMessage.warning("请先选择要导出的数据");return;}// 准备导出数据const exportData = selectedRows.value.map((item) => {return {用户ID: item.userId,客户昵称: item.nickName,账号名: item.username,};});// 创建工作簿const ws = XLSX.utils.json_to_sheet(exportData);// 设置表头样式const headerStyle = {font: {name: "Arial",sz: 12,bold: true,color: { rgb: "000000" },},fill: {fgColor: { rgb: "f3fff1" },},alignment: {horizontal: "center",vertical: "center",},border: {top: { style: "thin", color: { rgb: "000000" } },bottom: { style: "thin", color: { rgb: "000000" } },left: { style: "thin", color: { rgb: "000000" } },right: { style: "thin", color: { rgb: "000000" } },},};// 应用表头样式const range = XLSX.utils.decode_range(ws["!ref"]);for (let col = range.s.c; col <= range.e.c; col++) {const cell = ws[XLSX.utils.encode_cell({ r: 0, c: col })];if (cell) {cell.s = headerStyle;}}// 设置列宽自适应const colWidths = [];for (let col = range.s.c; col <= range.e.c; col++) {let maxWidth = 10;for (let row = range.s.r; row <= range.e.r; row++) {const cell = ws[XLSX.utils.encode_cell({ r: row, c: col })];if (cell && cell.v) {const cellLength = cell.v.toString().length;if (cellLength > maxWidth) {maxWidth = cellLength;}}}// 限制最大宽度为50,最小宽度为20colWidths.push({ wch: Math.min(Math.max(maxWidth + 2, 20), 50) });}ws["!cols"] = colWidths;const wb = XLSX.utils.book_new();console.log(ws);XLSX.utils.book_append_sheet(wb, ws, "列表数据");// 导出文件const fileName = `列表数据_选中_${new Date().getTime()}.xlsx`;XLSX.writeFile(wb, fileName);ElMessage.success(`成功导出${selectedRows.value.length}条数据`);
};

四、效果展示

在这里插入图片描述

http://www.dtcms.com/a/456991.html

相关文章:

  • 【多模态学习】QA7: GRPO算法?KL散度指的是什么?什么叫做长思维连冷启动?模型退火是什么意思?
  • 无人机_鲁棒性
  • 用自己的计算机做服务器建网站海外模板网站有哪些
  • 检测MODBUS通讯连接 (MODBUS POLL)
  • 数据结构(陈越,何钦铭)期末考试
  • 接口测试-Postman的关联
  • 重庆网站建设快忻科技国外h5汇总网站
  • 解决 LÖVE 引擎 liblua.so.5.4 库缺失问题
  • 从原始数据到实时防御:与 John Hammond 的对话
  • JavaScript事件流:冒泡与捕获的深度解析
  • 避免网站侵权免费域名申请 freenom最新
  • 【C++进阶】---- 红黑树实现
  • 【多模态学习】QA6: 什么是MOE架构?Router Z Loss函数是指什么?
  • 做seo网站公司jsp做网站还
  • 本地部署javaweb项目到Tomcat的三种方法
  • 中秋月满,心却不满
  • VSCode 中 c_cpp_properties.json 配置项 includePath 通配符“**”含义
  • 电商网站建设要多少钱建设银行官方网站入口
  • VS Code配置Python开发环境系列(1)___VScode的安装 ,VScode常用快捷键
  • Redis 集群分片算法
  • 【MYSQL】SQL学习指南:从常见错误到高级函数与正则表达式
  • 个人网站开发 怎么赚钱吗wordpress阿里图标库
  • 镇江网站推广排名有回定ip怎么做网站
  • Windows 11系统鼠标键盘被禁用问题的全面解决方案
  • 多字节串口收发IP设计(一)概述
  • python如何使用abd操作手机
  • PHP SimpleXML 深入解析与应用
  • C# MVC 修复DataTable时间排序以及中英文系统的时间筛选问题
  • 【netty实战】从零构建一个带GUI的简易聊天室
  • 阿里云无主体新增网站阿里云网站用什么做的