zoukankan      html  css  js  c++  java
  • 后台项目导出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

  • 相关阅读:
    第八周总结和实验六
    第七周总结与实验五
    遍历目录中的所有文件和目录,并生成全路径
    python watchdog
    Offer_answer_with_SDP_rfc3264
    [转]UML八大误解
    leetcode周赛220
    Codeforces Round #690 (Div. 3)
    学习资料
    鱼眼图与六面图转换(python)
  • 原文地址:https://www.cnblogs.com/xz233/p/14450831.html
Copyright © 2011-2022 走看看