后台项目导出word功能(vue+echarts+elemnt)纯前端

vue+echarts纯前端导出word

图表:echarts

UI:element

安装

npm install docxtemplater pizzip  --save
npm install jszip-utils --save 
npm install jszip --save
npm install file-saver --save
npm install --save docxtemplater-image-module-free 
npm install pizzip --save

引入

import JSZipUtils from 'jszip-utils'
import docxtemplater from 'docxtemplater'
import { saveAs } from 'file-saver'
import PizZip from 'pizzip'

HTML

<el-button @click="exportWord" type="primary">导出word</el-button>

JS

导出图片的设置
getBaseImage(index, chart) {
      let img = new Image()
      img.src = chart.getDataURL({
        pixelRatio: 2, //分辨率
        backgroundColor: '#fff', //背景色
      })
      // 向父组件传图片base64格式
      this.setImageBase(index, img.src)
    },
导出图base64存入本地
setImageBase(index, url) {
      this.imageListBase[index].url = url
    },
导出图的格式通过插件渲染
base64DataURLToArrayBuffer(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() {
      let ImageModule = require('docxtemplater-image-module-free')
      let _this = this
      // 读取并获得模板文件的二进制内容
      // 模板文件在public文件夹下
      JSZipUtils.getBinaryContent('word.docx', function (error, content) {
        if (error) {
          throw error
        }
        let opts = {}
        opts.centered = true
        opts.fileType = 'docx'
        opts.getImage = function (chartId) {
          return _this.base64DataURLToArrayBuffer(chartId)
        }
        opts.getSize = function () {
          return [800, 450]
        }
        let imageModule = new ImageModule(opts)
        let zip = new PizZip(content)
        let doc = new docxtemplater()
        doc.attachModule(imageModule)
        doc.loadZip(zip)
        doc.setData({
          //导出的数据
          ..._this.form,
          table: _this.tableData,
          table1: _this.tableData1,
          imagelist: _this.imageListBase,
        })

        try {
          doc.render()
        } catch (error) {
          let e = {
            message: error.message,
            name: error.name,
            stack: error.stack,
            properties: error.properties,
          }
          throw error
        }
        let out = doc.getZip().generate({
          type: 'blob',
          mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        })
        saveAs(out, 'echartsWord.docx')
      })
    },

data数据

form: {
        name: '***',
        name1: '***',
      },
      tableData: [],
      tableData1: [],
      imageListBase: [{ title: '***' }, { title: '***' }, { title: '***' }],

word模板

模板存放于public文件目录下

word

posted @ 2021-02-26 10:11  孤常一人  阅读(1800)  评论(0编辑  收藏  举报