关于移动端Excel 文件下载的问题

本文详细介绍了在移动端实现Excel导出的过程,包括添加依赖、下载js包、处理数据及导出逻辑,针对手机上文件名显示错误的问题,提出了从前端转到后端实现的解决方案。

具体实现过程:

1、添加依赖

在这需要添加3个依赖包和2个js文件

使用npm安装

npm install -S file-saver xlsx(file-saver依赖 和xlsx依赖)

npm install -D script-loader
2、下载引入js包

下载两个js文件

下载地址:链接:https://pan.baidu.com/s/1LS7iLMko93Tx3Mi5RIveeg
提取码:mafy

然后在src文件夹下面新建一个 vendor文件夹,将你下载的两个js文件导入。

html 导出按钮
 <span @click="exportExcel">导出</span>
js代码
async exportExcel () {
      this.exportData = []
      for (let key in this.params) {
        if (key === 'page') {
          delete this.params.page
        }
        if (key === 'page_size') {
          delete this.params.page_size
        }
      }
      const params = objectNullKey(this.params) 
      let data = await approvalInfo(this.$axios, params) // 根据当前的条件调用相应的接口
      this.exportData = []
      for (let item of data) {
        let exportDataInfo = {
          real_name: item.apply_user.real_name,
          type: item.record_info.type,
          reimburse_time: item.record_info.reimburse_time,
          start_time: item.record_info.start_time,
          end_time: item.record_info.end_time,
          expense: item.record_info.expense,
          currency: item.record_info.currency,
          payment: item.record_info.payment,
          content: item.record_info.content,
        }
        this.exportData.push(exportDataInfo)
      }
      require.ensure([], () => {
        // eslint-disable-next-line camelcase,no-irregular-whitespace
        const {export_json_to_excel} = require('../../../utils/vendor/Export2Excel')  // 引入文件
        const tHeader = ['申请人', '报销科目', '申请时间', '开始时间', '结束时间', '金额', '币种', '支付方式', '备注'] // 将对应的属性名转换成中文
        const filterVal = ['real_name', 'type', 'reimburse_time', 'start_time', 'end_time', 'expense', 'currency', 'payment', 'content']// table表格中对应的属性名
        const list = this.exportData // this.sels就是你想要导出的数据
        const data = this.formatJson(filterVal, list)
        export_json_to_excel(tHeader, data, '报销excel数据')
      })
    },
    formatJson (filterVal, jsonData) {
      return jsonData.map(v => filterVal.map(j => v[j]))
    }
objectNullKey 函数

主要是用来清空空对象
如:let data = {
a: ‘’,
b: ‘111’
}
objectNullKey(data)
结果为: let data = {
b: ‘111’
}

function objectNullKey (obj) {
  // 当对象里面key 值为 '',直接删除对象
  var key = Object.keys(obj).pop()
  if (key in obj) {
    if (obj[key] === '') delete obj[key]
  }
  return obj
}

主要哦实现逻辑

 require.ensure([], () => {
        const {export_json_to_excel} = require('../../../utils/vendor/Export2Excel')  // 引入文件
        const tHeader = ['申请人', '报销科目', '申请时间', '开始时间', '结束时间', '金额', '币种', '支付方式', '备注'] // 将对应的属性名转换成中文
        const filterVal = ['real_name', 'type', 'reimburse_time', 'start_time', 'end_time', 'expense', 'currency', 'payment', 'content']// table表格中对应的属性名
        const list = this.exportData // this.sels就是你想要导出的数据
        const data = this.formatJson(filterVal, list)
        export_json_to_excel(tHeader, data, '报销excel数据')
      })
    },
    formatJson (filterVal, jsonData) {
      return jsonData.map(v => filterVal.map(j => v[j]))
    }

tHeader (表头)
data(数据)
报销excel数据(表名)
照理说这样就好了,但是在电脑模拟器上实验是好的,但是呢,在手机上就有问题,在手机上文件名不对,下载下来的文件名都是二进制

为什么会这样????

没办法只能看源码
Export2Excel 文件中的实现方法是这样的:

export function export_table_to_excel(id) {
    var theTable = document.getElementById(id);
    console.log('a')
    var oo = generateArray(theTable);
    var ranges = oo[1];

    /* original data */
    var data = oo[0];
    var ws_name = "SheetJS";
    console.log(data);

    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);

    /* add ranges to worksheet */
    // ws['!cols'] = ['apple', 'banan'];
    ws['!merges'] = ranges;

    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;

    var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});

    saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
}
saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx") 中 实现方法是动态创建一个a 标签,然后把 文件名 赋值给a标签的download 属性
文件名不出现肯定和这有关,我在网上搜了一波发现
部分手机不支持 a标签的dowload 属性
好莫,这下把路给堵死了,
前台移动端是没办法了,直接交给后台去做
实现方法:
```
 downloadFile (data) {
  const saveLink = document.createElement('a')
  saveLink.href = data
  var event = document.createEvent('MouseEvents')
  event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
  saveLink.dispatchEvent(event)
},
    async exportExcel () {
  for (const key in this.params) {
    if (key === 'page') {
      delete this.params.page
    }
    if (key === 'page_size') {
      delete this.params.page_size
    }
  }
  const params = objectNullKey(this.params)
  // 导出工作汇报表格
  const data = await getWorkReportExport(this.$axios, params)
  this.downloadFile(data.url)
},
```
好了,完了。
### 如何在 UniApp 中实现移动端文件下载 为了实现在 UniApp 应用程序中通过 H5 页面进行文件下载功能,可以采用如下方法: #### 使用 JavaScript 创建隐藏的 `<a>` 标签来触发下载行为 当服务器返回二进制数据作为响应时,在前端可以通过创建一个临时的`<a>`标签并设置其 `href` 属性指向 Blob 对象 URL 来启动下载过程。 ```javascript export function downloadFile(url, fileName) { fetch(url) .then(response => response.blob()) .then(blobData => { const link = document.createElement('a'); let blob = new Blob([blobData], { type: 'application/octet-stream' }); link.href = window.URL.createObjectURL(blob); link.download = fileName || 'download'; link.click(); setTimeout(() => { // 清理工作防止内存泄漏 window.URL.revokeObjectURL(link.href); }, 100); }) } ``` 此函数接收两个参数:一个是目标文件的服务端地址;另一个是要保存下来的文件名。它利用 Fetch API 获取远程资源,并将其转换成 Blob 数据结构以便于处理。之后再构建一个新的带有适当 MIME 类型的 Blob 实例,最后通过模拟点击事件的方式让浏览器自动执行下载操作[^1]。 对于特定类型的文档如 PDF 或 Office 套件中的 Word、Excel 和 PowerPoint 文件,则可以根据实际需求调整上述代码片段里的 MIME-Type 参数值以匹配相应格式的要求。例如,PDF 的 MIME-Type 是 "application/pdf"[^2]。 另外需要注意的是,在某些情况下可能还需要考虑跨域资源共享 (CORS) 设置以及 HTTPS 协议的支持等问题,因为这些因素都可能会对请求的成功与否造成影响。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值