vue 使用docx-preview 预览替换文档内的特定变量

在开发合同管理中,需要使用到此功能,就是替换合同模板内的一些字符串,如:甲乙方名称,金额日期等,合同内容不变。效果如下:

 使用docx-preview 好处是只预览不可编辑内容。

前端vue

import { renderAsync } from 'docx-preview';// 替换文件内容
function onWordSave(){axios({method: "post",responseType: "blob", // 因为是流文件,所以要指定blob类型url: Http.getBaseURL() + "/contract/Index/setWord", // 自己的服务器,提供的一个word下载文件接口data:{'fieldData':select_field.value,'tem_id':form.value.tem_id}}).then(response => {if (response.status === 200) {// 检查Content-Type是否是预期的类型const contentType = response.headers['content-type'] || response.headers['Content-Type'];if (contentType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {// 数据正确,处理blob数据ElMessage({type:'success', message:'替换模板内容成功'})file_url.value = response.data}else {// 数据类型不匹配ElMessage({type:'error', message: '模板内容替换失败'})}} else {// 响应状态不是200ElMessage({type:'error', message: 'failed to open stream: No such file or directory'})}}).catch(error => {// 请求失败,处理错误ElMessage({type:'error', message:error})});
}
// 预览文件
function docxRender() {ContractFileRef.value.innerHTML = ''; // 清空之前的内容if(file_url.value != ''){let blob = new Blob([file_url.value]); // 将 OSS 文件转为 Blob 对象// 渲染文档并获取内容控件renderAsync(blob, ContractFileRef.value);}
}

后端 控制器方法:

 /*** @名称:模板内容替换* User: congxion* Date: 2024/10/31 16:44*/public function setWord(){try{$param = $this->request->param();if(empty($param['tem_id'])){return jsonError('请选择合同模板');}if(empty($param['fieldData'])){return jsonError('没有可替换的内容');}return $res = ContractService::setWord($param['fieldData'], $param['tem_id']);}catch(\Exception $e){return jsonError($e->getMessage());}}

后端逻辑层方法

public static function setWord($data,$met_id){$template = Db::name('template')->where(['id'=>$met_id])->find();if(empty($template['file_url'])){throw new Exception('没有模板文件');}// 加载Word文档$template_path = public_path().'storage/'.$template['file_url'];if(!file_exists($template_path)){throw new Exception(public_path().'storage/'.$template['file_url']);}//读取模版word的版本最好是docx,要不然可能会读取不了$templateProcessor = new TemplateProcessor($template_path);$data_str = "";foreach ($data as $k => $v) { //读取模版word的版本最好是docx,要不然可能会读取不了$newname = !empty($v['newname']) ? $v['newname']: '';$templateProcessor->setValue($v['key'], $newname); //替换模板中的变量,对应word里的 ${xxxx}$data_str .= $v['key'].$newname;}$save_name = GetRandStr(5).'_'.time() . '.docx'; //保存的文件名$return_path = 'storage/temword/'.date('Ymd').'/'; //保存的文件路径$savepath = public_path() . $return_path;if (!is_dir($savepath)) {@mkdir($savepath,0777);}$templateProcessor->saveAs($savepath.$save_name); //将内容保存到生成新的word中$data_md5 = md5($met_id.$data_str);// 缓存文件名Cache::set($data_md5, $return_path.$save_name, 3600);// 或输出到浏览器header('Content-Description: File Transfer');header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');header('Content-Disposition: attachment; filename="output.docx"');header('Cache-Control: must-revalidate');header('Pragma: public');header('Expires: 0');readfile($savepath.$save_name);exit;}

接口返回的是文件流,前端插件可直接使用

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依项目搭建

若依的大版本 基本环境搭建 搭建注意点

(11)(2.1.6) Hobbywing DroneCAN ESC(二)

文章目录 前言 2 配置ESC 3 测试 4 设置视频 5 参数说明 前言 具有 CAN 接口(including these)的业余 ESC 支持 DroneCAN,它允许自动驾驶仪通过 CAN 控制 ESC /电机,并检索单个转速、电压、电流和温度。 2 配置ESC 默认情…

JVM结构图

JVM(Java虚拟机)是Java编程语言的核心组件之一,负责将Java字节码翻译成机器码并执行。JVM由多个子系统组成,包括类加载子系统、运行时数据区、执行引擎、Java本地接口和本地方法库。 类加载子系统(Class Loading Subsy…

【智能算法改进】混沌映射策略--一网打尽

摘要 本文研究了多种混沌映射策略在智能算法中的改进效果,提出了一种综合不同混沌映射策略的多元混合方法,以提高算法的全局优化能力和收敛速度。通过引入不同的混沌映射(如 Logistic、Tent、Sine 等)生成初始种群分布&#xff0…

QML —— QML调用C++两种方法(附完整测试源码)

代码效果 说明 QML 其实是对JavaScript 的扩展,融合了Qt Object 系统,它是一种新的解释型的语言, QML 引擎虽然由Qt C++ 实现,但QML 对象的运行环境,说到底和C++ 对象的上下文环境是不同的,是平行的两个世界。如果你想在QML 中访问C++ 对象,那么必然要找到一种途径来在两…

剧本杀小程序,市场发展下的新机遇

剧本杀作为休闲娱乐的一种游戏方式,在短时间内进入了大众视野中,受到了广泛关注。近几年,剧本杀行业面临着创新挑战,商家需求寻求新的发展机遇,在市场饱和度下降的趋势下,获得市场份额。 随着科技的不断进…

mysql error:1449权限问题 及 用户授权

一、权限问题 Got error: 1449: The user specified as a definer (skip-grants userskip-grants host) does not exist when using LOCK TABLES 在迁移数据库时,定义的definer,在两个数据库之间不同步时,要将不存在的definer改成数据库中已…

Spark 的Standalone集群环境安装与测试

目录 一、Standalone 集群环境安装 (一)理解 Standalone 集群架构 (二)Standalone 集群部署 二、打开监控界面 (一)master监控界面 (二)日志服务监控界面 三、集群的测试 &a…

基于SpringBoot+Vue实现新零售商城系统

作者主页:编程千纸鹤 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参…

SAP RFC 用户安全授权

一、SAP 通讯用户 对于RFC接口的用户,使用五种用户类型之一的“通讯”类型,这种类型的用户没有登陆SAPGUI的权限。 二、对调用的RFC授权 在通讯用户内部,权限对象:S_RFC中,限制进一步可以调用的RFC函数授权&#xff…

【Java Web】搭建Web环境以及初识JSP Tomcat

文章目录 程序架构Web服务器TomcatJSP概述主要特点基本语法综合示例程序调试和排错 代码示例 程序架构 C/S(Client/Server,客户端/服务器)和 B/S(Browser/Server,浏览器/服务器)是两种常见的软件系统架构模…

如何建购物网站提升用户体验

在构建一个购物网站时,用户体验是至关重要的,它直接影响到顾客的满意度和转化率。为了提升用户体验,可以从以下几个方面入手。 首先,网站设计应简洁明了。确保导航栏清晰易懂,让用户在寻找商品时不会迷失。此外&#x…

qt QTableView详解

1、概述 QTableView 是 Qt 框架中的一个高级视图类,用于以表格形式展示二维数据。它基于 QAbstractItemView,并与模型(通常是 QAbstractTableModel 或 QStandardItemModel)结合使用,以实现数据的展示和交互。QTableVi…

Android TextView自动换行文本显示不全解决

某些情况下,TextView自动换行后,会出现每行结尾处显示不全的问题, 如图: 常见解决方案: 设置TextView的“ellipsize”属性为“end” 实测无效!将TextView外部的Layout改为RelativeLayout 实测无效&…

Rust 力扣 - 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 长度为k的二进制子串所有取值的集合为[0, sum(k)]&#xff0c;其中sum(k)为1 2 4 … 1 << (k - 1) 我们只需要创建一个长度为sum(k) 1的数组 f &#xff0c;其中下标为 i 的元素用来标记字符串中子串…

typescript的简介

简介 tsc npm install -g typescripttsc -v作用 检查类型和语法错误&#xff0c;提前纠错 ts的类型 如何穿件带有ts的vue工程 作用 常见类型 用法 编写一个ts文件 let username:string "John";let age:number 25;let isUpdated:boolean true;let data:any &q…

一文搞懂:AI网关这个新东西是什么意思?有没有开源免费的选择?

AI网关是什么意思&#xff1f;有什么用&#xff1f; AI网关是企业应用与内外部大模型之间的桥梁&#xff0c;它位于企业应用与内外部大模型的调用交汇点。 AI网关的主要功能 是 将应用请求 通过集中管理模块 转发给 1 内部自建模型、2 外部大模型服务提供商&#xff0c;甚至 …

在Java中,实现数据库连接通常使用JDBC

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

机器人零位、工作空间、坐标系及其变换,以UR5e机器人为例

机器人中的主要坐标系 在机器人中&#xff0c;常用的坐标系包括&#xff1a; 基坐标系&#xff08;Base Frame&#xff09;&#xff1a;固定在机器人基座上的坐标系&#xff0c;用于描述机器人的整体位置和方向&#xff0c;是其他所有坐标系的参考点。 连杆坐标系&#xff08…

CSS的配色

目录 1 十六进制2 CSS中的十六进制2.1 十六进制颜色的基本结构2.2 十六进制颜色的范围2.3 简写形式2.4 透明度 3 CSS的命名颜色4 配色4.1 色轮4.2 互补色4.3 类似色4.4 配色工具 日常在开发小程序中&#xff0c;客户总是希望你的配色是美的&#xff0c;但是美如何定义&#xff…