首页 > 其他分享 >前端 word 导出

前端 word 导出

时间:2022-12-05 16:34:29浏览次数:45  
标签:canvas word 前端 导出 tagValue image new const any

前端的常规导出,一般是 excel,下载图片什么。word 的导出有点不太一样。

导出前的准备,安装相关依赖

import Docxtemplater from 'docxtemplater'
import PizZip from 'pizzip'
import PizZipUtils from 'pizzip/utils/index.js'
import { saveAs } from 'file-saver'
import ImageModule from 'docxtemplater-image-module-free'

要新新建一个 word 的文件,中间的值用 {} ,类似于 tsx 或者 jsx 的写法,和 src 平级新建一个名称为 public 的文件夹

 

 

 index.docx 的内容

 

 

 第一个箭头,是常规的对象赋值,第二个,是表格循环,第三个是图片的显示

 

export const exportWord = ({ templateName = 'index.docx', docData = {}, fileName = '', fileType = 'docx' }: any) => {
  const base64DataURLToArrayBuffer = (dataURL: any) => {
    const base64Regex = /^data:image\/(png|jpg|jpeg|svg|svg\+xml);base64,/
    const stringBase64 = dataURL.replace(base64Regex, '')
    let binaryString
    if (typeof window !== 'undefined') {
      binaryString = window.atob(stringBase64)
    } else {
      binaryString = Buffer.from(stringBase64, 'base64').toString('binary')
    }
    const len = binaryString.length
    const bytes = new Uint8Array(len)
    for (let i = 0; i < len; i++) {
      const ascii = binaryString.charCodeAt(i)
      bytes[i] = ascii
    }
    return bytes.buffer
  }
  const getBase64 = (img: any) => {
    function getBase64Image({ image, width, height }: any) {
      const canvas = document.createElement('canvas')
      canvas.width = width || image.width
      canvas.height = height || image.height

      const ctx: any = canvas.getContext('2d')
      ctx.drawImage(image, 0, 0, canvas.width, canvas.height)
      var dataURL = canvas.toDataURL()
      return dataURL
    }
    var image = new Image()
    image.crossOrigin = ''
    image.src = img
    return new Promise((resolve, reject) => {
      image.onload = function () {
        resolve(getBase64Image({ image }))
      }
    })
  }

  loadFile(`/${templateName}`, function (error: any, content: any) {
    if (error) {
      throw error
    }
    const imageOpts = {
      getImage: async (tagValue: any, tagName: any) => {
        const base64Regex = /^data:image\/(png|jpg|jpeg|svg|svg\+xml);base64,/
        let newValue: any = ''
        if (base64Regex.test(tagValue)) {
          newValue = base64DataURLToArrayBuffer(tagValue)
        } else if (tagValue.includes('http')) {
          await getBase64(tagValue).then((data) => {
            newValue = base64DataURLToArrayBuffer(data)
          })
        } else {
          await PizZipUtils.getBinaryContent(tagValue, function (error, content) {
            if (!error) {
              newValue = content
            }
          })
        }
        return newValue
      },
      getSize: function (img: any, tagValue: any, tagName: any) {
        return [150, 150]
      }
    }

    const imageModule = new ImageModule(imageOpts)

    const zip = new PizZip(content)

    const doc = new Docxtemplater()
      .loadZip(zip)
      .setOptions({
        paragraphLoop: true,
        linebreaks: true,
        nullGetter: nullGetter as any
      })
      .attachModule(imageModule)
      .compile()
    doc.renderAsync(docData).then(function () {
      const out = doc.getZip().generate({
        type: 'blob',
        mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
      })
      saveAs(out, `${fileName || new Date().getTime()}.${fileType}`)
    })
  })
}

图片的导出,如果是本地的话,填写正确的引入地址,也以直接导出 base64 格式的图片,网络图片,也是需要先转换成 bas464,再导出。网络图片导出有一个小坑,就是跨域问题。一般是用 jq 的一个方法,具体可以再查一下。

标签:canvas,word,前端,导出,tagValue,image,new,const,any
From: https://www.cnblogs.com/ruose/p/16952656.html

相关文章

  • ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: Y
    在Ubuntu下想要登录mysql数据库root@JD:~#mysql-uroot-p报错ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:YES)导致登录......
  • 精选、前端开发N个必备的 VSCode 插件
    目录​​一、汉化vscode​​​​二、vue2代码提示​​​​三、格式化高亮vue代码​​​​四、实时预览网页效果​​​​五、html标签​​​​六、格式化代码​​​​七、规......
  • 前端知识-05-Ajax
    一、简介AJAX即“Asynchronous Javascript And XML”,是指一种创建交互式网页应用的网页开发技术。AJAX=异步 JavaScript 和 XML(标准通用标记语言的子......
  • 前端知识-06-JSON
    什么是JSON?JSON指的是JavaScript对象表示法(JavaScript Object Notation)JSON是轻量级的文本数据交换格式JSON独立于语言 *JSON具有自我描述性,更易理解* ......
  • 前端知识-07-Bootstrap框架
    Bootstrap介绍Bootstrap是Twitter开源的基于HTML、CSS、JavaScript的前端框架。它是为实现快速开发Web应用程序而设计的一套前端工具包。它支持响应式布局,并且在V3版本......
  • 前端知识-08-jQuery
    jQuery介绍jQuery是一个轻量级的、兼容多浏览器的JavaScript库。jQuery使用户能够更方便地处理HTMLDocument、Events、实现动画效果、方便地进行Ajax交互,能够极大地简......
  • 如何通过Java将Word转换为PDF
    Word是我们日常编辑文档内容时十分常用的一种文档格式。但相比之下,PDF文档的格式、布局更为固定,不易被更改。在保存或传输较为重要的文档内容时,PDF文档格式也时很多人的不......
  • 前端基础-04-BOM和DOM
    前戏到目前为止,我们已经学过了JavaScript的一些简单的语法。但是这些简单的语法,并没有和浏览器有任何交互。也就是我们还不能制作一些我们经常看到的网页的一些交互,我们......
  • 前端视频监控和回放方案
    采用方案:1、采用了萤石云(属于海康威视旗下的云服务)视频方案。2、支持第三方、海康部分及萤石云摄像头接入。3、萤石云接入登录入口:登录-用户认证中心(ys7.com)。 绑......
  • Web前端开发中的MCRV模式
     摘要针对前端开发中基于ajax的复杂页面开发所面临的代码规模大,难以组织和维护,代码复用性、扩展性和适应性差等问题,本文尝试以MVC思想为基础,结合Web前端开发中“内容......