vue 前后端下载

1.使用场景:前后端分离,后端生成execl六文件,前端直接调用接口下载excel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/src/api/usr
export function exportExcel(path,params) {
  return request({
    url: path,
    method:'get',
    params:params,
    responseType: 'arraybuffer'
  })
}
 
 
//使用的地方
async handleDown () {
      this.downLoading = true
      try{
        const res = await exportExcel('/service/reconciliation/downloadList',this.listQuery)
        const blob = new Blob([res],{
          type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
        })
        let downloadElement = document.createElement('a')
        let href = window.URL.createObjectURL(blob)
        downloadElement.href = href
        downloadElement.download = '账单明细.xlsx'
        document.body.appendChild(downloadElement)
        downloadElement.click()
        document.body.removeChild(downloadElement)
        window.URL.revokeObjectURL(href)
        setTimeout(() => {
          this.downLoading = false
        }, 500)
      }catch(err){
        this.downLoading = false
      }
    },

2.execl直接在前端生成,样式可以根据实际内容调整,本质是一个html,转换成execl

优点:样式可以随意切换,在前端直接生成减少网络传输压力

缺点:用word打开的时候会有一个提示,文档格式不匹配,但不影响正常的打开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
exportxsl() {
  var datanum = this.exceldata.length - 1;
  // var startTime = this.timestampToTime(this.exceldata[0].createTime);
  // var endTime = this.timestampToTime(this.exceldata[datanum].createTime);
  var str =
    "<tr style='font-size:15px'><td colspan='6'  style='font-size:14px;background-color:#ddd;padding-top:10px;padding-bottom:10px;height:100px'> <strong>提示:</strong>      总数:" +
    this.exceldata.length +
    "条</td></tr>" +
    '<tr>'+
    '<td style="border: 0.5pt solid #000;background-color:#ddd;font-size:20px">账号</td>' +
    '<td style="border: 0.5pt solid #000;background-color:#ddd;font-size:20px">产品</td>' +
    '<td style="border: 0.5pt solid #000;background-color:#ddd;font-size:20px">单价</td>' +
    '<td style="border: 0.5pt solid #000;background-color:#ddd;font-size:20px">实际费用</td>' +
    '<td style="border: 0.5pt solid #000;background-color:#ddd;font-size:20px">类型</td>' +
    '<td style="border: 0.5pt solid #000;background-color:#ddd;font-size:20px">订购时间</td>' +
    ' </tr>';
  var data = this.exceldata; //从接口中获取的数据
  for (let i = 0; i < data.length; i++) {
    let account =  data[i].account ? data[i].account:"--"
    str += "<tr>";
    str +=
      '<td  style="border: 0.5pt solid #000;">' + account + "</td>";
    str +=
      '<td  style="border: 0.5pt solid #000;">' +
      data[i].productName +
      "</td>";
    str +=
      '<td  style="border: 0.5pt solid #000;">' +
      data[i].receivable +
      "</td>";
    str +=
      '<td  style="border: 0.5pt solid #000;">' +
      data[i].receipt +
      "</td>";
    str +=
      '<td  style="border: 0.5pt solid #000;">' +
      this.typeToChange(data[i].type) +
      "</td>";
    str +=
      '<td  style="border: 0.5pt solid #000;">' +
      this.timestampToTime(data[i].createTime) +
      "</td>";
    str += "</tr>";
  }
  function base64(template) {
    return window.btoa(unescape(encodeURIComponent(template)));
  }
  var filename = "个人账单信息";
  //Worksheet名
  var worksheet = "个人帐单信息";
  // let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str);
 
  var uri = "data:application/vnd.ms-excel;base64,";
  //下载的表格模板数据
  var template = `<html xmlns:o="urn:schemas-microsoft-com:office:office"
  xmlns:x="urn:schemas-microsoft-com:office:excel"
  xmlns="http://www.w3.org/TR/REC-html40">
  <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
    <x:Name>${worksheet}</x:Name>
    <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
    </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><style type="text/css">table{border: 0.5pt solid #000;background-cpor:#dddborder-collapse: collapse;}table td{border-top:0pt;font-size:16px } </style>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><table>${str}</table></body></html>`;
 
  var a = document.createElement("a");
  a.download = filename;
  a.href = uri + base64(template);
  a.click();
  // // 下载模板
  // window.location.href = uri + base64(template)
}

3.还有一种使用官方的插件的execl 在前端生成,vue-element-admin 上有  我就不再重复叙述了。  

  

 

posted on   朝颜陌  阅读(176)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示