vue实现excel数据下载,后端提供的list由前端转excel并下载

前言,因为项目需求需要,我们需要把后端传来的list转成excel模板,并且下载下来)

之前有用的插件,但是会有少0的情况,如下

所以采用另一个项目用过的方法,最终完美实现效果,如下:

1,首先我们来看下后端提供的数据结构

2,具体前端代码如下

封装的组件,需要的同学直接copy就行(这个方法是在 src - mixins -crud.js文件上写的)

javascript 复制代码
import * as XLSX from 'xlsx'; //直接引入就行


 /**
     * 导出Excel
     * @param json   要导出的json数据
     * @param name   要导出的文件名
     * @param type   要导出的数据类型
     * @constructor
     */
    mixinExportJosnToExcel(json, name = 'data', type = 'application/octet-stream') {
      let wb = { SheetNames: [], Sheets: {}, Props: { }};
      if (!Array.isArray (json)) {
        // eslint-disable-next-line no-param-reassign
        json = [json];
      }
      json.forEach (item => {
        wb.SheetNames.push (item.sheetName);
        wb.Sheets[item.sheetName] = XLSX.utils.json_to_sheet (item.sheetValues, item.sheetOptions);
      });
      const wopts = { bookType: 'xlsx', bookSST: false, type: 'binary' };

      // eslint-disable-next-line no-use-before-define
      let blob = new Blob ([s2ab (XLSX.write (wb, wopts))], { type });

      let link = document.createElement ('a');

      document.body.appendChild (link);
      link.style.display = 'none';
      link.href = window.URL.createObjectURL (blob);
      link.download = `${name}.xlsx`;
      link.click ();
      // 释放资源
      setTimeout (() => {
        URL.revokeObjectURL (link.href);
      }, 100);

      function s2ab(s) {
        if (typeof ArrayBuffer !== 'undefined') {
          const buf = new ArrayBuffer (s.length);
          const view = new Uint8Array (buf);

          for (let i = 0; i !== s.length; ++i) {
            view[i] = s.charCodeAt (i) & 0xFF;
          }
          return buf;
        }
        const buf = new Array (s.length);

        for (let i = 0; i !== s.length; ++i) {
          buf[i] = s.charCodeAt (i) & 0xFF;
        }
        return buf;

      }
    },
  }
}

举例使用:

html

html 复制代码
<div class="prompt_three"@click="downloadList()">下载失败结果</div>

现在引入

javascript 复制代码
<script>
    import crud from "@/mixins/crud";
    export default {
     mixins: [crud],
     }
</script>

在方法里

javascript 复制代码
  //下载失败清单
    async downloadList() {
      try {   //这里的模板数据应是从上传之后的确定按钮拿到的
        let arr = []
        let telephone=''
        this.errorList.forEach(one=>{   //this.errorList就是拿到的后端list
            if(one.serviceConsultantList && one.serviceConsultantList.length>0){
              one.serviceConsultantList.forEach((two,index) => {
                console.log(index+1 , one.serviceConsultantList.length)
                telephone += `${two.telephone}${index+1 == one.serviceConsultantList.length ? '' : '、'}`
              })
            }else{
              telephone=''
            }
            arr.push({
              '酒店code': one.hotelId,
              '服务顾问姓名':one.nameList && one.nameList.length>0?one.nameList.join("、"):null,
              '服务顾问联系方式': telephone,
              '失败原因': one.errorReason,
            })
        })
        const json = {
          sheetName: '酒店导入失败明细',
          sheetValues: arr
        };
        this.mixinExportJosnToExcel (json,'批量导入员工失败清单');
      } catch (error) {
        console.log(error,"error")
      }
    },

ok,已完

相关推荐
桂月二二4 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
CodeClimb5 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
沈梦研5 小时前
【Vscode】Vscode不能执行vue脚本的原因及解决方法
ide·vue.js·vscode
hunter2062065 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb5 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角5 小时前
CSS 颜色
前端·css
轻口味6 小时前
Vue.js 组件之间的通信模式
vue.js
浪浪山小白兔6 小时前
HTML5 新表单属性详解
前端·html·html5
lee5767 小时前
npm run dev 时直接打开Chrome浏览器
前端·chrome·npm
2401_897579657 小时前
AI赋能Flutter开发:ScriptEcho助你高效构建跨端应用
前端·人工智能·flutter