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

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出

  • 预览
      • 安装插件
      • 示例代码
      • 项目目录结构截图
      • 实际效果截图
  • 动态渲染 .docx 文档(带图片),预览、导出
      • 安装插件
      • docx 模板文件内容
      • 完整代码

预览效果展示

预览

必须是 .docx 文档,别的类型的文档请自行研究实现

  • 通过 vue-office/docx 插件预览 docx 文档
  • 通过 vue-office/excel 插件预览 excel 文档
  • 通过 vue-office/pdf 插件预览 pdf 文档

安装插件

npm install @vue-office/docx vue-demi

示例代码

<template><VueOfficeDocx :src="docx" @rendered="rendered"></VueOfficeDocx>
</template><script setup lang="ts">
import VueOfficeDocx from "@vue-office/docx";
import "@vue-office/docx/lib/index.css";
import { ref } from "vue";
const docx = ref("../../public/01.docx");const rendered = () => {console.log("加载完毕...");
};
</script><style lang="scss" scoped></style>

项目目录结构截图

在这里插入图片描述

实际效果截图

在这里插入图片描述

动态渲染 .docx 文档(带图片),预览、导出

安装插件

npm install docxtemplater
npm install docxtemplater-image-module-free
npm install pizzip
npm install file-saver

docx 模板文件内容

  • vue3项目把该模板 docx 文件放 public 文件夹里面
    在这里插入图片描述

完整代码

<template><div class="common-layout"><el-container style="height: 100vh"><el-asidestyle="width: 200px;background: rgb(216.8, 235.6, 255);padding: 80px 0 0 30px;"><el-button type="danger" @click="wordWrite(content)">写入</el-button><el-button type="danger" @click="wordExport(content)">导出</el-button><div></div></el-aside><el-container><el-header style="background: rgb(197.7, 225.9, 255)"><H2>Vue3 项目通过 docxtemplater 插件动态渲染 .docx文档(带图片)预览,并导出</H2></el-header><el-main><template v-if="!isShow"><h3>准备写入 docx 文件内容</h3><div><p>姓名:{{ content.name }}</p><p>年龄:{{ content.age }}</p><p>性别:{{ content.gender }}</p><p>学历:{{ content.education }}</p><p>个人简介:{{ content.introduction }}</p><p>头像:<img :src="content.avatar" alt="头像" /></p></div></template><div class="m-4"><!-- docx 文件预览插件 --><VueOfficeDocx :src="docx" v-if="isShow"></VueOfficeDocx></div></el-main></el-container></el-container></div>
</template><script setup lang="ts">
import { ref } from "vue";
import Docxtemplater from "docxtemplater";
import ImageModule from "docxtemplater-image-module-free";
import PizZip from "pizzip";
import PizZipUtils from "pizzip/utils";
import { saveAs } from "file-saver";
import VueOfficeDocx from "@vue-office/docx"; // 导入预览插件
import "@vue-office/docx/lib/index.css"; // 导入预览插件样式
const isShow = ref(false); // 预览组件状态const docx = ref("../../public/03.docx"); // 导入 docx 模板文件
import img from "@/assets/01.jpg"; // 导入本地图片// 准备写入内容
const content = ref({name: "张三",age: 25,gender: "男",education: "小学",introduction:"我是一个热爱学习的学生,喜欢阅读各种类型的书籍,同时也喜欢参加各种活动,比如参加比赛、组织活动等等。",avatar: img,
});/*** 生成文档内容* @param docData 准备写入内容*/
const GenerateADocument = (docData) => {return new Promise((resole, reject) => {const loadFile = function loadFile(url: any, callback: any) {PizZipUtils.getBinaryContent(url, callback);};loadFile(docx.value, function (error: any, content: any) {if (error) {reject(new Error("模板文件未找到"));}// 处理图片let opts: any = {};opts.centered = false;opts.fileType = "docx";opts.getImage = function (tagValue: any) {return new Promise(function (resolve, reject) {PizZipUtils.getBinaryContent(tagValue,function (error: any, content: any) {if (error) {return reject(error);}return resolve(content);});});};opts.getSize = function () {//这里是生成的word文件里图片的宽和高// 可以根据自己的需要进行修改,获取图片实际的宽和高,然后返回return [255, 195];};let imageModule = new ImageModule(opts);var zip = new PizZip(content);let doc = new Docxtemplater().loadZip(zip).attachModule(imageModule).compile();doc.resolveData(docData).then(function () {doc.render();let out = doc.getZip().generate({type: "blob",mimeType:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",});if (out) {resole(out);} else {reject(new Error("文件生成失败"));}});});});
};/*** 写入方法* @param docData 准备写入内容*/
const wordWrite = (docData) => {GenerateADocument(docData).then((res) => {docx.value = URL.createObjectURL(res);isShow.value = true;}).catch((err) => {console.log(err, "err");});
};/*** 导出方法* @param docData 准备写入内容*/
const wordExport = (docData) => {GenerateADocument(docData).then((res) => {saveAs(res, "测试文件" + ".docx");}).catch((err) => {console.log(err, "err");});
};
</script>

vue-office 插件预览的时候文件中表格样式被破坏的问题正在研究。

相关文章:

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出

Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档&#xff08;带图片&#xff09;预览&#xff0c;并导出 预览安装插件示例代码项目目录结构截图实际效果截图 动态渲染 .docx 文档&#xff08;带图片&#xff09;&#xff0c;预览、导出安装插件docx 模板文件内容完整代码…...

ollama迁移已下载的单个模型到服务器

ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的&#xff0c;部署和运行都很简单&#xff0c;是否高效就另说了。但最起码&#xff0c;他能充分利用用户的硬件设备&#xff0c;在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的&#xf…...

Photoshop 2025安装教程包含下载安装包,2025最新版图文安装教程

文章目录 前言一、Photoshop 2025下载二、Photoshop 2025安装教程1. 安装包解压2. 找到安装程序3. 以管理员身份运行4. 安装选项设置5. 选择安装路径6. 开始安装7. 安装完成8. 启动软件9. 软件主界面 前言 无论你是专业设计师&#xff0c;还是刚接触图像处理的新手&#xff0c…...

【Python · PyTorch】时域卷积网络 TCN

1. 概念 1.1 定义 TCN 是时域卷积网络&#xff08;Temporal Convolutional Network&#xff09;的简称。TCN是于2018年 Shaojie Bai 等人提出的一个处理时序数据的卷积模型。 TCN结合了CNN卷积并行性计算和RNN长期依赖的优势&#xff0c;CNN可在多个通道同时处理卷积核运算&…...

Mysql update更新数据执行流程

update 的执行流程是以select查询为基础执行的&#xff01;&#xff01;你不明白select执行流程&#xff1f;没关系&#xff0c;这篇博客照样让你明白&#xff0c;update执行流程&#xff01; 存储引擎是什么&#xff1f; 如果把数据库比作一个大仓库&#xff0c;那么存储引擎…...

WMS WCS系统架构

1.1立体仓库现场网络架构图 1.2立体仓库WMS系统与WCS系统架构 1.3系统技术选型 WEB端技术&#xff1a;node.js、vue 、element、jquery、html、js、css等 API端技术&#xff1a;spring boot 、msyql、redis、mybatis等 WCS技术&#xff1a;c#、winform、OPC、socket、S7等 …...

数据结构5(初):续写排序

目录 1、外排序 2、计数排序 1、外排序 上一节中提到的排序都可以用来进行内排序&#xff0c;但是只有归并排序的思想可以用来进行外部排序&#xff0c;因为文件数据是没办法像数组那样进行访问的。 例如&#xff1a; #include <stdio.h> #include <assert.h> …...

ROS多机通信(三)——Ubuntu Ad-Hoc 组网通信配置指南

基本概念 Ad-Hoc 网络是一种简单的点对点无线网络&#xff0c;设备&#xff08;称为节点&#xff09;可以直接相互通信或者通过中继间接通信&#xff0c;而无需依赖中央接入点。在这种网络中&#xff0c;所有设备是对等的&#xff0c;没有固定的路由器或基础设施支持。 特点 …...

23种设计模式-状态(State)设计模式

状态设计模式 &#x1f6a9;什么是状态设计模式&#xff1f;&#x1f6a9;状态设计模式的特点&#x1f6a9;状态设计模式的结构&#x1f6a9;状态设计模式的优缺点&#x1f6a9;状态设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是状态设计模式…...

ARM架构薄记2——ARM学习架构抓手(以ARMv7为例子)

ARM架构薄记2——ARM学习架构抓手&#xff08;以ARMv7为例子&#xff09; ​ 架构学习需要学习哪一些部分呢&#xff1f;笔者接触过的架构有Intel-X86, AMD64&#xff0c;RISC-V和Arm架构&#xff08;V7最多&#xff09;&#xff0c;笔者简单的翻了一些课本和教材&#xff0c;…...

STM32C011 进入停止模式和待机模式

对于STM32C011J4M3微控制器&#xff0c;你可以使用HAL库来实现进入停止模式&#xff08;Stop Mode&#xff09;和待机模式&#xff08;Standby Mode&#xff09;。下面是进入停止模式和待机模式的示例代码&#xff1a; 进入停止模式代码示例&#xff1a; #include "stm3…...

kaggle上经典泰坦尼克项目数据分析探索

之前了解在kaggle上这个项目很火&#xff0c;最近想要加强一下python数据分析&#xff0c;所以在kaggle上找到这个项目进行学习探索&#xff0c;下面是将一些学习资料以及过程整理出来。 一、首先我们了解一下项目背景以及如何找到这个项目。 kaggle项目地址: https://www.k…...

影刀魔法指令3.0:开启自动化新篇章

在数字化飞速发展的今天&#xff0c;自动化工具已经成为提升工作效率、优化工作流程的重要手段。影刀RPA作为一款强大的自动化软件&#xff0c;其最近推出的魔法指令3.0版本&#xff0c;更是让人大开眼界&#xff0c;为自动化操作带来了全新的可能性。 影刀魔法指令3.0简介 影…...

15 python 数据容器-字典

在 Python 的编程世界里&#xff0c;字典是一种超实用的数据类型&#xff0c;它就像打工人的工作资料夹&#xff0c;能把各种不同类型的信息有条理地存起来&#xff0c;还能快速找到你需要的内容。对于刚开始学习编程的小伙伴来说&#xff0c;掌握字典的用法&#xff0c;能让你…...

Linux的一些常见指令

一、ls指令 语法&#xff1a; ls (选项) 功能&#xff1a; ls可以查看当前目录下的所有文件和目录。 常用选项&#xff1a; -a:列出目录下的所有文件&#xff0c;包括以点&#xff08;.&#xff09;开头的隐含文件 。-d:将目录像文件一样显示&#xff0c;不显示其下的文件。…...

Pre-flash和Main flash

在相机拍照过程中&#xff0c;Pre-flash&#xff08;预闪光&#xff09; 和 Main flash&#xff08;主闪光&#xff09; 是常见的两种闪光灯使用模式&#xff0c;通常用于提高低光环境下的拍摄质量&#xff0c;尤其在自动曝光&#xff08;AE&#xff09;和自动对焦&#xff08;…...

jmm-java内存模型

java内存模型----底层原理 底层原理 从Java代码到最终执行的CPU指令的流程&#xff1a; 最开始&#xff0c;我们编写的Java代码&#xff0c;是*.java文件在编译&#xff08;javac命令&#xff09;后&#xff0c;从刚才的*.java文件会变出一个新的Java字节码文件&#xff08;…...

合宙780E开发学习-LUATOS-SOC云编译自定义固件

登录https://luatos.com 点击登录&#xff0c;使用合宙erp账号登录即可 点击右上角构建&#xff0c;点击右上角菜单新构建&#xff0c;自定义构建名称&#xff0c;可新建多个 勾选想要的组件 点击右上角保存修改&#xff0c;只有点击准备就绪&#xff08;注意&#xff1a;一定…...

解决Centos使用yum命令报错“Cannot find a valid baseurl for repo: base/7/x86_64”问题

一、问题描述 我们在使用Centos7.9使用【sudo yum install influxdb2】命令安装influxDB数据库的时候提示“Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/release=7&arch=x86_64&repo=os&infra=stock …...

好用的Markdown阅读编辑器Typora破解记录

Typora破解 一、下载Typora二、安装Typora三、破解Typora &#x1f600; 记录一下Typora破解记录&#xff0c;怕不常用忘记咯&#xff0c;感觉自己现在的脑子就像我的肠子一样&#xff0c;刚装进去就么得了。。。&#x1f614; Typroa算是用起来很舒服的Markdown阅读器了吧&am…...

c#在work线程中怎样更新UI控件

最近笔者调试修改项目&#xff0c;碰到了c#在work线程中怎样更新UI控件中的场景&#xff0c;简单总结了下&#xff0c;主要有两个方法&#xff1a; 方法1&#xff1a;通过System.Windows.Application.Current.Dispatcher.Invoke来更新UI控件 System.Windows.Application.Curre…...

RabbitMQ三种队列深度解析:区别、场景与未来趋势

嗯&#xff0c;用户让我分析RabbitMQ三种队列的区别、应用场景、技术原理和未来趋势&#xff0c;还要写一篇三千字的文章。首先&#xff0c;我需要回顾一下搜索结果&#xff0c;看看有哪些资料可用。 根据搜索结果&#xff0c;RabbitMQ的三种队列是经典队列&#xff08;Classi…...

自然语言处理(13:RNN的实现)

系列文章目录 第一章 1:同义词词典和基于计数方法语料库预处理 第一章 2:基于计数方法的分布式表示和假设&#xff0c;共现矩阵&#xff0c;向量相似度 第一章 3:基于计数方法的改进以及总结 第二章 1:word2vec 第二章 2:word2vec和CBOW模型的初步实现 第二章 3:CBOW模型…...

WebSocket接入SSL证书

目录 碎碎念解决方法创建 HTTPS WebSocket 服务器创建系统服务启动服务 碎碎念 在访问网站时&#xff0c;使用 HTTPS 非常重要。HTTPS 协议不仅可以确保数据传输的安全性&#xff0c;还可以防止中间人攻击和数据篡改等安全问题。任何没有 SSL 证书的内容都可能会被拒绝访问。因…...

无人机宽带自组网机载电台技术详解,50KM超远图数传输系统实现详解

以下是关于无人机宽带自组网机载电台技术以及50KM超远图数传输系统实现的详解&#xff1a; 无人机宽带自组网机载电台技术详解 无人机宽带自组网机载电台是一种专门为无人机设计的通信设备&#xff0c;它支持宽带数据传输和自组网功能。这种电台的实现技术涉及多个方面&#x…...

MySQL 表 t1 建立联合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效

文章目录 联合索引 abc 均范围扫描时的索引生效情况无回表 表数据量非常少无回表 表数据量多有回表总结 联合索引 abc 均范围扫描时的索引生效情况 场景&#xff1a;表 t1 建立联合索引 (a, b, c)&#xff0c;在 where a < ? and b > ? and c < ? 中哪些索引生效…...

Spring Boot定时任务设置与实现

Spring Boot定时任务设置与实现 在Spring Boot中&#xff0c;可以使用Scheduled注解来创建定时任务。以下是一个简单的示例&#xff0c;展示了如何在项目启动后每5秒调用一次指定的方法。 1. 添加依赖 首先&#xff0c;确保你的pom.xml文件中包含Spring Boot的依赖&#xff…...

#vue中解决异步请求的竞态

// composables/useFetchWithoutRace.js import { ref } from vue; import axios from axios;// 定义一个可复用的 Composition 函数&#xff0c;处理带有竞态控制的异步请求 export function useFetchWithoutRace() {// 定义响应式变量 latestRequestId&#xff0c;用于追踪最…...

BP神经网络+NSGAII算法(保真)

BP神经网络NSGAII算法 非常适合用来当作实验验证自己的结论&#xff0c;构建一个神经网络模型&#xff0c;并使用NSGAII多目标优化算法来实现多领域的毕业论文的设计。仅仅使用简单的matlab代码就可以实现自己的多目标优化任务。 BP神经网络算法 我的任务是预测三个变量的值…...

【CXX-Qt】4.1 extern “RustQt“

QObjects Properties Methods Signals #[cxx_qt::bridge] mod ffi {extern "RustQt" {} }extern “RustQt” 部分是 CXX-Qt 桥接的核心&#xff0c;用于声明 Rust 类型和签名&#xff0c;使其可用于 Qt 和 C。 CXX-Qt 代码生成器使用你的 extern “RustQt” 部…...