vue导出word文档(含ECharts,多图片,表格等)

这篇具有很好参考价值的文章主要介绍了vue导出word文档(含ECharts,多图片,表格等)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

step one

package.json

安装文件包

   

"docxtemplater": "^3.33.0",  //文档模板器

"docxtemplater-image-module-free": "^1.1.1",  //免费图片下载模块

"file-saver": "^2.0.5",  //内存流导出文件流

"jszip": "^3.10.1", //文件、图片打包压缩

"jszip-utils": "^0.1.0",//网页压缩软件

"pizzip": "^3.1.4", // 文件转为zip文件

step two 

 1.导入插件包

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

  2.初始化echarts图表时  将echarts图片转为base64格式(为后续导出准备)

    initChart(id) {
      let mychart = echarts.init(document.getElementById(id))
      mychart.setOption(statisticsOption)
      // ECHARTS图表的图片并转为base64格式
      this.img1 = mychart.getDataURL({
        pixelRatio: 2, // 导出的图片分辨率比例,默认为 1。
        backgroundColor: '#fff' // 导出的图片背景色,默认使用 option 里的 backgroundColor
      })
    },

  3.导出echarts图片,格式转换,官方自带,不需要修改

     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
    },

 4.导出word 具体实现方法(包含发邮件,上传到服务器)

    //点击按钮导出word (形参作为word发送到邮箱标识 无需考虑)
    exportWord(fileExport) {
      //这里要引入处理图片的插件,下载docxtemplater后,引入的就在其中了
      //编写docx模板 本文后续有文档模板语法教学
      var ImageModule = require('docxtemplater-image-module-free')
      var fs = require('fs')
      let _this = this

      // 读取并获得模板文件的二进制内容,放在项目根目录public中即可
      JSZipUtils.getBinaryContent(
        'dataStatistics.docx',
        function (error, content) {
          if (error) {
            throw error
          }

          // 图片处理
          let opts = {}
          opts = { centered: false }
          opts.getImage = chartId => {
            return _this.base64DataURLToArrayBuffer(chartId)
          }
          opts.getSize = function (img, tagValue, tagName) {
            //自定义指定图像大小,此处可动态调试各别图片的大小
            return [50, 100]  //例子:宽50px  高度100px
          }

          // 创建一个PizZip实例,内容为模板的内容
          let zip = new PizZip(content)
          // 创建并加载docxtemplater实例对象
          let doc = new docxtemplater()
          doc.attachModule(new ImageModule(opts))
          doc.loadZip(zip)

          // 设置模板变量的值
          doc.setData({
            ..._this.articleParams,  //详情内容字段(Object)
            table: _this.detailParams,  //表格内容(Array)
            img1: _this.img1,   // echarts图片
          })

          try {
            // 用模板变量的值替换所有模板变量
            doc.render()
          } catch (error) {
            // 抛出异常
            let e = {
              message: error.message,
              name: error.name,
              stack: error.stack,
              properties: error.properties
            }
            console.log(JSON.stringify({ error: e }))
            throw error
          }

          // 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)
          let out = doc.getZip().generate({
            type: 'blob',
            mimeType:
              'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
          })
          //此文件流 可以传送到后端服务器生成二进制文件(包含上传到阿里云服务器)
          if (fileExport == 'export') {
            let formData = new FormData() //创建formdata来存文件
            const chunkfile = new File([out], '数据统计.docx')
            formData.append('file', chunkfile) //存入文件
            formData.append('toEmailList', _this.mailForm.toEmailList)
            formData.append('customSubject', _this.mailForm.customSubject)
            //formData文件  需注意此api请求方式 下文会描述
            dataDetailsEmailApi(formData).then(res => {
              if (res.data.code == 200) {
                _this.$message.success('发送成功')
              }
            })
          } else {
             // 将目标文件对象保存为目标类型的文件,并命名
            saveAs(out, '数据统计.docx')
          }
        }
      )
    },

5.word文档模板

vue导出word包含图表,vue.js,前端,javascript,echarts,word

 step three

效果图:

vue导出word包含图表,vue.js,前端,javascript,echarts,word

vue导出word包含图表,vue.js,前端,javascript,echarts,word 

 

Tips

  1.如果有将文件流上传到服务器需求  axios请求封装 (请求头)

  upLoadFileStream(url, params) {
    return new Promise((resolve, reject) => {
      axios.request({
        url: url,
        method: "post",
        data: params,
        headers: {
          'Content-type': "multipart/form-data",
          clientId: "PC",
        }
      }).then(response => {
        resolve(response)
      })
    })
  }

 2.加入想要以变量的形式上传图片也需要将图片转为base64格式去上传

    (下方为前端实现图片转为base64方法)文章来源地址https://www.toymoban.com/news/detail-639112.html

    creatBase64Sync(imgUrl) {
      return new Promise(function (resolve, reject) {
        // 一定要设置为let,不然图片不显示
        let image = new Image()
        //图片地址
        image.src = imgUrl
        // 解决跨域问题
        image.setAttribute('crossOrigin', 'Anonymous')
        // image.setAttribute('crossOrigin', '*') // 支持跨域图片
        // image.onload为异步加载
        image.onload = function () {
          let canvas = document.createElement('canvas')
          canvas.width = image.width
          canvas.height = image.height
          let context = canvas.getContext('2d')
          context.drawImage(image, 0, 0, image.width, image.height)
          //图片后缀名
          let ext = image.src
            .substring(image.src.lastIndexOf('.') + 1)
            .toLowerCase()
          //图片质量
          let quality = 0.8
          //转成base64
          let dataurl = canvas.toDataURL('image/' + ext, quality)
          //返回
          // console.log(dataurl)
          resolve(dataurl)
        }
      })
    },

到了这里,关于vue导出word文档(含ECharts,多图片,表格等)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【工具插件类教学】NPOI插件使用Excel表格的导入和导出(包含图片)

    目录 一.导入Excel 解析读取 1.选择导入的目标文件 2.解析读取导入的文件

    2024年01月16日
    浏览(20)
  • vue 前端导出页面图表保存为Html格式文档

    vue 前端导出页面图表保存为Html格式文档

    问题描述: 图一 解决思路: 想要达到要求的效果,网上找了很久,最后记录下2种方案: 方案一、使用html2canvas组件,html2canvas的作用就是允许我们直接在用户浏览器上拍摄网页或某一部分的截图。它的屏幕截图是基于DOM元素的,实际上它不会生成实际的屏幕截图,而是基于

    2024年02月03日
    浏览(11)
  • vue导出word文档(图文示例)

    vue导出word文档(图文示例)

    第076个 查看专栏目录: VUE 在Vue中导出Word文档,可以使用第三方库file-saver和html-docx-js。首先需要安装这两个库: npm install file-saver html-docx-js --save 然后在Vue组件中使用这两个库来导出Word文档: 要生成 DOCX,只需将 HTML 文档(作为字符串)传递给 asBlob 方法以接收包含输出文件

    2024年02月19日
    浏览(15)
  • vue 生成word表格文档 前端库介绍

             在Vue中生成Word表格文档,你可以使用一些前端库来帮助你完成这项任务。以下是几个流行的库及其简要介绍:         1. **docxtemplater**:    - **介绍**: docxtemplater是一个基于JavaScript的库,它可以处理docx和pptx模板,允许你通过JSON数据来填充模板。它支持条件、

    2024年02月21日
    浏览(8)
  • 【Python】导出docx格式Word文档中的文本、图片和附件等

    【Python】导出docx格式Word文档中的文本、图片和附件等

    为批量批改学生在机房提交的实验报告,我需要对所有的实验文档内容进行处理。需要批量提取Word文档中的图片和附件以便进一步检查。如何提取?我想到了用起来比较方便的Python,经过试验,方案可行,故此记录。学生的作业主要是docx或者doc文档,学生把项目打成压缩包

    2024年02月07日
    浏览(10)
  • vue 使用docx库生成word表格文档

            在Vue.js中生成Word表格文档,可以通过前端库来实现。这些库可以帮助我们轻松地将HTML表格转换为Word文档(通常是.docx格式)。以下是一些流行的前端库,它们可以用于在Vue项目中生成Word表格文档:                  docx是一个流行的JavaScript库,用于在浏览

    2024年02月21日
    浏览(12)
  • vue中实现将html导出为word文档

    vue中实现将html导出为word文档

    需求:将页面整成理想样式,将想要的那一部分页面导出成word,不用写模板,按照当前页面样式导出即可。(简易版) 保姆级别教程: 第一步:安装需要的依赖 第二步:给导出那部分的容器起个id名 第三步:在需要的地方引入依赖 第四步:获取dom节点myContainer并导出(我写

    2024年02月11日
    浏览(11)
  • vue简易导出word文档——docxtemplater使用介绍

    好久不见,上班时间 时间紧急,把领导要写的文档写好复制了一份发给大家(斜眼笑)。 一、下载依赖 ​​二、在 public 文件夹下创建docx模板 如果后面步骤报错找不到模板,打开docx文档 另存为覆盖 当前文件即可。 三、新建js文件,加入导出实现代码 四、调用页面引入方

    2024年02月14日
    浏览(10)
  • vue2 若依项目,使用plotly.js-dist图表库,将数据图表一键导出为图片

    vue2 若依项目,使用plotly.js-dist图表库,将数据图表一键导出为图片

    此代码适用的场景是一个页面有多个数据图表。 首先需要拿到你生成数据图表的数据, 然后赋值给一个数组,数组需要在data定义,还需要去重。  然后点击导出按钮的代码如下: 单个下载可以点击数据图表的照相机,可以实现单个下载。 如果数据图表做了分页和懒加载,无

    2024年02月12日
    浏览(14)
  • VUE使用docxtemplater导出word(带图片)

    VUE使用docxtemplater导出word(带图片)

    一、docxtemplater docxtemplater 是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容(表格、html、图像)。 npm 是安装 docxtemplater 最简单的方法 二、在导出word前,需要准备一个word模板文件(按自己所需最后导出的样式),放到public文件夹下,

    2024年02月07日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包