其他分享
首页 > 其他分享> > vue中导出图表数据成为word文档(含echats)

vue中导出图表数据成为word文档(含echats)

作者:互联网

安装依赖

	// 下载
	npm install docxtemplater pizzip  --save
	npm install jszip-utils --save 
	npm install jszip --save
	npm install file-saver --save
	//在需要导出Word的vue文件导入
	import JSZipUtils from 'jszip-utils';
    import docxtemplater from 'docxtemplater';
    import { saveAs } from 'file-saver';
    import PizZip from 'pizzip';

设置模板

在这里插入图片描述
注意:vue cli2 放在static目录下,vue cli3 放在public

获取echats的base64

  const myChart = echarts.init(element)
      const img = new Image()
      // 获取图表base64
      img.src = myChart.getDataURL({
        type: 'png',
        pixelRatio: 2,
        backgroundColor: '#fff'
      })

注意要图片格式一定要是png的,如果获取不到对应的base64,一个是把echats的动画关掉,一个是定时器延时获取。

导出word文档

    // 这里是官网写的应该是处理图片的代码,照着写就行,没动过
    base64DataURLToArrayBuffer (dataURL) {
      console.log(dataURL, 'dataURL')
      const base64Regex = /^data:image\/(png|jpg|svg|svg\+xml);base64,/
      if (!base64Regex.test(dataURL)) {
        return false
      }
      const stringBase64 = dataURL.replace(base64Regex, '')
      let binaryString
      if (typeof window !== 'undefined') {
        binaryString = window.atob(stringBase64)
      } else {
        binaryString = new Buffer(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
    },
       // 导出word
    exportWord () {
      // 这里要引入处理图片的插件,下载docxtemplater后,引入的就在其中了
      const ImageModule = require('docxtemplater-image-module-free')
      const that = this
      // 这里是我的Word路径,在static文件下
      JSZipUtils.getBinaryContent('../../../static/input.docx', function (error, content) {
        if (error) {
          throw error
        }
        const opts = {}
        opts.centered = true
        opts.fileType = 'docx'
        opts.getImage = (tag) => {
          return that.base64DataURLToArrayBuffer(tag)
        }
        opts.getSize = () => {
          return [600, 400]// 这里可更改输出的图片宽和高
        }
        const zip = new PizZip(content)
        const doc = new docxtemplater()
        doc.attachModule(new ImageModule(opts))
        doc.loadZip(zip)
        //这个地方的数据就是word的变量名是用一个,是需要解析的。
        doc.setData({
          txt: that.txt,
          imgBase64: that.imgBase64,
          imgBase64_two: that.imgBase64_two,
          imgBase64_type: that.imgBase64_type,
          imgBase64_level: that.imgBase64_level
          // 一切要导出的数据名称
        })
        try {
          doc.render()
        } catch (error) {
          const e = {
            message: error.message,
            name: error.name,
            stack: error.stack,
            properties: error.properties,
          }
          console.log(JSON.stringify({
            error: e
          }))
          throw error
        }
        const out = doc.getZip().generate({
          type: 'blob',
          mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        })
        saveAs(out, `数据分析.docx`)
      })
    },
  }

小坑

mock不要和导出文件一起用,需要关掉。图片加载不出来,看看是不是没有加载出来;先用浏览器打开base64的图片。
在这里插入图片描述
点击对面的copy进行复制,不要自己手动去复制。

参考项目:https://github.com/weitangshi/study.git
参考博客:https://blog.csdn.net/target_for/article/details/108122644
https://www.jianshu.com/p/b3622d6f8d98

标签:vue,echats,doc,base64,new,imgBase64,error,word,const
来源: https://blog.csdn.net/qq_41163341/article/details/112242628