Vue3技术实践:基于XLSX与File-Saver的Excel高效导出方案

2025年3月8日

在数据密集型的Web应用中,Excel文件的导入导出是高频需求。Vue3凭借其响应式系统和组合式API,结合xlsxfile-saver库,能够实现高效、灵活的前端数据处理与导出功能。本文将以实际代码为例,解析核心实现逻辑,并探讨最佳实践与性能优化策略。


一、技术选型与核心库解析
  1. XLSX.js
    功能:支持Excel文件的读取、生成与格式转换,兼容XLSX/XLS/CSV等格式。
    核心API
    XLSX.utils.table_to_book():将HTML表格转换为工作簿对象
    XLSX.utils.json_to_sheet():将JSON数据转为工作表
    优势:轻量级、社区支持广泛,适合基础导出需求。

  2. File-Saver
    作用:通过Blob对象实现浏览器端文件保存,支持自定义文件名与MIME类型。
    核心方法saveAs(blob, filename),触发浏览器下载行为。


二、Vue3集成实现流程

以下为基于用户代码优化的Excel导出实现步骤:

import * as XLSX from 'xlsx';
import {
   
    saveAs } from 'file-saver';

// 防抖封装导出函数(组合式API示例)
export const useExcelExport = () => {
   
   
  const exportExcel = debounce((tableData, excludedColumns = ['病史', '操作']) => {
   
   
    if (tableData.length === 0) return;

    // 动态过滤列(响应式依赖)
    const columns = ref([])
### 安装依赖 在 Vue3 项目中实现导出 Excel 文件的功能,可以使用 `xlsx` 和 `file-saver` 这两个库。首先需要安装它们: ```bash npm install xlsx file-saver ``` 安装完成后,可以在项目中引入这两个库以供后续使用: ```javascript import * as XLSX from &#39;xlsx&#39;; import FileSaver from &#39;file-saver&#39;; ``` ### 导出方法实现 为了方便复用,可以将导出逻辑封装到一个工具函数中。例如,创建一个 `utils` 文件夹,并在其中添加一个 `Export2Excel.js` 文件用于处理数据转换和文件保存: ```javascript import * as XLSX from &#39;xlsx&#39;; import FileSaver from &#39;file-saver&#39;; export const exportToExcel = (data, filename, sheetName) => { const worksheet = XLSX.utils.aoa_to_sheet(data); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, sheetName || &#39;Sheet1&#39;); const wbout = XLSX.write(workbook, { bookType: &#39;xlsx&#39;, type: &#39;array&#39; }); try { FileSaver.saveAs(new Blob([wbout], { type: &#39;application/octet-stream&#39; }), `${filename}.xlsx`); } catch (e) { if (typeof console !== &#39;undefined&#39;) console.log(e, wbout); } }; ``` 在组件中调用该方法: ```javascript import { exportToExcel } from &#39;@/utils/Export2Excel&#39;; const handleExport = () => { const data = [ [&#39;ID&#39;, &#39;名称&#39;, &#39;数量&#39;], [1, &#39;商品A&#39;, 10], [2, &#39;商品B&#39;, 20] ]; exportToExcel(data, &#39;库存数据&#39;, &#39;库存&#39;); }; ``` ### 从表格导出数据 如果需要从页面上的表格导出数据,可以使用 `xlsx` 提供的 `table_to_book` 方法。例如,导出一个 `el-table` 的数据: ```html <template> <el-table id="exportXlsx" :data="tableData"> <el-table-column prop="date" label="日期"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> <el-button @click="exportExcel">导出 Excel</el-button> </template> ``` ```javascript import * as XLSX from &#39;xlsx&#39;; import FileSaver from &#39;file-saver&#39;; export default { data() { return { tableData: [ { date: &#39;2023-01-01&#39;, name: &#39;张三&#39;, address: &#39;北京市&#39; }, { date: &#39;2023-01-02&#39;, name: &#39;李四&#39;, address: &#39;上海市&#39; } ] }; }, methods: { exportExcel() { const wb = XLSX.utils.table_to_book(document.getElementById(&#39;exportXlsx&#39;), { raw: true }); const wbout = XLSX.write(wb, { bookType: &#39;xlsx&#39;, bookSST: true, type: &#39;array&#39; }); try { FileSaver.saveAs(new Blob([wbout], { type: &#39;application/octet-stream&#39; }), &#39;表格数据.xlsx&#39;); } catch (e) { if (typeof console !== &#39;undefined&#39;) console.log(e, wbout); } return wbout; } } }; ``` ### 自定义导出组件 对于需要多次复用导出功能的项目,可以封装一个通用的 Excel 导出组件。例如,在一个局部插件中实现导出功能: ```javascript import * as XLSX from &#39;xlsx&#39;; import FileSaver from &#39;file-saver&#39;; export const open = (list, dataList, fileName) => { const headers = list.filter(item => item.show).map(item => item.label); const fields = list.filter(item => item.show).map(item => item.field); const data = [headers]; dataList.forEach(item => { const row = fields.map(field => item[field]); data.push(row); }); const worksheet = XLSX.utils.aoa_to_sheet(data); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, &#39;Sheet1&#39;); const wbout = XLSX.write(workbook, { bookType: &#39;xlsx&#39;, type: &#39;array&#39; }); try { FileSaver.saveAs(new Blob([wbout], { type: &#39;application/octet-stream&#39; }), `${fileName}.xlsx`); } catch (e) { if (typeof console !== &#39;undefined&#39;) console.log(e, wbout); } }; ``` 在组件中使用该插件: ```html <template> <div> <h1>欢迎使用局部导出 Excel 插件</h1> <button @click="showModal">打开弹出窗口</button> </div> </template> <script setup> import { ref } from &#39;vue&#39;; import LoadingService from &#39;../../plugIn/modalPlugin&#39;; const data_title = ref([ { field: &#39;badge&#39;, show: true, label: &#39;工号&#39; }, { field: &#39;name&#39;, show: true, label: &#39;员工姓名&#39; } ]); const data_list = ref([]); const showModal = () => { let list = JSON.parse(JSON.stringify(data_title.value)); let dataList = data_list.value; let fileName = &#39;文件名称&#39;; LoadingService.open(list, dataList, fileName); }; </script> ``` ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值