js-table2excel导出表格中图片不显示的解决方法

找到node_modules中的js-table2excel里面的index.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.xls", "Excel Spreadsheets (*.xls), *.xls");
  } 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会出现中文乱码
  const 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>';

  const base64 = function (s) {
    return window.btoa(unescape(encodeURIComponent(s)));
  }

  const format = (s, c) => {
    return s.replace(/{(\w+)}/g,
      (m, p) => {
        return c[p];
      })
  }

  return (table, name) => {
    const ctx = {
      worksheet: name,
      table
    }

    const url = uri + base64(format(template, ctx));

    if (navigator.userAgent.indexOf("Firefox") > -1) {
      window.location.href = url
    } else {
      const aLink = document.createElement('a');
      aLink.href = url;
      aLink.download = name || '';
      let event;
      if (window.MouseEvent) {
        event = new MouseEvent('click');
      } else {
        event = document.createEvent('MouseEvents');
        event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
      }
      aLink.dispatchEvent(event);
    }
  }
})()

// 导出函数
const table2excel = async (column, data, excelName) => {
  const typeMap = {
    image: getImageHtml,
    text: getTextHtml
  }

  let thead = column.reduce((result, item) => {
    result += `<th>${item.title}</th>`
    return result
  }, '')

  thead = `<thead><tr>${thead}</tr></thead>`
  var tbody = ``
  for (var item of data) {
    var temp = ``
    for (var item1 of column) {
      temp += await typeMap[item1.type || 'text'](item[item1.key], item1)
    }
    tbody += `<tr>${temp}</tr>`
  }

  tbody = `<tbody>${tbody}</tbody>`

  const table = thead + tbody
  // console.log(table)
  // 导出表格
  exportToExcel(table, excelName)

  function getTextHtml (val) {
    return new Promise((resolve, reject) => {
      resolve(`<td style="text-align: center;vnd.ms-excel.numberformat:@">${val}</td>`)
    })
    // return `<td style="text-align: center;vnd.ms-excel.numberformat:@">${val}</td>`
  }

  function imgUrlToBase64 (url) {
    return new Promise((resolve, reject) => {
      if (!url) {
        resolve('')
      }
      if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(url)) {
        // 图片地址
        const image = new Image()
        // 设置跨域问题
        image.setAttribute('crossOrigin', 'anonymous')
        // 图片地址
        image.src = url
        image.onload = () => {
          const canvas = document.createElement('canvas')
          const ctx = canvas.getContext('2d')
          canvas.width = image.width
          canvas.height = image.height
          ctx.drawImage(image, 0, 0, image.width, image.height)
          // 获取图片后缀
          const ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase()
          // 转base64
          const dataUrl = canvas.toDataURL(`image/${ext}`)
          resolve(dataUrl || '')
        }
      } else {
        // 非图片地址
        resolve('非(png/jpe?g/gif/svg等)图片地址');
      }
    })

  }
  function getImageHtml (val, options) {
    return new Promise((resolve, reject) => {
      imgUrlToBase64(val).then(res => {
        options = Object.assign({ width: 40, height: 60 }, options)
        resolve(`<td style="width: ${options.width}px; height: ${options.height}px; text-align: center; vertical-align: middle"><img  src="${res}" width=${options.width} height=${options.height}></td>`)
      }).catch(e => {
        resolve(e)
      })
    })
  }
}

export default table2excel

一些网络地址的图片在导出时需要等待异步加载完成之后再转为base64赋值给img标签中的src属性

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 使用js-table2excel无法直接导出图片js-table2excel是一个用于将HTML表格导出Excel文件的JavaScript库,它主要是用于导出表格的数据。而图片通常不是直接插入到表格显示的,而是通过在表格插入图片的URL或者使用img标签来显示。因此,js-table2excel无法直接导出表格图片。 如果想要将图片一起导出Excel文件,可以使用其他的方法。一种常见的方法是使用其他JavaScript库,如js-xlsx或者SheetJS,这些库可以处理更复杂的Excel导出需求,包括导出带有图片表格。这些库提供了更多功能和选项,允许通过编程方式将图片插入到Excel文件。 另外,还可以考虑将图片保存为Base64编码的字符串,并将该字符串作为数据保存在表格的某个单元格。然后,使用js-table2excel将带有Base64编码图片字符串的表格导出Excel文件。虽然这种方法不会直接导出图片,但可以在表格保留图片的信息。 总之,由于js-table2excel库的特性限制,无法直接使用该库导出带有图片Excel文件。但是可以通过其他方法来实现这个目标,比如使用其他JavaScript库或者将图片保存为Base64编码的字符串。 ### 回答2: js-table2excel是一个用于将HTML表格导出Excel文件的JavaScript库,它并不支持直接将图片导出Excel文件。这是因为Excel文件的格式与HTML的图片格式不同。 要在Excel文件导出图片,可以使用其他方法,例如使用Excel插件或将图片嵌入到生成的Excel文件。 一种常见的方法是使用Excel插件,例如js-xlsx或SheetJS。这些插件提供了更强大的功能,可以直接将图片插入到生成的Excel文件,同时支持更复杂的Excel操作,如合并单元格、格式化等。 另一种方法是使用基于服务器端的技术来生成Excel文件,例如使用Node.js的库或其他服务器端语言,然后在服务器端将图片嵌入到生成的Excel文件。这种方法较复杂,需要有服务器端编程的知识和技巧。 总结起来,使用js-table2excel无法直接导出图片Excel文件,但可以尝试使用其他工具或方法来实现此功能。具体方法可以根据实际需求和技术条件选择适合的方案。 ### 回答3: 使用js-table2excel插件无法直接导出图片js-table2excel插件是一个用于导出html表格数据到Excel的插件,它主要用于导出数据表格,而不是导出图片。如果需要导出带有图片Excel文件,可以考虑使用其他方法。 一种可行的解决方案是使用其他插件或库来实现导出带有图片Excel文件。例如,可以使用js-xlsx库来生成Excel文件,并将图片插入到Excel表格的相应单元格。具体步骤如下: 1. 首先,将图片转换为Base64编码。 2. 创建一个xlsx工作簿对象。 3. 创建一个工作表对象,并在适当的单元格插入图片。可以使用`addImage`方法来实现。 4. 将工作表添加到工作簿。 5. 将工作簿保存为Excel文件。 这样就可以导出带有图片Excel文件了。需要注意的是,这种方法可能比较复杂,需要一定的编程知识和经验。 总之,如果使用js-table2excel插件无法导出图片,可以考虑使用其他插件或库来实现导出带有图片Excel文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值