vue导出表格excel

封装一个downloadUtil.js
<table><el-table><a-table><s-table>都适用
本篇使用得ui框架是ant-design-vue
废话不多说上代码
 


import { message } from 'ant-design-vue'
import * as XLSX from 'xlsx';
 
import FileSaver from 'file-saver';

export default {
	// 对下载的流进行处理,直接从浏览器下载下来
	resultDownload(res) {
		if (res.data.type === 'application/json') {
			// 错误以及无权限
			const reader = new FileReader(res.data)
			reader.readAsText(res.data)
			reader.onload = () => {
				const result = JSON.parse(reader.result)
				message.error(result.msg)
			}
		} else {
			const blob = new Blob([res.data], { type: 'application/octet-stream;charset=UTF-8' })
			const contentDisposition = res.headers['content-disposition']
			const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
			const $link = document.createElement('a')
			$link.href = URL.createObjectURL(blob)
			$link.download = decodeURIComponent(patt.exec(contentDisposition)[1])
			$link.click()
			document.body.appendChild($link)
			document.body.removeChild($link) // 下载完成移除元素
			window.URL.revokeObjectURL($link.href) // 释放掉blob对象
		}
	},

    //url导出,静态资源
	async downloadUrl(url, filename) {
		const index = url.lastIndexOf('/')



		if (!filename) {
			filename = url.substring(index, url.length)
		}

		await fetch(url)
			.then((response) => response.blob())
			.then((res) => {
				console.log(res)
				try {
					let blob = new Blob([res])
					const href = window.URL.createObjectURL(blob) //创建下载的链接
					// 谷歌浏览器 创建a标签 添加download属性下载
					let downloadElement = document.createElement('a')
					downloadElement.href = href
					downloadElement.target = '_blank'
					downloadElement.download = filename
					document.body.appendChild(downloadElement)
					downloadElement.click() // 点击下载
					document.body.removeChild(downloadElement) // 下载完成移除元素
					window.URL.revokeObjectURL(href) // 释放掉blob对象
				} catch (e) {
					console.log('下载失败', e)
				}
			})
	},

	//前端导出
	exportExcel(id,fileName) {
    try {
      // 表格DOM元素
      const tableDOM = document.querySelector(`#${id}`);
	  //克隆table并删除表头与表格中间空行
	  const cloneDom = tableDOM.cloneNode(true)
	  const nullTR = cloneDom.querySelector('.ant-table-measure-row')
	  nullTR.parentNode.removeChild(nullTR);
			
      // 创建导出
      const wb = XLSX.utils.table_to_book(cloneDom, { raw: true });
      const wbout = XLSX.write(wb, {
        bookType: 'xlsx',
        bookSST: true,
        type: 'array',
      });
      // 导出下载
      FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), `${fileName}.xlsx`);
    } catch (e) {
      console.log('导出失败', e);
    }
  }
}

如果纯前端导出element-ui的<el-table>或者<table>使用exportExcel方法可以把克隆dom删除的js注释掉

vue中写法
 

<template>
    <a-table
	    id="tableRef"
		:columns="columns"
        :dataSource="dataSource"
    >
        
    </a-table>
</template>
<script setup name="xxx">
	import downloadUtil from '@/utils/downloadUtil'
    const dataSource = ref([
          {
            key: '1',
            name: '胡彦斌',
            age: 32,
            address: '西湖区湖底公园1号',
          },
          {
            key: '2',
            name: '胡彦祖',
            age: 42,
            address: '西湖区湖底公园1号',
          },
        ],
    const columns= ref([
          {
            title: '姓名',
            dataIndex: 'name',
            key: 'name',
          },
          {
            title: '年龄',
            dataIndex: 'age',
            key: 'age',
          },
          {
            title: '住址',
            dataIndex: 'address',
            key: 'address',
          },
        ])
    //前端导出
    downloadUtil.exportExcel('tableRef',`文件名`)
    //后端返回文件流导出
    downloadUtil.resultDownload(res)
    //url导出
    downloadUtil.downloadUrl('https:xxxxxx','文件名')
</script>

### Vue 实现导出多级 Excel 表格 为了实现在Vue项目中导出带有多个级别的表头Excel表格,可以采用特定库和技术来简化这一过程。通过引入`file-saver`和`xlsx`这两个依赖包,能够有效地支持文件保存以及Excel文档的操作功能[^3]。 #### 安装必要的依赖项 在命令行工具中执行如下指令以安装所需的npm包: ```bash npm install -D script-loader ``` #### 创建辅助JavaScript 文件 需创建一个新的名为 `excel` 的文件夹于项目的 `src` 目录之下,在此文件夹内放置三个重要的 JavaScript 文件:`Blob.js`, `export2Excel.js` 和 `export2Excel2.js`. 特别注意的是,后者用于处理具有复杂结构即多层表头的情况下的数据导出操作. #### 编写导出逻辑代码 下面展示了一段基于上述准备工作的实际应用案例——当用户触发某个按钮事件时,会调用该函数从而启动Excel文件的生成流程并提供给客户端下载[^2]: ```javascript // 假设这是在一个Vue组件中的methods部分定义的方法 handleDownload() { import("@/utils/excel/export2Excel2").then(excel => { // 动态加载模块 const tHeader = ['姓名', '年龄', '城市']; // 这里应替换为真实的列名数组 const filterVal = ['name', 'age', 'city']; // 对应tHeader的实际字段名称 // 构建多级表头配置对象 let multiHeader = [ [{ s: 1, e: 3 }, "个人信息"], ["名字", "", ""], ["年龄", "", ""], ["所在地区", "", ""] ]; // 获取待导出的数据列表 const list = this.list; const data = formatJson(filterVal, list); // 调用第三方库提供的API完成最终的Excel文件构建与下载动作 excel.export_json_to_excel({ header: tHeader, data, filename: 'the-file-name', autoWidth: true, bookType: 'xlsx', multiHeader }); }) } function formatJson(filterVal, jsonData) { return jsonData.map(v => filterVal.map(j => v[j])) } ``` 这段代码片段展示了如何利用动态导入的方式按需加载外部资源,并且构造了一个简单的例子说明怎样设置多级表头参数(`multiHeader`)及其对应的值映射关系(`filterVal`). 同时也包了将原始JSON格式转换成适合写入Excel单元格的内容形式的过程.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值