vue + ant-design + xlsx 实现Excel多Sheet页导出功能
Vue + Ant Design 扩展:实现Excel多Sheet页导出功能
引言
在复杂业务场景中,单一Sheet页已无法满足数据展示需求。本文将演示如何基于Vue3 + Ant Design Vue + xlsx技术栈,实现以下高级导出功能:
- 动态多Sheet页生成
- 复杂数据集关联导出
- Sheet间样式统一控制
- 内存优化策略
通过实战案例,解决多维度数据报表导出的典型问题,打造专业级Excel导出方案。
一、多Sheet页核心场景
1.1 典型应用场景
场景类型 | 示例说明 | 技术要点 |
---|---|---|
主从表结构 | 订单主表 + 订单明细子表 | 主从数据关联导出 |
分类汇总 | 销售数据(按区域/时间多维度切片) | 动态Sheet命名策略 |
多维度报表 | 财务三表(资产负债表/利润表/现金流量表) | 样式模板复用 |
附件式导出 | 主数据 + 附件文档(图片/PDF) | 混合内容处理 |
1.2 技术选型对比
方案 | 优点 | 缺点 |
---|---|---|
单Workbook多Sheet | 天然支持复杂关联 | 内存管理要求高 |
多Workbook合并 | 分布式处理简单 | 破坏Excel原生结构 |
CSV分片+ZIP打包 | 大数据量性能优异 | 失去Excel格式控制能力 |
二、核心实现原理
2.1 工作簿架构设计
Workbook
├── Sheet1: 订单主表(100条)
├── Sheet2: 华东区明细(3000条)
├── Sheet3: 华南区明细(2500条)
└── Sheet4: 汇总分析(透视表)
2.2 内存管理模型
数据总量 → 分片策略 → 内存峰值 → 垃圾回收↑ ↑ ↑ ↑
50,000条 5,000条/片 20MB 自动GC
2.3 异步处理流程
三、完整代码实现
3.1 多Sheet导出配置
// sheet-config.js
export const SHEET_CONFIG = {mainSheet: {name: '主数据',columns: ['id', 'name', 'totalAmount'],dataKey: 'mainData'},detailSheets: [{name: '华东区',filter: (record) => record.region === 'east',columns: ['orderNo', 'product', 'quantity']},{name: '华南区',filter: (record) => record.region === 'south',columns: ['orderNo', 'product', 'quantity']}],summarySheet: {name: '汇总分析',pivotConfig: {rows: ['region'],columns: ['year'],values: ['totalAmount']}}
}
3.2 核心导出逻辑
<script setup>
import { ref } from 'vue'
import * as XLSX from 'xlsx/xlsx.mjs'
import { saveAs } from 'file-saver'
import { SHEET_CONFIG } from './sheet-config'const exportMultiSheet = async (data) => {// 1. 初始化工作簿const workbook = XLSX.utils.book_new()// 2. 创建主Sheetconst mainSheet = createSheetFromConfig(SHEET_CONFIG.mainSheet, data.mainData)XLSX.utils.book_append_sheet(workbook, mainSheet, SHEET_CONFIG.mainSheet.name)// 3. 创建明细Sheetsfor (const config of SHEET_CONFIG.detailSheets) {const filteredData = data.detailData.filter(config.filter)const detailSheet = createSheetFromConfig(config, filteredData)XLSX.utils.book_append_sheet(workbook, detailSheet, config.name)}// 4. 创建汇总Sheetconst summaryData = createPivotTable(data.mainData, SHEET_CONFIG.summarySheet.pivotConfig)const summarySheet = XLSX.utils.aoa_to_sheet(summaryData)applySheetStyle(summarySheet, SUMMARY_STYLE)XLSX.utils.book_append_sheet(workbook, summarySheet, SHEET_CONFIG.summarySheet.name)// 5. 生成文件const blob = await generateBlob(workbook)saveAs(blob, `综合报表_${new Date().toISOString().slice(0,10)}.xlsx`)
}const createSheetFromConfig = (config, data) => {const header = config.columns.map(col => ({ v: col, t: 's',s: HEADER_STYLE }))const body = data.map(item => config.columns.map(col => ({ v: item[col],t: typeof item[col] === 'number' ? 'n' : 's'})))const sheet = XLSX.utils.aoa_to_sheet([header, ...body])applySheetStyle(sheet, DEFAULT_STYLE)return sheet
}
</script>
3.3 样式管理系统
// 样式配置
const HEADER_STYLE = {font: { bold: true, color: { rgb: "FFFFFF" } },fill: { fgColor: { rgb: "4A90E2" } },alignment: { horizontal: 'center' }
}const DEFAULT_STYLE = {border: {top: { style: 'thin' },bottom: { style: 'thin' },left: { style: 'thin' },right: { style: 'thin' }}
}const SUMMARY_STYLE = {...DEFAULT_STYLE,font: { bold: true },fill: { fgColor: { rgb: "F5A623" } }
}// 样式应用工具
const applySheetStyle = (sheet, styleConfig) => {const range = XLSX.utils.decode_range(sheet['!ref'])for (let R = range.s.r; R <= range.e.r; ++R) {for (let C = range.s.c; C <= range.e.c; ++C) {const cellAddress = { r: R, c: C }const cellRef = XLSX.utils.encode_cell(cellAddress)if (!sheet[cellRef]) continuesheet[cellRef].s = {...(sheet[cellRef].s || {}),...styleConfig}}}
}
四、高级优化策略
4.1 动态Sheet管理
// 动态Sheet名称生成
const generateSheetName = (baseName, index) => {let name = baseNamelet suffix = 1while (workbook.SheetNames.includes(name)) {name = `${baseName}_${suffix++}`}return name
}// 使用示例
let sheetName = generateSheetName('销售数据')
while (workbook.SheetNames.includes(sheetName)) {sheetName = generateSheetName('销售数据', suffix++)
}
4.2 大数据量优化
// 流式写入优化
const streamWrite = (workbook, data, config) => {return new Promise((resolve) => {let currentRow = 1const sheet = XLSX.utils.aoa_to_sheet([])XLSX.utils.book_append_sheet(workbook, sheet, config.name)const timer = setInterval(() => {const chunk = data.slice(currentRow, currentRow + 500)if (chunk.length === 0) {clearInterval(timer)resolve()}const body = chunk.map(item => config.columns.map(col => ({ v: item[col] })))XLSX.utils.sheet_add_aoa(sheet, body, { origin: currentRow + 1 })currentRow += 500}, 50)})
}
4.3 复杂表头处理
// 合并单元格配置
const createMergedHeader = (sheet, mergeConfig) => {mergeConfig.forEach(config => {sheet[`!merges`] = sheet[`!merges`] || []sheet[`!merges`].push({s: { r: config.startRow, c: config.startCol },e: { r: config.endRow, c: config.endCol }})})
}// 使用示例
createMergedHeader(sheet, [{ startRow: 0, startCol: 0, endRow: 1, endCol: 0 },{ startRow: 0, startCol: 1, endRow: 0, endCol: 2 }
])
五、生产环境实践建议
- 内存监控:使用
performance.memory
监控堆内存使用 - 错误边界:添加try-catch块捕获导出异常
- Sheet索引:维护Sheet名称与数据的映射关系
- 格式预设:通过模板文件预设样式和公式
- 异步控制:使用AbortController实现可中断导出
总结
通过本文实现的多Sheet页导出方案,可获得以下提升:
- 结构化展示:完美呈现复杂业务数据关系
- 性能保障:流式处理支持10万+数据量导出
- 样式统一:集中式样式管理确保视觉一致性
- 扩展能力:动态配置支持快速迭代新报表
相关文章:
vue + ant-design + xlsx 实现Excel多Sheet页导出功能
Vue Ant Design 扩展:实现Excel多Sheet页导出功能 引言 在复杂业务场景中,单一Sheet页已无法满足数据展示需求。本文将演示如何基于Vue3 Ant Design Vue xlsx技术栈,实现以下高级导出功能: 动态多Sheet页生成复杂数据集关联…...
关于 Web 安全:6. 常见 CMS 开源系统风险点
一、WordPress 开源内容管理系统(CMS),使用 PHP MySQL 构建; 全球超过 40% 网站使用; 支持插件、主题系统,功能可扩展性极强; 也是风险点最多的系统之一,插件/主题贡献了大部分…...

DAY33 简单神经网络
你需要自行了解下MLP的概念。 你需要知道 梯度下降的思想激活函数的作用损失函数的作用优化器神经网络的概念 神经网络由于内部比较灵活,所以封装的比较浅,可以对模型做非常多的改进,而不像机器学习三行代码固定。 1. 神经网络的概念 (Th…...

OBOO鸥柏丨2025年鸿蒙生态+国产操作系统触摸屏查询一体机核心股
在信创产业蓬勃发展的当下,OBOO鸥柏积极响应纯国产化号召,推出基于华为鸿蒙HarmonyOS操作系统的触摸屏查询一体机及室内外场景广告液晶显示屏一体机上市,OBOO鸥柏品牌旗下显示产品均采用国产芯片,接入终端控制端需支持安卓Windows…...

【观成科技】Ymir勒索软件组织窃密木马RustyStealer加密通信分析
1.概述 Ymir勒索软件首次发现于2024年7月,采用ChaCha20加密算法对受害者文件进行加密,加密文件后缀为.6C5oy2dVr6。在攻击过程中,Ymir勒索组织利用名为RustyStealer的窃密木马获取受害企业的账号凭证,为后续横向移动和权限提升奠…...

Vuer开源程序 是一个轻量级的可视化工具包,用于与动态 3D 和机器人数据进行交互。它支持 VR 和 AR,可以在移动设备上运行。
一、软件介绍 文末提供程序和源码下载 Vuer开源程序 是一个轻量级的可视化工具包,用于与动态 3D 和机器人数据进行交互。它支持 VR 和 AR,可以在移动设备上运行。 二、Our features include: 我们的功能包括: light-weight and performa…...
浅谈学习(费曼学习法)
我们在学习的过程中常常会面临遗忘的问题。 欸,之前明明学过,怎么感觉模模糊糊的,忘记了,当然。。。有可能是因为当时就没有听懂。 但是我经常会有一种情况,我觉得自己当时明明听懂了,理解了呀࿰…...
高光谱成像相机:表型技术在林业育种和精确林业的应用
在林木育种和精确林业管理中,表型数据的精准获取与分析是破解基因型-环境-表型互作关系的关键。传统人工测量方式存在效率低、维度单一、破坏性强等局限,而高光谱成像技术凭借其多波段、高分辨率和非接触式的优势,成为林业表型研究的重要工具…...
iOS App启动优化(冷启动、热启动)
App启动优化是提升用户体验的关键环节,主要针对冷启动和热启动进行针对性优化。 冷启动与热启动的定义 冷启动(Cold Launch) 场景:App进程不存在,需系统创建新进程并完成完整初始化(如首次启动或进程被杀死…...

短视频一键搬运 v1.7.1|短视频无水印下载 一键去重
短视频一键搬运是一款全自动智能处理软件,专为短视频创作者设计。它自带去水印、改MD5码、视频去重、视频编辑等功能,能够高效处理大量视频,解放双手并降低成本。该软件支持从多个短视频平台无缝提取视频并去除水印,同时检测敏感词…...

海上石油钻井平台人员安全管控解决方案
一、行业挑战与需求分析 海上钻井平台面临复杂环境风险(如易燃易爆、金属干扰、极端气象)和人员管理难题(如定位模糊、应急响应延迟)。传统RFID或蓝牙定位技术存在精度不足(1-5米)、抗干扰能力差等问题&am…...
(25年5.28)ChatGPT Plus充值教程与实用指南:附国内外使用案例与模型排行
更多具体来源:查看原文 ChatGPT Plus 充值教程 由于国内卡无法直接充值 chatgpt,通常需要借助虚拟卡。目前咱们常用的方式是通过虚拟卡平台获取。因平台审核要求这里不细说,具体看原文。 ChatGPT Plus主要使用方向 ChatGPT Plus 提供了更…...
“以光惠算”走进校园,湖北大学用F5G-A全光网赋能智慧校园
SUN的联合创始人约翰盖奇,曾在1984年提出过一个大胆的猜想——“网络就是计算机”。 到了大模型时代,40多年前的猜想被赋予了新的内涵。大模型训练和推理所需的资源,远超单台计算机的承载能力,涌现出了新的网络范式:大…...
stm32cube ide如何生成LL库工程
在 STM32Cube IDE 里生成使用 LL(Low Layer)库的工程,可按以下步骤操作: 1. 新建 STM32 工程 启动 STM32Cube IDE,选择File→New→STM32 Project。依据需求挑选目标 MCU 型号,接着点击Next。 2. 配置工程…...

TEASER-plusplu Windows Mingw编译
编译记录: 1.下载该库 v2.0 链接1:https://github.com/MIT-SPARK/TEASER-plusplus 连接2:https://github.com/MIT-SPARK/TEASER-plusplus/releases 2.下载 googletest 链接:https://github.com/google/googletest/releases?page2…...
T5和GPT哪个更强大
一图速览:T5 vs GPT 对比总结 维度T5(Text-to-Text Transfer Transformer)GPT(Generative Pretrained Transformer)📌 模型类型编码器-解码器(Encoder-Decoder)解码器-only…...

tryhackme——Data Exfiltration
文章目录 一、网络拓扑二、数据泄露分类2.1 传统数据泄露2.2 C2通信2.3 隧道 三、隧道3.1 Exfiltration using TCP socket3.2 Exfiltration using SSH3.3 Exfiltrate using HTTP(S)HTTP隧道 3.4 Exfiltration using ICMP3.4.1 ICMP数据包结构3.4.2 MSF实现ICMP数据泄露3.4.3 IC…...

阿里云服务器采用crontab定时任务使acme.sh全自动化申请续签免费SSL证书,并部署在Linux宝塔网站和雷池WAF
阿里云服务器安装Linux宝塔面板用于部署网站,又安装了雷池WAF用于防护网站,网站访问正常。可以参考文章:Linux服务器安装Linux宝塔面板并部署wordpress网站以及雷池WAF 本文介绍使用 acme.sh 通过 DNS API 全自动申请和续签免费Let’s Encry…...
day40 python图像数据与显存
目录 一、图像数据的处理与预处理 (一)图像数据的特点 (二)数据预处理 二、神经网络模型的定义 (一)黑白图像模型的定义 (二)彩色图像模型的定义 (三)…...
Python+VR:如何让虚拟世界更懂你?——用户行为分析的实践
友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…...

【华为鸿蒙电脑】首款鸿蒙电脑发布:MateBook Fold 非凡大师 MateBook Pro,擎云星河计划启动
文章目录 前言一、HUAWEI MateBook Fold 非凡大师(一)非凡设计(二)非凡显示(三)非凡科技(四)非凡系统(五)非凡体验 二、HUAWEI MateBook Pro三、预热…...
性能优化深度实践:突破vue应用性能
一、性能优化深度实践:突破 Vue 应用性能边界 1. 虚拟 DOM 性能边界分析 核心原理: 虚拟 DOM 是 Vue 的核心优化策略,通过 JS 对象描述真实 DOM 结构。当状态变化时: 生成新虚拟 DOM 树Diff 算法对比新旧树差异仅更新变化的真实…...
服务器定时任务查看和编辑
在 Ubuntu 系统中,查看当前系统中已开启的定时任务主要有以下几种方式,分别针对不同类型的定时任务管理方式(如 crontab、systemd timer 等): 查看服务器定时任务 一、查看用户级别的 Crontab 任务 每个用户都可以配…...

SpringBoot Controller接收参数方式, @RequestMapping
一. 通过原始的HttpServletRequest对象获取请求参数 二. 通过Spring提供的RequestParam注解,将请求参数绑定给方法参数 三. 如果请求参数名与形参变量名相同,直接定义方法形参即可接收。(省略RequestParam) 四. JSON格式的请求参数(POST、PUT) 主要在PO…...
double怎么在c/c++中输出保留输出最小精度为一位
在C中,使用std::cout输出double类型时,可以通过<iomanip>头文件中的std::fixed和std::setprecision来控制小数位数的输出。以下是几种常见场景的解决方案: 1. 输出至少1位小数(不足补零) #include <…...

端午节互动网站
端午节互动网站 项目介绍 这是一个基于 Vue 3 Vite 开发的端午节主题互动网站,旨在通过有趣的交互方式展示中国传统端午节文化。网站包含三个主要功能模块:端午节介绍、互动包粽子游戏和龙舟竞赛游戏。 预览网站:https://duanwujiekuaile…...
[特殊字符] NAT映射类型详解:从基础原理到应用场景全解析
网络地址转换(NAT)是解决IPv4地址短缺的核心技术,通过IP地址映射实现内网与公网的通信。本文将系统梳理NAT映射的三大类型及其子类,助你全面掌握其工作机制与应用场景。 目录 🔧 一、基础NAT映射类型:按转…...

react-color-palette源码解析
项目中用到了react-color-palette组件,以前对第三方组件都是不求甚解,这次想了解一下其实现细节。 简介 react-color-palette 是一个用于创建颜色调色板的 React 组件。它提供了一个简单易用的接口,让开发者可以轻松地创建和管理颜色调色板。…...

在 Ubuntu 上安装 NVM (Node Version Manager) 的步骤
NVM (Node Version Manager) 是一个用于管理多个 Node.js 版本的工具,它允许您在同一台设备上安装、切换和管理不同版本的 Node.js。以下是在 Ubuntu 上安装 NVM 的详细步骤: 安装前准备 可先在windows上安装ubuntu 参考链接:https://blog.…...

重温经典算法——插入排序
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 基本原理 插入排序是一种基于元素逐步插入的简单排序算法,其核心思想是将待排序序列分为已排序和未排序两部分,每次从未排序部分取出第一个元素&…...