vue项目html导出到word

用到的插件名称 html-docx-js

npm i html-docx-js

封装js方法

import htmlDocx from 'html-docx-js/dist/html-docx'
// 对应插件名 html-docx-js

// 下载文件
function saveAs (blob, fileName) {
  const a = document.createElement('a')
  const url = URL.createObjectURL(blob)

  a.href = url
  a.download = fileName
  a.display = 'none'
  document.body.appendChild(a)
  a.click()
  document.body.removeChild(a)
  URL.revokeObjectURL(url)
}

/**
 *
 * @param element 要打印元素的id
 * @param filename 导出文件名
 */
export function exportword (element, filename) {
  /*
步骤1 :因为canvas是运行在内存中的,所以也不能通过cloneNode方法克隆下来(克隆下来是空的),
所以先克隆再在克隆的dom上进行操作是不可取的。所以需要在原DOM上生成img,
设置display: none从而使图片不影响页面展示,并插入到对应canvas元素之前(为了保证顺序不变)。
*/
  const app = document.getElementById(element)
  const cloneApp = app.cloneNode(true)
  const canvases = app.getElementsByTagName('canvas')
  const cloneCanvases = cloneApp.getElementsByTagName('canvas')
  const promises = Array.from(canvases).map((ca, index) => {
    return new Promise((res) => {
      const url = ca.toDataURL('image/png', 1)
      const img = new Image()
      img.onload = () => {
        URL.revokeObjectURL(url)
        res()
      }
      img.src = url
      // 插入clone的dom的canvas之前
      cloneCanvases[index].parentNode.insertBefore(img, cloneCanvases[index])
    })
  })

  /*
  步骤2 :删除掉canvas元素
  */
  // 删除clone的dom中的所有的canvas
  const cloneCanvas = cloneApp.getElementsByTagName('canvas')
  Array.from(cloneCanvas).forEach((ca) => ca.parentNode.removeChild(ca))

  /* 步骤3 :将dom副本传入插件,生成文件对象,并下载下来 */
  Promise.all(promises).then(() => {
    const converted = htmlDocx.asBlob(`
   <!DOCTYPE html>
    <html lang="en">
      ${document.head.outerHTML}
      <body>
      ${cloneApp.outerHTML}
      </body>
      </html>`)
    saveAs(converted, `${filename}.docx`)
  })
}

需要注意 ,html的css样式导出不生效,需要使用行内样式!

​​​​​​​el-table不生效  需要自己写原生table标签

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值