vue中实现导出、下载文件

Api

    注意:需要指定服务器响应的数据类型 —> responseType: 'blob'

// 导出/下载
import request from './request'
export default {
  exportData(params) {
    return request.post('/export', params, {
      responseType: 'blob'
    });
  },
}

    注意:request.js文件里需要判断响应数据中 config.responseType 的类型

import axios from 'axios'
import Vue from 'vue'
import store from '@/store/index'

// 取消请求(用于当没有 token 时,取消当前的请求,直到获取 token)
const CancelToken = axios.CancelToken
const source = CancelToken.source()

// 过滤掉空字符串
function filterEmptyKey(params) {
  Object.keys(params).forEach(key => {
    if (
    	params[key] === null ||
    	params[key] === '' || 
    	params[key] === 'null' || 
    	params[key] === undefined
    ) {
      delete params[key]
    }
  })
}

// 环境的切换
let baseURL = null
if (process.env.NODE_ENV === 'development') {
  baseURL = 'http://localhost:8080'
} else if (process.env.NODE_ENV === 'debug') {
  baseURL = ''
} else if (process.env.NODE_ENV === 'production') {
  baseURL = 'http://bandu.com'
}

const service = axios.create({
  baseURL: baseURL,
  timeout: 30000,
  cancelToken: source.token
})

// 请求拦截
service.interceptors.request.use(
  (config) => {
    // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,
    // 不用每次请求都手动添加了
    // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
    const token = store.state.token
    token && (config.headers.Authorization = token)
    if (config.method === 'post') {
      const params = {
        ...config.data
      };
      filterEmptyKey(params); // 过滤掉空字符串
      config.headers['Content-Type'] = 'application/json'
      config.data = params;
    } else if (config.method === 'get') {
      config.params = {
        _t: Date.parse(new Date()) / 1000,
        ...config.params
      };
      filterEmptyKey(config.params) // 过滤掉空字符串
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
);

// 响应拦截
service.interceptors.response.use(
  (res) => {
    const { data, config } = res
    // 如果是下载文件则需要加上这一段类型判断
    if (config.responseType === 'blob') {
      return response
    }
    if (!data.status) {
      // 错误提醒
      let message = data.message ? data.message : '未知错误'
      Vue.prototype.$message({
        message: config.action + '失败:' + message,
        type: 'error'
      })
    }
    return Promise.resolve(data) || {}
  },
  (error) => {
    return Promise.reject(error)
  }
)

export default service

下载/导出函数

export function downLoad(res, filename) {
  // res 调用接口后返回的数据
  // filename自定义文件名
  let blob = new Blob([res.data]) // 将返回的数据通过Blob的构造方法,创建Blob对象
  if ('msSaveOrOpenBlob' in navigator) {
    window.navigator.msSaveOrOpenBlob(blob, filename) // 针对浏览器
  } else {
    const elink = document.createElement('a') // 创建a标签
    elink.download = filename
    elink.style.display = 'none'
    // 创建一个指向blob的url,这里就是点击可以下载文件的根结
    elink.href = URL.createObjectURL(blob)
    document.body.appendChild(elink)
    elink.click()
    URL.revokeObjectURL(elink.href) //移除链接
    document.body.removeChild(elink) //移除a标签
  }
}

页面中使用

    注意:这种方法需要自己写文件名称,名称后面要写上文件后缀名

<template>
	<el-button type="primary" @click="handleExport">导出/下载</el-button>
</template>
<script>
import { exportData } from '@/api/index'
import { downLoad } from '@/utils/index'
export default {
	data() {
		return {
			startTime: '',
			endTime: ''
		}
	},
	methods: {
	    handleExport() {
		    const params = {
	          startTime: this.startTime,
	          endTime: this.endTime
	        }
	        exportData(params).then(res => {
	          downLoad(res, '文件.xlsx') // 需要自己写文件名称和类型
	        })
	    }
	}
}
</script>
Vue实现导入和导出Excel文件的步骤如下: 1. 首先,需要安装xlsx插件,可以使用npm命令进行安装:npm i xlsx。 2. 创建一个公共组件,用于处理Excel导入功能。可以将这个组件引入到需要使用导入功能的页面。 3. 在需要导入Excel的页面,使用懒加载的方式导入Export2Excel.js文件。可以使用import('@/vendor/Export2Excel')来导入文件。 4. 在导入文件后,可以调用导入对象上的方法来实现导入功能。例如,可以使用excel.export_json_to_excel方法来导入Excel文件。这个方法需要传入一些参数,包括表头(header)、具体数据(data)、导出文件名(filename)、单元格是否自适应宽度(autoWidth)和导出文件类型(bookType)等。 5. 对于导出Excel文件的功能,可以使用相同的导入方式,将Export2Excel.js文件导入到需要使用导出功能的页面。 6. 在导入文件后,可以调用导出对象上的方法来实现导出功能。同样地,可以使用excel.export_json_to_excel方法来导出Excel文件。需要传入的参数包括表头(header)、具体数据(data)、导出文件名(filename)、单元格是否自适应宽度(autoWidth)和导出文件类型(bookType)等。 综上所述,以上是在Vue实现导入和导出Excel文件的步骤。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [vue项目的excel的导入与导出](https://blog.csdn.net/Anyuegogogo/article/details/117560118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Vue如何实现Excel导入导出](https://blog.csdn.net/m0_73975292/article/details/127508184)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半度℃温热

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值