vue 导出Excel

本文介绍在Vue项目中如何使用Table组件导出数据为CSV格式,以及如何利用特定库将JSON数据转换并导出为Excel(.xlsx)格式的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导出为Excel的功能,记录两个方法:

1.vue中Table组件中自带exportCsv方法,可以实现导出功能,并且可以实现自定义导出列

方法名说明参数
exportCsv将数据导出为 .csv 文件,说明:
  • 支持IE9~IE11、Edge、Chrome、Safari、Firefox 全系列浏览器。
  • IE9、Safari 需要手动修改后缀名为 .csv
  • IE9暂时只支持英文,中文会显示为乱码。
params(Object):
  • filename 文件名,默认为 table.csv
  • original 是否导出为原始数据,默认为 true
  • noHeader 不显示表头,默认为 false
  • columns 自定义导出的列数据
  • data 自定义导出的行数据
  • callback 添加此函数后,不会下载,而是返回数据
  • separator 数据分隔符,默认是逗号(,)
  • quoted 每项数据是否加引号,默认为 false
说明:columns 和 data 需同时声明,声明后将导出指定的数据,建议列数据有自定义render时,可以根据需求自定义导出内容

实例:

Table组件,绑定表格中的信息为positionData

 <Table id='t1' :height="height" ref="tableM"   size="small":columns="positionColumns" :stripe="true" :data="positionData" border ></Table>

导出按钮上绑定export()函数

<Button type="primary" size="small" @click="export()"> 导出  </Button>

export函数:$refs父组件需要数据来源,所以要在Table组件中注册ref="tableM" 

export() {
            this.$refs.tableM.exportCsv({
                filename: '表格',//自定义文件名
                //columns: this.positionColumns.filter((col, index) => index < 2),自定义导出列
            });           
        },

更多可参考官网:https://www.iviewui.com/components/table

通过本方法可以导出.csv的原始数据文件,下面介绍导出.xlsx格式的文件


2.转化json数据到Excel

(1)首先安装依赖,在终端输入命令:

npm install -S file-saver xlsx  

npm install -D script-loader

(2)在项目src下新建一个文件夹vendor,在此文件夹下放置两个文件Blob.js和Export2Excal.js

链接: https://pan.baidu.com/s/1m6d-aOff2fX4WB7mXxXDZQ 密码: ypb5


(3)export函数

 export() { 
          require.ensure([], () => {        
            const { export_json_to_excel } = require('@/vendor/Export2Excel.js');  //引入文件      
            const tHeader = [ '编码', '名称', ]; //表头
            const filterVal = ['ID', 'Name',;//table表格中对应的属性名     
            const data = this.formatJson(filterVal, this.positionData); //表格绑定数据positionData转json       
            export_json_to_excel(tHeader, data, 'position');
            })
 
        },
         formatJson(filterVal, jsonData) {
                return jsonData.map(v => filterVal.map(j => v[j]))
         },

注意:require('@/vendor/Export2Excel.js');路径以webpack.base.config.js中alias的声明为准


导出完成。

<think>好的,用户现在问的是如何在Vue导出Excel。之前他们询问了关于el-upload组件的属性,现在转向导出功能,可能是在项目中需要处理文件上传后再导出数据。首先,我需要确定用户的需求场景,比如他们是否已经有了数据,需要前端生成Excel,还是需要从后端获取数据再导出。 用户可能是开发者,对Vue有一定了解,但可能不熟悉文件导出的具体方法。常见的导出方式有两种:前端生成Excel文件或通过后端接口返回文件流。前端生成适合数据量小的情况,后端处理适合大数据或复杂格式。 我需要考虑用户可能需要的两种方法,并分别介绍。前端方面,可以使用xlsx或file-saver库,这些是常用的工具。需要说明安装步骤、基本用法和示例代码。后端方面,可能需要处理响应头,比如设置Content-Disposition,以及如何处理blob数据。 另外,用户可能关心如何自定义导出的内容,比如表头、样式,或者如何处理大量数据。需要提到这些注意事项,比如前端导出的性能问题,或者后端生成时的安全性。 还要注意代码示例的正确性,比如使用Vue的方法和生命周期钩子,可能需要提醒用户在哪里引入依赖,如何处理异步请求。此外,是否需要处理错误情况,比如导出失败时的提示。 可能用户没有明确说明是前端还是后端实现,所以需要两者都涵盖,并比较优缺点,帮助用户选择适合的方案。同时,注意回答的结构清晰,分点说明,让用户容易理解步骤和选项。 需要检查之前的回答是否有相关部分,比如之前提到的el-upload是否与导出有关联,但看起来导出是独立的功能。因此,可以专注于导出Excel的不同方法,确保覆盖用户可能的需求点,并提供实际代码示例和常见问题解答,比如如何处理特殊字符或样式调整。</think>以下是关于在 Vue 项目中实现 Excel 导出的 3 种主流方案详解: --- ### 一、前端直接生成 Excel(适合小数据量) #### 1. 使用 `xlsx` + `file-saver` 库 ```bash npm install xlsx file-saver --save ``` #### 2. 基础实现代码 ```vue <template> <el-button @click="exportExcel">导出Excel</el-button> </template> <script> import { saveAs } from 'file-saver'; import * as XLSX from 'xlsx'; export default { data() { return { tableData: [ { name: '张三', age: 25, department: '技术部' }, { name: '李四', age: 30, department: '市场部' } ] }; }, methods: { exportExcel() { // 创建工作簿 const wb = XLSX.utils.book_new(); // 创建工作表 const ws = XLSX.utils.json_to_sheet(this.tableData); // 设置列宽 ws['!cols'] = [{ wch: 15 }, { wch: 10 }, { wch: 20 }]; // 添加到工作簿 XLSX.utils.book_append_sheet(wb, ws, '员工数据'); // 生成文件 const buffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }); const blob = new Blob([buffer], { type: 'application/octet-stream' }); // 保存文件 saveAs(blob, '员工数据表.xlsx'); } } }; </script> ``` #### 3. 高级功能实现 ```javascript // 自定义表头 const headers = ['姓名', '年龄', '部门']; const headerData = [headers]; const bodyData = this.tableData.map(item => [item.name, item.age, item.department]); const ws = XLSX.utils.aoa_to_sheet([...headerData, ...bodyData]); // 合并单元格(合并A1-C1) ws['!merges'] = [XLSX.utils.decode_range("A1:C1")]; // 设置单元格样式 const headerStyle = { font: { bold: true, color: { rgb: "FFFFFF" } }, fill: { fgColor: { rgb: "4472C4" } } }; for(let col = 0; col < headers.length; col++) { const cell = XLSX.utils.encode_cell({ r: 0, c: col }); ws[cell].s = headerStyle; } ``` --- ### 二、后端生成 Excel 文件流(推荐大数据量场景) #### 1. 前端请求处理 ```vue <script> export default { methods: { async exportFromServer() { try { const response = await this.$axios.get('/api/export', { responseType: 'blob', params: { startDate: '2023-01-01', endDate: '2023-12-31' } }); // 创建下载链接 const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', '报表数据.xlsx'); document.body.appendChild(link); link.click(); link.remove(); } catch (error) { console.error('导出失败:', error); } } } } </script> ``` #### 2. 后端示例(Node.js + Express) ```javascript router.get('/export', (req, res) => { const data = generateExcelData(); // 生成Excel数据的业务逻辑 res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); res.setHeader('Content-Disposition', 'attachment; filename=export.xlsx'); // 使用 exceljs 库生成文件流 const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('Sheet1'); // 添加数据... workbook.xlsx.write(res).then(() => { res.end(); }); }); ``` --- ### 三、第三方组件方案(快速集成) #### 1. 使用 `vue-json-excel` 插件 ```bash npm install vue-json-excel ``` #### 2. 基础使用 ```vue <template> <download-excel :data="tableData" :fields="jsonFields" name="导出数据.xls" type="xls" > <el-button>一键导出</el-button> </download-excel> </template> <script> import DownloadExcel from 'vue-json-excel'; export default { components: { DownloadExcel }, data() { return { jsonFields: { '姓名': 'name', '年龄': 'age', '部门': { field: 'department', callback: value => value.toUpperCase() // 格式化部门名称 } } }; } }; </script> ``` --- ### 四、注意事项对比表 | 方案 | 优点 | 缺点 | 适用场景 | |---------------------|-------------------------------|-------------------------------|---------------------| | **前端生成** | 快速实现,无需后端支持 | 大数据量性能差 | 数据量 < 1000 行 | | **后端生成** | 处理大数据,格式控制更灵活 | 需要前后端协作 | 数据量 > 10000 行 | | **第三方组件** | 简单快速集成 | 样式定制能力有限 | 简单表格快速导出 | --- ### 五、常见问题解决 #### 1. 中文乱码问题 ```javascript // 前端解决方案(添加BOM头) const bom = new Uint8Array([0xEF, 0xBB, 0xBF]); const blob = new Blob([bom, buffer], { type: 'application/octet-stream' }); // 后端解决方案(Node.js) res.write('\ufeff'); // 写入BOM头 ``` #### 2. 复杂表头处理 ```javascript // 使用二维数组结构 const complexHeader = [ ['主要信息', '', '', '辅助信息'], ['姓名', '年龄', '部门', '入职日期', '薪资'] ]; const ws = XLSX.utils.aoa_to_sheet(complexHeader); ``` #### 3. 导出性能优化 ```javascript // 分块处理大数据(前端) const CHUNK_SIZE = 5000; for (let i = 0; i < bigData.length; i += CHUNK_SIZE) { const chunk = bigData.slice(i, i + CHUNK_SIZE); XLSX.utils.sheet_add_json(ws, chunk, { skipHeader: true, origin: -1 }); } ``` --- 根据具体需求场景选择合适的实现方案,建议:小型数据报表使用前端生成方案,复杂业务数据采用后端生成,需要快速实现简单导出时使用第三方组件。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值