前端基于word模板导出word文档

项目环境

vue2 + js + vue-cli等

依赖包都可以在npm官网找到对应文档 npm官网(英文)

1、依赖

安装依赖

docxtemplater

npm i docxtemplater

file-saver

npm i file-saver

jszip-utils

npm i jszip-utils

jszip

npm i jszip

在对应页面或模块中引入依赖

import Docxtemplater from "docxtemplater";
import { saveAs } from "file-saver";
import JSZipUtils from "jszip-utils";
import JSZip from 'jszip';

2、准备word模板

导出需要依据准备好的word模板导出,word模板放置在vue项目中的public文件夹下;

模板书写依据 docxtemplater ,其是一个用于处理和生成Word文档的模板引擎,使用类似于标签的语法来标记需要被替换或插入的内容;

常见语法:

  1. 替换变量:使用大括号 { } 将要替换的变量包裹起来。例如:{ 变量名称 }。在运行时,你可以通过提供一个数据对象来替换这些变量。

小技巧:如果有很多需要替换的变量,那么可以把这些变量通过编码的方式糅合成一个或几个大变量后再实现替换,降低工作量,同时也可以实现更高的word文档自定义

  1. 循环迭代:使用 {{#each}}{{/each}} 标签来循环迭代一个数组,并在每次迭代中生成相应的内容。
{{#each students}}
Name: {{name}}, Age: {{age}}
{{/each}}

students 为一个包含学生数组的数据对象 ; 每个数组项都包含name和age属性

  1. 条件判断:使用 {{#if}}{{/if}} 标签来进行条件判断,并根据条件的真假来生成相应的内容
{{#if isPassed}}
Congratulations! You have passed the exam.
{{else}}
Sorry, you did not pass the exam.
{{/if}}
  1. 图片

    {%img}

    {%%img} 图片在word中居中

模板里的所定义的变量名称,要和程序中定义的变量名称一样,这样才能成功实现替换

模板案例
在这里插入图片描述

3、编码导出

    // 根据项目需求的不同,需要修改导出函数中的内容
    // 切记,在触发该导出函数前 先把 doc.setData() 中需要的数据先装好 
    handleExport(){
      //这里要引入处理图片的插件,下载docxtemplater后,引入的就在其中了
      var ImageModule = require("docxtemplater-image-module-free");
      // 读取并获得模板文件的二进制内容
      JSZipUtils.getBinaryContent("YangGuangFile.docx", (error, content) => {
      // YangGuangFile.docx 这里是word模板文档的路径,该项目而言在public根目录下,所以,直接写文件名即可
        if (error) {
          throw error;
        }
        // 图片处理
        let opts = {};
        opts = { centered: false };
        opts.getImage = (chartId) => {
          return this.base64DataURLToArrayBuffer(chartId);
        };
        opts.getSize = function (img, tagValue, tagName) {
          //自定义指定图像大小 根据文件名 规定导出的图片大小
          if (tagName === "img1" || tagName === "img2") {
            return [600, 200];
          }
          if (tagName === "img3" || tagName === "img4" || tagName === "img5") {
            return [200, 400];
          }
        };

        // 创建一个PizZip实例,内容为模板的内容
        let zip = new PizZip(content);
        // 创建并加载docxtemplater实例对象
        let doc = new docxtemplater();
        doc.attachModule(new ImageModule(opts));
        doc.loadZip(zip);
        // copyWorldData 是一个对象,包含很多变量,变量名和word模板中定义好的变量名一一对应,其中就有year1,month1等等
        // img1  就是导出图片的名称,也和word模板中定义的图片名一一对应
        // this.$refs.pictureLine1.getChartImg() 在父组件通过ref的方式调用子组件里的getChartImg()方法生成图片
        // 这里的所用的图片子组件是 echarts 二次封装而成的组件
        doc.setData({
          ...copyWorldData,
          img1: this.$refs.pictureLine1.getChartImg(),
          img2: this.$refs.pictureLine2.getChartImg(),
          img3: this.$refs.pictureLine3.getChartImg(),
          img4: this.$refs.pictureLine4.getChartImg(),
          img5: this.$refs.pictureLine5.getChartImg(),
        });
        // try的作用 执行一个可能会抛出异常的操作,如果有异常,通过catch 接收eror后抛出,没有异常不执行catch
        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",
        });
        // 将目标文件对象保存为目标类型的文件,并命名
        // 也可以使用  模板字符串 加入变量, 让每一个导出的word文件都有自己的名字   `文件名${变量}.docx`
        saveAs(out, "自定义导出文件名称.docx");
      });
    }

图片处理 (图片通过echarts自带的导出函数导出)

    // 导出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;
    },

注意事项

需要注意因为接口而导致的异步问题,异步问题会导致数据没有填充上去,异步时确保拿到数据之后再执行导出操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/652445.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于(苍穹外卖)Cache问题的一点困惑与思路

因为本人&#xff0c;em---昨天看的&#xff0c;今天早上就有点迷惑了&#xff0c;在这里记录一下&#xff0c;并捋一下思路&#xff0c; 首先要明确的一点就是&#xff0c;我们是在uesr端进行缓存的&#xff0c;并且&#xff0c;菜品缓存是中的key是 String key "dish…

ora-00392 ora-00312错误处理

检查当前日志组状态 对日志组进行clear操作 重新开库无报错

CSS 一些常见的大坝设备仪器标识绘制

文章目录 需求分析1. 坝基测压管2. 坝体测压管3. 竖向位移兼水平位移测点4. 竖向位移测点5. 三角量水堰6. 水平位移观测工作基点7. 竖向位移观测水准基点8. 其他 需求 绘制一些常见的设备仪器标识符 分析 1. 坝基测压管 <!DOCTYPE html> <html lang"en"…

中国1KM分辨率年平均气温数据集

该数据为中国逐年平均温度数据&#xff0c;空间分辨率为0.0083333&#xff08;约1km&#xff09;&#xff0c;时间为1901年-2022年。该数据集是根据全国2472个气象观测点数据进行插值获取&#xff0c;验证结果可信。本数据集包含的地理空间范围是全国主要陆地&#xff08;包含港…

【ARM+Codesys案例】基于全志T3+Codesys的快递物流单件分离器控制系统

物流涉及国计民生&#xff0c;是在社会发展中不可或缺的一环。随着社会的改革开放&#xff0c;工业发展迅猛&#xff0c;此时也伴随着物流业的快速发展。电商、快递等行业业务量爆发以及人工成本的不断上涨&#xff0c;自动化输送分拣设备市场呈现井喷式发展。物流行业从传统方…

探索智能零售的未来商机与运营策略

探索智能零售的未来商机与运营策略 在智能零售的广阔图景中&#xff0c;无人售货机加盟赫然矗立为一股不可小觑的力量&#xff0c;预示着零售业态未来的转型与机遇。其核心优势多维展开&#xff0c;具体阐述如下&#xff1a; 1. **全天候服务**&#xff1a;无人售货机的运行跨…

ACS美国化学学会文献去哪里查找

今天有位同学求助一篇ACS美国化学学会文献&#xff0c;下面就以这篇文献实例讲解一下如何自己解决文献下载的过程。篇名&#xff1a;Biomimetic Superstructured Interphase for Aqueous Zinc-Ion Batteries 知道文献的来源数据库&#xff0c;直接去文献来源数据库下载文献又准…

两台电脑怎么互传文件?这些方法你值得一试

在日常生活和工作中&#xff0c;我们经常需要在不同电脑之间传输文件&#xff0c;这可能是文档、照片、音乐或其他类型的文件。两台电脑怎么互传文件是非常有用的技能&#xff0c;可以提高工作效率并简化文件共享过程。本文将介绍三种常见的方法&#xff0c;帮助您了解如何在两…

【Pandas】深入解析`pd.to_sql()`函数

【Pandas】深入解析pd.to_sql()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1…

选择排序。

选择排序是一种简单直观的排序算法&#xff0c;其基本思路是在未排序的序列中找到最小&#xff08;或最大&#xff09;元素&#xff0c;然后将其存放到序列的起始位置。 void select_sort(int arr[], int sz) {int i 0;for (i 0; i < sz; i) {int min i;int j 0;for (j…

SSE(Server Sent Event) 踩坑留念

整条链路是 客户端A --> 服务端 A —> 服务端 B 我负责服务端 A 此时要注意 Client 中的 processes 的写法 Post(value “/v2/xx”, processes MediaType.TEXT_EVENT_STREAM) 这样写是一直报错的 改成下面的写法才可以 Post(value “/v2/xx”, processes MediaT…

打破传统界限,数字沙盘演绎乡村魅力!

自古以来&#xff0c;沙盘模型便以其独特的方式汇聚并展现着综合信息。然而&#xff0c;随着多媒体技术的突飞猛进&#xff0c;这一传统展示形式也迎来了深刻的变革&#xff0c;三维数字沙盘应运而生&#xff0c;它不仅融合了先进的科技元素&#xff0c;更以其独特的呈现方式&a…

Rabbit MQ学习之《基础概念》

Message Queue 1 什么是MQ MQ(message queue)&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是message而已&#xff0c;同时是一种跨进程的通信机制&#xff0c;用于上下游传递消息。 在互联网架构中&#xff0c;MQ 是一种非常常见的…

半藏酒业新零售分红制度拆解,起盘运营服务商

半藏酱酒招商模式&#xff0c;白酒合伙人模式&#xff0c;顶层模式设计 社群玩法用这几年的互联网词汇描述叫私域营销。虽然不走传统商超&#xff0c;酒桌之外很少能看到&#xff0c;但随着核心消费者裂变和流量汇聚&#xff0c;现在能见度越来越高&#xff0c;并溢出到达公域。…

【FPGA】Verilog:2-bit 二进制比较器的实现(2-bit binary comparator)

解释 2-bit 二进制比较器仿真结果及过程说明(包括真值表和卡诺图) 真值表和卡洛图如下: 2-bit Binary Comparator A1 A2 B1

密码学基础概念

加密性 什么是加密&#xff1f; 1.对原有的明文数据&#xff0c;执行某种运算&#xff0c;得到密文数据。 2.密文数据对于未授权人员而言&#xff0c;在一定上程度上加大了解读的难度 3.加密功能用于实现机密性 什么是密钥&#xff1f; 1.如同持有保险柜钥匙才能打开保险柜…

记录集连接——kettle开发25

一、记录集连接 记录集连接就像数据库的左连接、右连接、内连接、外连接。 需要注意的是&#xff0c;因为我们是对数据流进行操作&#xff0c;因此我们在进行记录集连接操作前&#xff0c;需要先将数据进行排序。 新版的KETTLE&#xff0c;名字都改了&#xff0c;叫Merge joi…

实现按块复制元素的进阶技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、按块复制元素的重要性 二、使用LED模块创建数组并复制 三、实现按块复制的具体步骤 四…

智能财务分析软件怎么样?看奥威BI现身说法

随着大数据时代的到来&#xff0c;财务分析已不再是简单的数据汇总和报表制作&#xff0c;而是需要运用先进的智能技术&#xff0c;对数据进行深度挖掘和智能分析&#xff0c;以提供有价值的决策支持。在这一背景下&#xff0c;BI智能财务分析软件应运而生&#xff0c;其中奥威…

语音转文字软件哪个好?掌握这3个方法,告别手写记录

开会多又杂&#xff0c;手写记录累死人&#xff1f; 每天的工作日程中&#xff0c;会议总是不可或缺的一部分。不论是团队讨论还是项目汇报&#xff0c;会议记录都是必不可少的。但手写记录会议内容不仅耗时耗力&#xff0c;还容易遗漏重要信息。 那么&#xff0c;有没有更高…