vue项目根据word模版导出word文件

news2024/12/23 17:28:36

一、安装依赖

//1、docxtemplater

npm install docxtemplater pizzip -S


//2、jszip-utils

npm install jszip-utils -S


//3、pizzip

npm install pizzip -S


//4、FileSaver
npm install file-saver --save

二、创建word模版

也就是编辑一个word文档,文档中需要动态取值的地方用{变量}取值;表格数据可以进行循环,以{#数组变量名}开始,以{/数组变量名}结束,如果数组变量是字符串而非对象则{#table}{.}{/table}。图片以{%图片base64变量名}展示,{%%图片base64变量名}表示图片居中。word模版放在public下。

word模版占位符用法

三、导出方法

//导入包
import PizZip from 'pizzip'
import docxtemplater from 'docxtemplater'
import JSZipUtils from 'jszip-utils'
import { saveAs } from 'file-saver'

data() {
    return {
        form: {
            userName: "杰克",
            value: "666", 
        },
        // 表格信息
        tableData: [],
        //图片
        img1: '',
        img2: ''
    };
},



methods:{
// 导出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;
},
// 点击导出word
exportWord() {
    //这里要引入处理图片的插件,下载docxtemplater后,引入的就在其中了
    var ImageModule = require('docxtemplater-image-module-free');
    var fs = require("fs");
    const expressions = require("angular-expressions");

    let _this = this;

    // 读取并获得模板文件的二进制内容,放在项目中即可(wordTemplate.docx是public文件下的word模版)
    JSZipUtils.getBinaryContent("wordTemplate.docx", function(error, content) {
        if (error) {
            throw error;
        };

        expressions.filters.size = function (input, width, height) {
            return {
                data: input,
                size: [width, height],
            };
        };
        function angularParser(tag) {
            const expr = expressions.compile(tag.replace(/’/g, "'"));
            return {
                get(scope) {
                    return expr(scope);
                },
            };
        }

        // 图片处理
        let opts = {}
            opts = { centered: false };
            opts.getImage = (chartId)=> {
            return _this.base64DataURLToArrayBuffer(chartId);
        }
        opts.getSize = function(img, tagValue, tagName) {
            console.log(tagName)
            //自定义指定图像大小,此处可动态调试各别图片的大小
            if (tagName === "chartImg1") return [249,200];
            return [300,200];
        }

        // 创建一个PizZip实例,内容为模板的内容
        let zip = new PizZip(content);
        // 创建并加载docxtemplater实例对象
        let doc = new docxtemplater();
        // 去除未定义值所显示的undefined
        doc.setOptions({nullGetter: function() { 
            return ""; 
        }});
        doc.attachModule(new ImageModule(opts));
        doc.loadZip(zip);


        // 设置模板变量的值(键是word模版中用的值,值是vue文件data中的变量)
        doc.setData({
            ..._this.form,
            table: _this.tableData,
            img1: _this.img1,
            img2: _this.img2
        });

        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"
        });
        // 将目标文件对象保存为目标类型的文件,并命名
        saveAs(out, "测试.docx");
    });
},
}

ECHARTS图表的图片并转为base64格式,在图表加载完成时

this.img2 = myChart2.getDataURL({
      pixelRatio: 2,      // 导出的图片分辨率比例,默认为 1。
      backgroundColor: '#fff'   // 导出的图片背景色,默认使用 option 里的 backgroundColor
});

如果是需要动态添加的背景图,可以直接将图片的base64码赋值给img1变量。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【开源分享】在线客服系统搭建-基于php和swoole客服系统CRMchat(附源码完整搭建教程)...

CRMChat是一款开源的在线客服系统&#xff0c;后台管理使用thinkphp框架&#xff0c;消息通讯使用swoole扩展&#xff0c;现在我来部署搭建一下。 这是一款不可商用的开源客服系统&#xff0c;如果有商用需求可以访问我的网站&#xff1a;gofly.v1kf.com 域名解析 以阿里云为例…

C++笔记之unique_ptr转移堆内空间的所有权

C笔记之unique_ptr转移堆内空间的所有权 code review! 文章目录 C笔记之unique_ptr转移堆内空间的所有权一.C笔记之unique_ptr转移堆内空间的所有权方法1.使用std::move函数方法2.使用std::unique_ptr的reset方法方法3.返回unique_ptr方法4.std::unique_ptr的swap方法 二.uniq…

http学习笔记3

第 11 章 Web 的攻击技术 11.1 针对 Web 的攻击技术 简单的 HTTP 协议本身并不存在安全性问题&#xff0c;因此协议本身几乎不会成为攻击的对象。应用 HTTP 协议的服务器和客户端&#xff0c;以及运行在服务器上的 Web 应用等资源才是攻击目标。目前&#xff0c;来自互联网的攻…

LaWGPT零基础部署win10+anaconda

准备代码&#xff0c;创建环境 # 下载代码 git clone gitgithub.com:pengxiao-song/LaWGPT.git cd LaWGPT # 创建环境 conda create -n lawgpt python3.10 -y conda activate lawgpt pip install -r requirements.txt # 启动可视化脚本&#xff08;自动下载预训练模型约15GB&…

(三)行为模式:1、责任链模式(Chain of Responsibility Pattern)(C++示例)

目录 1、责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;含义 2、责任链模式的UML图学习 3、责任链模式的应用场景 4、责任链模式的优缺点 5、C实现责任链模式的实例 1、责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;含义 责任…

ElasticSearch相关概念

1、概述 先说Elasticsearch的文件存储&#xff0c;Elasticsearch是面向文档型数据库&#xff0c;一条数据在这里就是一个文档&#xff0c;用JSON作为文档序列化的格式&#xff0c;比如下面这条用户数据&#xff1a; {"name" : "John","sex"…

论文写作中容易忽略的空格

持续更新吧&#xff0c;给自己提个醒&#xff0c;老是忘 1、数字和单位之间有一个四分之一空格&#xff0c;严格来说属于特殊符号&#xff0c;不知之间按空格键 应用场景&#xff1a; latex&#xff1a;语句$ 3\,m$ 可以实现&#xff0c; origin&#xff1a;网上的教程说可…

【HarmonyOS】【DevEco Studio】ohpm安装失败该如何解决?

【关键词】 HarmonyOS、DevEco Studio、ohpm安装失败 【问题背景及解决方案】 最近遇到很多DevEco Studio安装ohpm失败的问题&#xff0c;下面给大家介绍几种出现的问题以及解决方案&#xff1a; 1、ohpm not set up&#xff0c;报错截图如下&#xff1a; ​ 解决方案&…

AWS WAF实战、优势对比和缺陷解决

文章目录 挑战和目标AWS WAF的优势AWS WAF的不足我是怎么做的?什么是比较好的AWS WAF设计? 笔者为了解决公司Web站点防御性问题&#xff0c;较为深入的研究AWS WAF的相关规则。面对上千万的冲突&#xff0c;笔者不得设计出一种能漂亮处理冲突数据WAF规则。 AWS WAF开发人员在…

angular 的 alert 的应用分析笔记

声明: 今天自己在写angular项目时 遇到alert问题 做个记录而已 不代表广大angular用户,如果多你有帮助那个就是凑巧!!!! 效果: 第一步: 第二步: 第三步: 是不是找不到,ModaUtils这个方法(因为我项目里有这个 文件 里边存了 alert和confirm等公共方法) 都说了是个人笔记,看看…

启动 WSL 2时报错“参考的对象类型不支持尝试的操作”

引言 启动 WSL 2时报错“参考的对象类型不支持尝试的操作”。 或者是&#xff1a;占位程序接收到错误数据 Error code: Wsl/Service/0x8007273d 一番搜索 发现说和代理有关。 解决方案&#xff1a; 最有用的解决方案看这个issue。 这里我给出我的总结方案&#xff1a; 首…

84-基于stm32单片机蔬菜大棚温湿度光照强度监测控制系统Proteus仿真+源码

资料编号&#xff1a;084 一&#xff1a;功能介绍&#xff1a; 1、采用stm32单片机OLED显示屏光照强度检测DHT11温湿度电机按键LED灯&#xff0c;制作一个温湿度采集、光照强度检测&#xff0c;OLED显示相关数据&#xff0c; 2、通过按键设置温度上限、湿度下限、光照强度下限值…

webrtc学习(五)-peerconnect_client

一.类关系图 conduct实现webrtc native api相关实现的调用&#xff0c;创建answer&#xff0c;创建offer&#xff0c;是最核心的&#xff0c;对于两个模块的调度&#xff1b;mainwindow主要用于界面的展示与调度。橙色模块主要是信令模块&#xff0c;所有的用户的登录登出交换信…

71 # 协商缓存的配置:通过内容

对比&#xff08;协商&#xff09;缓存 比较一下再去决定是用缓存还是重新获取数据&#xff0c;这样会减少网络请求&#xff0c;提高性能。 对比缓存的工作原理 客户端第一次请求服务器的时候&#xff0c;服务器会把数据进行缓存&#xff0c;同时会生成一个缓存标识符&#…

Android系统-进程-AIDL

引言&#xff1a; Android系统的进程间通信&#xff0c;主要是Binder&#xff0c;AIDL就是一种Android接口定义语言&#xff0c;主要就是为了能更简单方便地实现跨进程通信。 概念与理解&#xff1a; AIDL&#xff1a;Android Interface Definition Language 序列化&#x…

NVIDIA Jetson 项目:机器人足球比赛

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑器的3D应用场景 事实上&#xff0c;整个比赛都致力于这个想法。RoboCup小型联盟&#xff08;SSL&#xff09;视觉停电技术挑战赛鼓励团队“探索本地传感和处理&#xff0c;而不是非车载计算机和全球摄像机感知环境的…

非结构化数据库-MinIO基本集成

是什么 MinIO 是一个高性能的分布式对象存储服务&#xff0c;适合存储非结构化数据&#xff0c;如图片&#xff0c;音频&#xff0c;视频&#xff0c;日志等。对象文件最大可以达到5TB。 安装启动 mkdir -p /usr/local/minio cd /usr/local/minio# 下载安装包 wget https:/…

Spring之AOP的特性

一. AOP简介 AOP是Aspect-Oriented Programming的缩写&#xff0c;即面向切面编程。利用oop思想&#xff0c;可以很好的处理业务流程&#xff0c;但是不能把系统中某些特定的重复性行为封装到模块中。例如&#xff0c;在很多业务中都需要记录操作日志&#xff0c;结果我们不得…

互联网的边缘与核心部分

边缘部分是用户直接使用&#xff0c;用来进行通信和资源共享。 核心部分由大量网络和连接网络的路由器组成。这部分是为边缘部分提供服务的。 边缘部分 处在互联网边缘的部分就是连接在互联网上的所有的主机。这些主机又称为端系统(end system)。 主机间的通信其实是进程间…

(三)行为型模式:3、解释器模式(Interpreter Pattern)(C++示例)

目录 1、解释器模式&#xff08;Interpreter Pattern&#xff09;含义 2、解释器模式的UML图学习 3、解释器模式的应用场景 4、解释器模式的优缺点 5、C实现解释器模式的实例 1、解释器模式&#xff08;Interpreter Pattern&#xff09;含义 解释器模式&#xff08;Interp…