背景:
后台 返回:gzip压缩后进行了base64编码的字符串。
解决办法
》引入pako.js ,xlsx
》定义解压和压缩的方法

import XLSX from 'xlsx'
const pako = require('pako')

代码:

// 下载

download (id) {
  this.downloadLoading = id;
  api.download({ id }).then(res => {
   
    var strData = atob(res.data);
    // Convert binary string to character-number array
    var charData = strData.split('').map(function (x) { return x.charCodeAt(0); });
    // Turn number array into byte-array
    var binData = new Uint8Array(charData);
    // // unzip
    var data = pako.inflate(binData);
    // Convert gunzipped byteArray back to ascii string:
    strData = String.fromCharCode.apply(null, new Uint16Array(data));
    // 将乱码的中文进行转换
    let jsonResult = decodeURIComponent(escape((strData)))
    console.log(jsonResult);
    // 重新处理
    let excel = JSON.parse(jsonResult).map(el => {
      el['标签名称'] = el.tagValue
      el['id'] = el.entity_id
      delete el.tagValue
      delete el.entity_id
      return el
    })

    // json 转换 excel
    this.downMobileTempalte(excel)

    this.downloadLoading = null;
  }).catch(err => {

    this.$Message.error(err);
    this.downloadLoading = null;
  })
},
// 导出手机号excel模板
downMobileTempalte (res) {

  const type = 'xlsx'
  const rs = res
  let data = [{}]
  for (let k in rs[0]) {
    data[0][k] = k
  }
  data = data.concat(rs)

  let keyMap = [] // 获取键
  for (let k in data[0]) {
    keyMap.push(k)
  }

  let tmpdata = [] // 用来保存转换好的json
  data.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
    v: v[k],
    position: (j > 25 ? this.getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
  }))).reduce((prev, next) => prev.concat(next)).forEach(function (v) {
    tmpdata[v.position] = {
      v: v.v
    }
  })
  let outputPos = Object.keys(tmpdata)  // 设置区域,比如表格从A1到D10
  let tmpWB = {
    SheetNames: ['mySheet'], // 保存的表标题
    Sheets: {
      'mySheet': Object.assign({},
        tmpdata, // 内容
        {
          '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] // 设置填充区域
        })
    }
  }
  let tmpDown = new Blob([this.s2ab(XLSX.write(tmpWB,
    { bookType: (type === undefined ? 'xlsx' : type), bookSST: false, type: 'binary' } // 这里的数据是用来定义导出的格式类型
  ))], {
    type: ''
  })  // 创建二进制对象写入转换好的字节流
  const link = document.createElement("a");
  link.href = URL.createObjectURL(tmpDown)  // 创建对象超链接
  link.setAttribute("download", "商铺标签.xls");
  document.body.appendChild(link);
  link.click();
  setTimeout(function () {  // 延时释放
    URL.revokeObjectURL(tmpDown) // 用URL.revokeObjectURL()来释放这个object URL
  }, 100)
},
// 字符串转字符流
s2ab (s) {
  var buf = new ArrayBuffer(s.length)
  var view = new Uint8Array(buf)
  for (var i = 0; i !== s.length; ++i) {
    view[i] = s.charCodeAt(i) & 0xFF
  }
  return buf
},
// 将指定的自然数转换为26进制表示。映射关系:[0-25] -> [A-Z]。
getCharCol (n) {
  let s = '',
    m = 0
  while (n > 0) {
    m = n % 26 + 1
    s = String.fromCharCode(m + 64) + s
    n = (n - m) / 26
  }
  return s
}

原文作者:关爱单身狗成长协会
原文链接:[https://www.jianshu.com/p/74d...]


mark
33 声望2 粉丝