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

vue + ant-design + xlsx 实现表格导出进度提示功能

Vue + Ant Design 扩展:实现表格导出进度提示功能

引言

在处理大数据量(10万+条)表格导出时,常面临以下问题:

  1. 浏览器卡顿无响应
  2. 导出进度不可见
  3. 导出失败无反馈

本文将深度扩展以下功能:

  • 分片数据加载机制
  • 实时进度可视化
  • 异常中断处理
  • 性能优化策略

通过Ant Design Vue的Progress组件与自定义Hook,打造企业级导出体验。

一、进度提示核心原理

1.1 分片加载模型

数据总量 → 分片大小 → 当前分片 → 进度百分比↑        ↑         ↑
100,000条 5,000条/片 20次迭代

1.2 异步处理流程

点击导出
初始化进度条
发起首个分片请求
数据获取成功?
追加数据到工作表
更新进度
是否完成?
生成最终文件
触发错误处理

二、完整实现方案

2.1 进度条组件集成

<template><a-modal v-model:open="exportVisible" :footer="null"><a-progress :percent="progress" status="active" /><div style="margin-top: 16px">{{ progress }}% 完成 | 当前处理:{{ currentChunk }} / {{ totalChunks }} 分片</div></a-modal>
</template><script setup>
import { ref } from 'vue'const exportVisible = ref(false)
const progress = ref(0)
const currentChunk = ref(0)
const totalChunks = ref(0)
</script>

2.2 核心导出Hook(useExportProgress)

import { ref } from 'vue'
import * as XLSX from 'xlsx/xlsx.mjs'
import { saveAs } from 'file-saver'export const useExportProgress = () => {const isExporting = ref(false)const progress = ref(0)let workbook = nulllet worksheet = nullconst initWorkbook = () => {workbook = XLSX.utils.book_new()worksheet = XLSX.utils.aoa_to_sheet([])XLSX.utils.book_append_sheet(workbook, worksheet, '大数据报表')}const exportData = async (config) => {return new Promise(async (resolve, reject) => {try {isExporting.value = trueinitWorkbook()const { chunkSize, total, fetchData } = configconst totalChunks = Math.ceil(total / chunkSize)for (let i = 0; i < totalChunks; i++) {const data = await fetchData(i, chunkSize)appendData(data)updateProgress(i, totalChunks)}const blob = generateFile()saveAs(blob, '大数据报表.xlsx')resolve()} catch (error) {reject(error)} finally {isExporting.value = falseresetState()}})}const appendData = (data) => {const startRow = worksheet['!ref'] ? worksheet['!ref'].split(':')[1].replace(/[^0-9]/g, '') + 1 : 1XLSX.utils.sheet_add_json(worksheet, data, {origin: startRow,skipHeader: true})}const updateProgress = (current, total) => {progress.value = Math.round((current / total) * 100)}const generateFile = () => {return new Blob([XLSX.write(workbook, {bookType: 'xlsx',type: 'array'})], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'})}const resetState = () => {workbook = nullworksheet = nullprogress.value = 0}return {isExporting,progress,exportData}
}

2.3 调用示例

<script setup>
import { useExportProgress } from './hooks/useExportProgress'const { isExporting, progress, exportData } = useExportProgress()// 模拟分片数据获取
const fetchDataChunk = async (page, pageSize) => {const start = page * pageSizeconst end = start + pageSizereturn new Promise(resolve => {setTimeout(() => {const mockData = Array.from({ length: pageSize }, (_, i) => ({id: start + i + 1,value: Math.random().toFixed(4)}))resolve(mockData)}, 50)})
}const handleExport = async () => {try {await exportData({chunkSize: 5000,total: 100000,fetchData: fetchDataChunk})} catch (error) {console.error('导出失败:', error)}
}
</script>

三、性能优化策略

3.1 内存管理优化

// 修改appendData方法
const appendData = (data) => {// 每次处理后释放内存const tempData = [...data]XLSX.utils.sheet_add_json(worksheet, tempData, {origin: -1,skipHeader: true})tempData.length = 0 // 手动GC
}

3.2 Web Worker方案

// worker.js
self.onmessage = async (e) => {const { config, chunkIndex } = e.dataconst data = await config.fetchData(chunkIndex, config.chunkSize)self.postMessage({ chunkIndex, data })
}// 主线程调用
const worker = new Worker('./worker.js')
worker.postMessage({ config, chunkIndex: i })

3.3 虚拟滚动优化

// 分片加载时动态创建Worksheet
if (i === 0) {XLSX.utils.book_append_sheet(workbook, worksheet, '数据分片1')
} else {const newSheet = XLSX.utils.aoa_to_sheet([])XLSX.utils.book_append_sheet(workbook, newSheet, `数据分片${i+1}`)
}

四、异常处理方案

4.1 断点续传实现

// 添加本地存储
const saveProgress = (current) => {localStorage.setItem('exportProgress', JSON.stringify({currentChunk: current,timestamp: Date.now()}))
}// 启动时检查
const checkResume = () => {const saved = localStorage.getItem('exportProgress')if (saved && Date.now() - saved.timestamp < 300000) {return JSON.parse(saved).currentChunk}return 0
}

4.2 错误边界处理

<template><ErrorBoundary @error="handleError"><YourExportComponent /></ErrorBoundary>
</template><script setup>
const handleError = (error) => {console.error('捕获到导出错误:', error)// 发送错误日志到服务端
}
</script>

五、生产级增强建议

  1. 导出日志记录:记录每次导出的关键指标(耗时、数据量、异常)
  2. 权限校验:在exportData方法前添加Token验证
  3. 格式预设:预先定义单元格样式模板
  4. 多格式支持:扩展CSV/PDF导出选项

总结

通过本文实现的进度提示方案,可获得以下提升:

  • 用户体验:实时反馈增强操作信心
  • 系统稳定性:分片加载降低内存压力
  • 可维护性:Hook封装提高代码复用
  • 错误可追溯:完善的异常处理机制

文章转载自:

http://0oSb6k8Y.nqgds.cn
http://SAypDP2H.nqgds.cn
http://D4OnMTyS.nqgds.cn
http://IzZDYDwg.nqgds.cn
http://i8BXMzed.nqgds.cn
http://zACY7GtY.nqgds.cn
http://tcQxyhwR.nqgds.cn
http://Y3J54TSO.nqgds.cn
http://fzBJRql5.nqgds.cn
http://0iRYn4sa.nqgds.cn
http://07C8D97s.nqgds.cn
http://V9puysfl.nqgds.cn
http://PTazCYr0.nqgds.cn
http://jitwkOcH.nqgds.cn
http://EEbZmmC7.nqgds.cn
http://42rexXrA.nqgds.cn
http://3UUckRe6.nqgds.cn
http://XwiH9K8r.nqgds.cn
http://7OWRulfn.nqgds.cn
http://x9Ouru5s.nqgds.cn
http://Vcz20Mmv.nqgds.cn
http://h3fQNpVN.nqgds.cn
http://E4qaFByl.nqgds.cn
http://ymlypZ1p.nqgds.cn
http://AgJQQYXf.nqgds.cn
http://GfS4vFgp.nqgds.cn
http://OkvehQJa.nqgds.cn
http://Z8GvMUI4.nqgds.cn
http://kCglxsD0.nqgds.cn
http://hvDdeio3.nqgds.cn
http://www.dtcms.com/a/214751.html

相关文章:

  • 牛客round94E
  • vue3 数值计算 保留小数位
  • 嵌入式学习之系统编程(五)进程(2)
  • day8补充(中断驱动和队列缓冲实现高效数据处理)
  • 文件管理(第八章、九)
  • PDF处理控件Aspose.PDF教程:以编程方式合并PDF文档
  • 一文带你彻底理清C 语言核心知识 与 面试高频考点:从栈溢出到指针 全面解析 附带笔者手写2.4k行代码加注释
  • DP KVM 为何更难实现 EDID 模拟器?
  • day38python打卡
  • 主流Agent Memory工具or框架对比(Mem0、LangMem、Letta)
  • 若依框架中返回自定义实体类分页数据和总记录数的实现方法
  • 【鸿蒙开发】Hi3861学习笔记-雨滴传感器
  • 433M射频接收芯片 XL520 产品特性,空旷环境下通讯距离可达200米
  • liunx、ubantu22.04安装neo4j数据库并设置开机自启
  • 【多智能体系统开发框架AutoGen解析与实践】
  • 【关于C++跨平台开发的挑战】
  • World of Warcraft [CLASSIC] Jewelcrafting Gemstone 3 [80 WLK]
  • 什么是风控合规?企业如何高效构建风控合规体系?
  • Python多线程:超详细实例讲解线程的创建
  • 一个简单的系统插桩实现​
  • AI时代新词-人工智能生成内容(AIGC)
  • Python环境搭建
  • jsoup解析页面过程中保留页面中的换行符
  • new对象时,堆会发生抢占吗
  • Docker Volume(存储卷)
  • Netty学习专栏(六):深度解析Netty核心参数——从参数配置到生产级优化
  • SpringBoot3集成Oauth2.1——6数据库存储客户端信息
  • 【数字图像处理】_笔记
  • OpenGAN:基于开放数据生成的开放集识别
  • OceanBase数据库全面解析(高级特性篇)