当前位置: 首页 > news >正文

vue 向 docx模板中填充数据生成目标docx 文件

这次做了个项目,其中一个模块的功能就是,根据用户填写的信息生成一个pdf

但是pdf有很多表格,而且格式比较复杂,如果用代码写出这种模板,然后将当前页面生成pdf这种方法显然不太现实,后来发现用填充模板的方法可以实现

1.先安装对应依赖

npm install docxtemplater pizzip --save-dev
npm install jszip-utils --save
npm install jszip --save
npm install file-saver --save

2.在src下新建 utils 目录,新建docx.js 文件,并引入依赖包

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

/**
 4. 导出docx
 5. @param { String } tempDocxPath 模板文件路径
 6. @param { Object } data 文件中传入的数据
 7. @param { String } fileName 导出文件名称
*/
export const exportDocx = (tempDocxPath, data, fileName) => {
  // 读取并获得模板文件的二进制内容
  JSZipUtils.getBinaryContent(tempDocxPath, (error, content) => {
    if (error) {
      throw error
    }
    const zip = new PizZip(content)
    const doc = new Docxtemplater().loadZip(zip)
    console.log(doc)
    doc.setData(data)
    try {
      // render the document (replace all occurences of {first_name} by John, {last_name} by Doe, ...)
      doc.render()
    } catch (error) {
      const e = {
        message: error.message,
        name: error.name,
        stack: error.stack,
        properties: error.properties
      }
      console.log({
        error: e
      })
      // The error thrown here contains additional information when logged with JSON.stringify (it contains a property object).
      throw error
    }
    const out = doc.getZip().generate({
      type: 'blob',
      mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
    }) // Output the document using Data-URI
    saveAs(out, fileName)
  })
}


3.准备模板
在这里插入图片描述
在模板中,将要填充的地方用 {} 包裹一个key值,这就是后面你要传递的数据的key,举例说明
如果你想在联系电话中填充你想填充的号码,此时 你的模板内容 是 {userName},你传递数据的时候就要写成

{userName: '138xxxxxxx'}

这样就可以填充在对应的位置上了

4.使用
首先将准备的docx模板放入 public 文件下下
在这里插入图片描述
注意:一定要放在这个文件下,否则会报错

接着,在页面中引入之前封装好的utils下的js,名字任取,我这里叫exportDocx.js

<template>
  <div class="btn" @click="print">按钮</div>
</template>

<script>
import { exportDocx } from '@/utils/docx.js'
export default {
  components: {},
  data() {
    return {};
  },
  computed: {},
  watch: {},
  methods: {
      print() {
          exportDocx('/templete.docx', {userName: '鸡汤'}, '模版.docx')
      }
  },
  created() {},
  mounted() {},
};
</script>

<style  scoped>
.btn {
    width: 50px;
    height: 50px;
    background-color: pink;
}
</style>

注意这里的

 exportDocx('/templete.docx', {userName: '鸡汤'}, '模版.docx')

注意这里的路径一定是 /templete.docx,我试了几次其他的写法例如相对路径啥的,都会报这个错
在这里插入图片描述
一定是放在public文件下,然后路径写成这样才可以,如果你的vue-cli 版本是2 就放在 static 文件下

这样就可以将你填充的docx模板下载下来

Tip:如果报了这个错
在这里插入图片描述
可以看看这这个
https://bytemeta.vip/repo/open-xml-templating/docxtemplater/issues/632
在这里插入图片描述
docxtemplater 只能处理docx 不能处理 doc格式的文件

检查一下你的模板格式,如果是doc格式需要转换成docx格式

最后如果要生成pdf可以找个插件将word 转换成pdf

相关文章:

  • 内卷时代,扫地机器人何时能成为刚需?
  • 李春葆、严蔚敏关于KMP算法的next数组值差1
  • 驱动开发:通过ReadFile与内核层通信
  • Superset embed Dashboard到React App
  • Kotlin协程基础-CoroutineContext
  • Node学习二十 —— 构建和使用HTTP中间件
  • 解决驱动开发中并发和竞争中的问题----------自旋锁
  • 【VIO】第1讲 IMU 传感器
  • 每日三题 9.30
  • C++ Reference: Standard C++ Library reference: C Library: cmath: llrint
  • NNDL实验: Moon1000数据集 - 弯月消失之谜
  • ROC-RK3588-PC 八核8K人工智能开源主板
  • 2022新版PMP考试有哪些变化?
  • hive集群加了个参数后,union all的任务都执行不了影响业务
  • 攻防演练中防守方的防护措施.
  • 【前端学习】-粗谈选择器
  • ES2017异步函数现已正式可用
  • Invalidate和postInvalidate的区别
  • JAVA SE 6 GC调优笔记
  • JavaScript 奇技淫巧
  • js写一个简单的选项卡
  • React as a UI Runtime(五、列表)
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SegmentFault 2015 Top Rank
  • SpringBoot几种定时任务的实现方式
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 分布式任务队列Celery
  • 每天一个设计模式之命令模式
  • 前端学习笔记之观察者模式
  • 设计模式(12)迭代器模式(讲解+应用)
  • 提醒我喝水chrome插件开发指南
  • 为视图添加丝滑的水波纹
  • 温故知新之javascript面向对象
  • #FPGA(基础知识)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (独孤九剑)--文件系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (九)c52学习之旅-定时器
  • (十六)一篇文章学会Java的常用API
  • (四) Graphivz 颜色选择
  • (一)基于IDEA的JAVA基础12
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .Net Core缓存组件(MemoryCache)源码解析
  • .Net IOC框架入门之一 Unity
  • .NET Micro Framework初体验(二)
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net的C#语言取月份数值对应的MonthName值