vue POST 请求方式下载excel文件

1.使用技术

  • node -koa
  • vue

2.上代码

前端请求

先配置vue脚手架里的request请求,在响应请求前加入以下判断

 const res = response.data
    // 处理post下载
    if (response.data.type === 'application/vnd.openxmlformats') {
      return response.data
    }

exportArticleStat({'cids':cids}).then(res=>{
          const content = res;
          const blob = new Blob([content]);
          const fileName = "推送任务数据分析导出.xlsx";
          if ("download" in document.createElement("a")) { // 非IE下载
            const elink = document.createElement("a");
            elink.download = fileName;
            elink.style.display = "none";
            elink.href = URL.createObjectURL(blob);
            document.body.appendChild(elink);
            elink.click();
            URL.revokeObjectURL(elink.href); // 释放URL 对象
            document.body.removeChild(elink);
          } else { // IE10+下载
            navigator.msSaveBlob(blob, fileName);
          }
})

 后端请求处理:注意在响应前要加以下响应头

router.post('/mp/exportArticleStat', async (ctx, next) => {
    await Push.exportArticleStat(ctx).then(function(res) {
        ctx.set('Content-Type', 'application/vnd.openxmlformats');
        ctx.set("Content-Disposition", "attachment; filename=" + "terminal.xlsx");
        ctx.body = res;
    }).catch(err => {
        ctx.body = {
            code: -1,
            msg: err
        }
    })
})

以下为下载excel的接口方法

/**
 * 图文分析数据导出
 */
const exportArticleStat = function(ctx){
    return new Promise(function (resolve, reject) {
        let cids = ctx.request.body.cids;
        async.map(cids,function (item,callback) {
            articleAnalysis(item.cid).then(res=>{
                callback(null,{"pushname":item.pushname,"data":res})
            })
        },function (err,results) {
            excelUtils.articleStatExcel(results).then(res=>{
                resolve(res)
            })
        })
    })
}
var xlsx = require('node-xlsx');

const articleStatExcel = function(param){
    return new Promise(function (resolve, reject) {
        let excelData = []
        for(let items of param){
            let data = []
            let hearders = [
                '微信号',
                '推送时间',
                '截至时间',
                '标题',
                '送达人数',
                '阅读人数',
                '阅读次数',
                '原文阅读次数',
                '原文阅读次数',
                '分享人数',
                '分享次数',
                '收藏人数',
                '收藏次数',
            ]
            data.push(hearders)
            //处理查询clickhouse 的数据
            for (let item of items.data) {
                for(let it of item.details){
                    let arr = new Array()
                    arr.push(item.platform)
                    arr.push(it.time)
                    arr.push(it.stat_date)
                    arr.push(it.title)
                    arr.push(it.target_user)
                    arr.push(it.int_page_read_user)
                    arr.push(it.int_page_read_count)
                    arr.push(it.ori_page_read_user)
                    arr.push(it.ori_page_read_count)
                    arr.push(it.share_user)
                    arr.push(it.share_count)
                    arr.push(it.add_to_fav_user)
                    arr.push(it.add_to_fav_count)
                    data.push(arr)
                }
            }
            excelData.push({name: items.pushname,data: data})
        }
        var buffer = xlsx.build(excelData)
        resolve(buffer)
    })
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

古月_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值