vue2前端导出Excel,包含图片

代码如下:

<template>
  <el-button size="medium" type="primary" @click="exportExcel('查询结果')">导出</el-button>
</template>
<script>
import { exportToExcel } from "@/vendor/ExportExcelWithPic.js";
export default {
  name: 'index',
  data() {
    return {
      tableOption: [
        { label: '符合度', prop: 'conformity' },
        { label: '姓名', prop: "jbxxName" },
        { label: '证件号', prop: 'jbxxSFZ' },
        { label: '照片', prop: 'imageUrl' }
      ],
      arrList: [
        {
          name: '张三',
          sfz: '333000198911111111',
          imageUrl: 'https://tse1-mm.cn.bing.net/th/id/OIP-C.YSEB07oeAkdI4hYML8LcmQHaE8?rs=1&pid=ImgDetMain',
        },
        {
          name: '李四',
          sfz: '333000199011112222',
          imageUrl: 'https://shijuepi.com/uploads/allimg/201222/1-2012221T114.jpg',
        }
      ]
    }
  },
  methods: {
    // 导出
    exportExcel(name) {
      if (this.arrList.length > 0) {
        let arr = this.arrList
        let tHeader = []
        let filterVal = []
        this.tableOption.filter(item => tHeader.push(item.label))
        this.tableOption.filter(item => filterVal.push(item.prop))
        const tableData = arr
        const data = this.formatJson(filterVal, tableData);
        this.getExcelInfo(tHeader, data, name + new Date().toLocaleDateString());
      } else {
        this.$message.warning('暂无数据')
      }
    },
    formatJson(filterVal, jsonData) {
      return jsonData.map(v => filterVal.map(j => v[j]))
    },
    getExcelInfo(theadData, tbodyData, dataname) {
      let re = /http/ // 字符串中包含http,则默认为图片地址
      let th_len = theadData.length // 表头的长度
      let tb_len = tbodyData.length // 记录条数
      let width = 100 // 设置图片大小
      let height = 120

      // 添加表头信息
      let thead = '<thead><tr>'
      for (let i = 0; i < th_len; i++) {
        thead += '<th>' + theadData[i] + '</th>'
      }
      thead += '</tr></thead>'
      // 添加每一行数据
      let tbody = '<tbody>'
      for (let i = 0; i < tb_len; i++) {
        tbody += '<tr>'
        let row = tbodyData[i] // 获取每一行数据
        for (let key in row) {
          if (re.test(row[key])) { // 如果为图片,则需要加div包住图片
            // 
            tbody += '<td style="width:' + width + 'px; height:' + height + 'px; text-align: center; vertical-align: middle"><div style="display:inline"><img src=\'' + row[key] + '\' ' + ' ' + 'width=' + '\"' + width + '\"' + ' ' + 'height=' + '\"' + height + '\"' + '></div></td>'
          } else {
            tbody += '<td style="text-align:center">' + row[key] + '</td>'
          }
        }
        tbody += '</tr>'
      }
      tbody += '</tbody>'
      let table = thead + tbody
      // 导出表格
      exportToExcel(table, dataname)
    },

  }
}
</script>

ExportExcelWithPic.js


/* eslint-disable */
let idTmr;
const getExplorer = () => {
    let explorer = window.navigator.userAgent;
    //ie
    if (explorer.indexOf("MSIE") >= 0) {
        return 'ie';
    }
    //firefox

    else if (explorer.indexOf("Firefox") >= 0) {
        return 'Firefox';
    }
    //Chrome
    else if (explorer.indexOf("Chrome") >= 0) {
        return 'Chrome';
    }
    //Opera
    else if (explorer.indexOf("Opera") >= 0) {
        return 'Opera';
    }
    //Safari
    else if (explorer.indexOf("Safari") >= 0) {
        return 'Safari';
    }
}
// 判断浏览器是否为IE
const exportToExcel = (data, name) => {
    // 判断是否为IE
    if (getExplorer() == 'ie') {
        tableToIE(data, name)
    } else {
        tableToNotIE(data, name)
    }
}

const Cleanup = () => {
    window.clearInterval(idTmr);
}

// ie浏览器下执行
const tableToIE = (data, name) => {
    let curTbl = data;
    let oXL = new ActiveXObject("Excel.Application");

    //创建AX对象excel
    let oWB = oXL.Workbooks.Add();
    //获取workbook对象
    let xlsheet = oWB.Worksheets(1);
    //激活当前sheet
    let sel = document.body.createTextRange();
    sel.moveToElementText(curTbl);
    //把表格中的内容移到TextRange中
    sel.select;
    //全选TextRange中内容
    sel.execCommand("Copy");
    //复制TextRange中内容
    xlsheet.Paste();
    //粘贴到活动的EXCEL中

    oXL.Visible = true;
    //设置excel可见属性

    try {
        let fname = oXL.Application.GetSaveAsFilename("Excel.xlsx", "Excel Spreadsheets (*.xlsx), *.xlsx");
    } catch (e) {
        print("Nested catch caught " + e);
    } finally {
        oWB.SaveAs(fname);

        oWB.Close(savechanges = false);
        //xls.visible = false;
        oXL.Quit();
        oXL = null;
        // 结束excel进程,退出完成
        window.setInterval("Cleanup();", 1);
        idTmr = window.setInterval("Cleanup();", 1);
    }
}

// 非ie浏览器下执行
const tableToNotIE = (function () {
    // 编码要用utf-8不然默认gbk会出现中文乱码
    let uri = 'data:application/vnd.ms-excel;base64,',
        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><meta charset="UTF-8"><!--[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]--></head><body><table>{table}</table></body></html>',
        base64 = function (s) {
            return window.btoa(unescape(encodeURIComponent(s)));

        },

        format = (s, c) => {
            return s.replace(/{(\w+)}/g,
                (m, p) => {
                    return c[p];
                })
        }
    return (table, name) => {
        let ctx = {
            worksheet: name,
            table
        }

        //创建下载
        let link = document.createElement('a');
        link.setAttribute('href', uri + base64(format(template, ctx)));

        link.setAttribute('download', name);


        // window.location.href = uri + base64(format(template, ctx))
        link.click();
    }
})()

export {
    exportToExcel
}
  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Vue前端导出Excel,可以使用vue-json-excel插件。首先,需要安装vue-json-excel依赖,可以通过运行命令`npm install vue-json-excel`来安装。然后,在Vue实例中引入并注册JsonExcel组件,可以通过以下代码实现: ```javascript import Vue from "vue"; import JsonExcel from "vue-json-excel"; Vue.component("downloadExcel", JsonExcel); ``` 接下来,可以在需要导出Excel的地方使用`download-excel`组件,并传入要导出的数据。例如: ```html <download-excel :data="json_data">Download Data <img src="download_icon.png" /></download-excel> ``` 其中,`:data`属性用于传入要导出的数据,可以根据需要进行修改。这样,当用户点击"Download Data"按钮时,就会触发导出Excel的操作。请注意,你需要将`download_icon.png`替换为实际的下载图标路径。 需要注意的是,vue-json-excel插件的使用较为复杂,上手成本较大,并且高级功能可能需要付费。如果需要更多高级功能,可以考虑使用xlsx-style库来实现。 #### 引用[.reference_title] - *1* [vue-json-excel前端导出excel教程](https://blog.csdn.net/qq_19309473/article/details/123039120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Vue前端导出Excel文件实现方案](https://blog.csdn.net/weixin_43188432/article/details/113470968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值