关于使用docx-preview来实现预览word文件的功能(我用的若依框架)

最近公司让做一个关于内容预览的功能

1.刚开始怎么弄

一开始在网上搜集了大量资料,基本上都不符合关于我的要求,不过最后还是找到了,话不多说,直接上关键步骤

1.1 安装docx-preview

# 正常安装
npm install docx-preview --save#如果出现报错,忽略错误,直接安装
npm install docx-preview --legacy-peer-deps# 解释:--legacy-peer-deps:安装时忽略所有 peerDependencie

1.2 安装babel

# 正常安装
npm install --save-dev @babel/core @babel/preset-env babel-loader#如果出现错误,忽略,直接安装
npm install --save-dev @babel/core @babel/preset-env babel-loader --legacy-peer-deps

1.3安装raw-loader(不确定是否跟该插件有关系)

#正常安装
npm install raw-loader#如果报错,忽略错误,直接安装
npm install raw-loader --legacy-peer-deps

2.配置文件

2.1配置vue.config.js文件

# 在该配置文件中找到moudule.exports
# 官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
module.exports = {#关键的webpack配置configureWebpack: {module:{rules:[{#这里我加了raw-loader,不确定是否跟这个配置有关系test: /\.txt$/,use: 'raw-loader'},{test: /\.mjs$/,include: /node_modules/,type: "javascript/auto",use: {loader: "babel-loader",options: {presets: ["@babel/preset-env"]}},}]}
}

3.配置请求

3.1若以框架中已经封装好了请求方式,我在这里举个例子:

// 导出word功能export function exportTotal(query) {return request({url: '/exportWrod', // 导出文档的接口(java用输出流文件)method: 'post',params: query,responseType: 'blob' // 最重要的步骤,一定要加上这个})}

然后再在自己需要预览功能页面中:

3.1.1 建立控件
<div v-if="previewDialogVisible"><el-dialog title="预览" :visible.sync="previewDialogVisible" append-to-body width="50%"><div ref="file" v-loading="previewLoading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0,0,0,0)" style="height: 550px; overflow-y:auto;"></div></el-dialog>
</div>
3.1.2 写控件里面的变量
 data() {return {previewDialogVisible: false, // 对话开关previewLoading:false, // 是否加载}}
3.2.3 写一个预览按钮
<el-button @click="YL(scope.row)">预览</el-button>
3.2.4 按钮点击方法

关键步骤为,将流文件转化为Blob对象

# 在此之前需要自己定一个变量docx
import { renderAsync } from 'docx-preview';
let docx = null;
# 再在created里面
created() {docx = require('docx-preview');window.JSZip = require('jszip');
}
#再写自己的方法YL(val){this.previewDialogVisible = true;this.previewLoading = true;const orderCheckData = {};orderCheckData.orderNo = val.orderNo;orderCheckData.time = val.time;exportTotal(orderCheckData).then(res => {const blob = new Blob([res]); // 关键步骤docx.renderAsync(blob,this.$refs.file,null,{className: 'docx',inWrapper: true,ignoreWidth: false,ignoreHeight: false,ignoreFonts:false,breakPages: true,ignoreLastRenderedPageBreak: true,experimental: true,useBase64URL:false,trimXmlDeclaration: true,debug: false})console.dir("转化完成");}).catch((err)=>{console.dir("报错了");console.dir(err);});},

附原API

// renders document into specified element
renderAsync(document: Blob | ArrayBuffer | Uint8Array, // could be any type that supported by JSZip.loadAsyncbodyContainer: HTMLElement, //element to render document content,styleContainer: HTMLElement, //element to render document styles, numbeings, fonts. If null, bodyContainer will be used.options: {className: string = "docx", //class name/prefix for default and document style classesinWrapper: boolean = true, //enables rendering of wrapper around document contentignoreWidth: boolean = false, //disables rendering width of pageignoreHeight: boolean = false, //disables rendering height of pageignoreFonts: boolean = false, //disables fonts renderingbreakPages: boolean = true, //enables page breaking on page breaksignoreLastRenderedPageBreak: boolean = true, //disables page breaking on lastRenderedPageBreak elementsexperimental: boolean = false, //enables experimental features (tab stops calculation)trimXmlDeclaration: boolean = true, //if true, xml declaration will be removed from xml documents before parsinguseBase64URL: boolean = false, //if true, images, fonts, etc. will be converted to base 64 URL, otherwise URL.createObjectURL is usedrenderChanges: false, //enables experimental rendering of document changes (inserions/deletions)renderHeaders: true, //enables headers renderingrenderFooters: true, //enables footers renderingrenderFootnotes: true, //enables footnotes renderingrenderEndnotes: true, //enables endnotes renderingdebug: boolean = false, //enables additional logging}): Promise<WordDocument>/// ==== experimental / internal API ===
// this API could be used to modify document before rendering
// renderAsync = praseAsync + renderDocument// parse document and return internal document object
praseAsync(document: Blob | ArrayBuffer | Uint8Array,options: Options
): Promise<WordDocument>// render internal document object into specified container
renderDocument(wordDocument: WordDocument,bodyContainer: HTMLElement,styleContainer: HTMLElement,options: Options
): Promise<void>

3.2 如果没有使用若依框架,则

	axios({method: "get",responseType: "blob", // 因为是流文件,所以要指定blob类型url: "/exportWOrd", // word下载文件接口}).then(({ data }) => {console.log(data); // 后端返回的是流文件const blob = new Blob([data]); // 把得到的结果用流对象转一下var a = document.createElement("a"); //创建一个<a></a>标签a.href = URL.createObjectURL(blob); // 将流文件写入a标签的href属性值a.download = "出师表.docx"; //设置文件名a.style.display = "none"; // 障眼法藏起来a标签document.body.appendChild(a); // 将a标签追加到文档对象中a.click(); // 模拟点击了a标签,会触发a标签的href的读取,浏览器就会自动下载了a.remove(); // 一次性的,用完就删除a标签});

4.java后端代码(主要写Content-Type,只写部分代码)

使用XWPFTemplate写的Word文档

    // 下载方式OutputStream out = null; // 输出到客户端FileInputStream fns = null; // 读取临时文件ByteArrayOutputStream baos = null; // 读完后的数据放到这里面FileOutputStream fous = null; // 写到本地(创建新文件)try {// 先写本地fous = new FileOutputStream(outPath); // 创建新文件,此处outPath为输出到本地的文件路径template.write(fous); // 使用的XWPFTemplate来写的Word文档out = response.getOutputStream(); // 获取客户端输出流fns = new FileInputStream(outPath);// 读取已经生成的文件baos = new ByteArrayOutputStream(); // new一个字节数组输出流// 循环读取文件byte[] buffer = new byte[1024]; // 定义缓冲字节数组int len; // 读取长度while ((len = fns.read(buffer)) != -1){baos.write(buffer,0,len); // 读取buffer里面的数据,从0开始,写len个长度。}// 给文件起名字String exportName= "临时文件.docx";// 对中文进行编码String str = "attachment;filename="+ URLEncoder.encode(exportName,"UTF-8");response.setContentType("application/octet-stream");response.setHeader("Content-Disposition",str);// 导出out.write(baos.toByteArray());out.flush();} catch (IOException e) {e.printStackTrace();}finally {try {if (baos != null) {baos.close();}} catch (IOException e) {e.printStackTrace();}try {if (fns != null) {fns.close();}} catch (IOException e) {e.printStackTrace();}try {if (out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}try {if (fous != null) {fous.close();}}catch (IOException e){e.printStackTrace();}try {if (template != null) {template.close();}}catch (IOException e){e.printStackTrace();}}

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

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

相关文章

Springboot 使用hutool国密算法

添加依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.15</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcp…

C# AutoResetEvent

AutoResetEvent 是 C# 中的一个同步原语&#xff0c;用于在线程之间传递信号。当线程调用 AutoResetEvent 的 WaitOne 方法时&#xff0c;它会阻塞&#xff0c;直到另一个线程调用 Set 方法来释放它。一旦 WaitOne 方法返回&#xff0c;AutoResetEvent 将自动重置其状态&#x…

C语言—深度剖析函数指针,函数指针数组

我们先来看一段代码 #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; }输出的是两个地址&#xff0c;这两个地址是 test 函数的地址。 那我们的函数的地址…

java常用时间日期函数

日期格式化方式 SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf new SimpleDateFormat("YYYY-MM-dd HH:mm:ss"); //yyyy-MM-dd对于年份取值取得是当天所在的这个年份//YYYY-MM-dd它所取的年份是本周所在的这个…

Electron 30.0.0 发布,升级 Node 和 V8 引擎

近日&#xff0c;Electron 30.0.0 正式发布&#xff01;你可以通过 npm install electronlatest 进行安装&#xff0c;或者从 Electron 的发布网站下载&#xff0c;继续阅读了解此版本的详细信息。 &#x1f525; 主要更新 Windows 上支持 ASAR 完整性融合。如果未正确配置&am…

软件测试——Postman Script脚本功能

Postman作为软件测试里一款非常流行的调试工具&#xff0c;给我们提供了一个执行JavaScript脚本的环境&#xff0c;所以我们可以使用js语言编写脚本来解决一些接口自动化的问题&#xff0c;比如接口依赖、接口断言等等。Postman有Pre-RequestScript和Tests两个编写js脚本的模块…

[学习] linux命令大全

linux命令 前言1. 文件管理*mv* : 移动或改名文件*ls*: 显示目录中文件及其属性*cp*: 复制文件或目录*mkdir*: 创建目录文件*pwd*: 显示当前工作目录的路径*tar*: 压缩和解压缩文件*cd*: 切换目录*chmod*: 改变文件或目录权限 2&#xff1a;文档编辑*cat*: 在终端设备上显示文件…

Jenkins 哲学 - 插件初始化安装失败

到Jenkins官网查找最新的LST版本 最后的版本号一定要带&#xff0c;指定下载具体的版本号 docker pull jenkins/jenkins:2.426.1 自定义挂载目录&#xff0c;修改权限 mkdir /jenkins/jenkins_homechmod 777 /data/jenkins

Ansible安装基本原理及操作(初识)

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月23日15点18分 Ansible 是一款功能强大且易于使用的IT自动化工具&#xff0c;可用于配置管理、应用程序部署和云端管理。它使用无代理模式&#xff08;agentles…

谈谈mysql中的各个关键字

1.为什么学习mysql mysql是当今最主流且开放源码的关系型数据库&#xff0c;开发者为瑞典 MySQL AB 公司。目前 MySQL 被广泛地应用在 Internet 上的中小型网站中。由于其体积小、速度快、总体拥有成本低&#xff0c;尤其是开放源码这一特点&#xff0c;许多中小型网站为了降低…

GetManifestResourceStream用法

项目添加资源文件Resource1.resx “C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\ResGen.exe” Resource1.resx 从“Resource1.resx”读入 1 资源 正在写入资源文件… 完成。 排除资源文件Resource1.resx 添加文件Resource1.resources属性生成…

由于使用校园网,ubuntu虚拟机时而不能连接网络的解决方案

本来配置好了网络的虚拟机第二天又没网了,ping不通 在尝试过诸如下面的解决方案仍没有丝毫好转(这个时候意识到可能是用了校园网的缘故) VMWARE Ubuntu虚拟机和Windows10主机ping不通|Ubuntu断网、没有网络_vmware 桥接模式下 主机无法ping ubuntu虚拟机来自 192.168.110.95 的…

【C语言】每日一题,快速提升(10)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;圣诞树 输入&#xff1a; 1输出&#xff1a; * * * * * **说明&#xff1a; 输入&#xff1a; 2输出&#xff1a; * * * * * * * …

C++:基础语法

一、命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c; 以避免命名冲突或名字污染&#xff0c;n…

lacp的详解

LACP&#xff08;Link Aggregation Control Protocol&#xff09;是一种用于在网络中组合多个物理链路以增加带宽和冗余的协议。它是IEEE 802.3ad标准中定义的一种链路聚合技术。 LACP允许将多个物理链路绑定成一个逻辑链路&#xff0c;称为聚合链路或聚合组。这个聚合组可以提…

【C++】一篇文章带你深入了解list

目录 一、list的介绍二、 标准库中的list类2.1 list的常见接口说明2.1.1 list对象的常见构造2.1.1.1 [无参构造函数](https://legacy.cplusplus.com/reference/list/list/list/)2.1.1.2 [有参构造函数(构造并初始化n个val)](https://legacy.cplusplus.com/reference/list/list/…

上位机图像处理和嵌入式模块部署(树莓派4b开机启动脚本)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 编写好程序之后&#xff0c;一般要求程序开机启动后就可以运行。所以这个时候&#xff0c;我们一般就会把程序流程放在开发板的启动脚本当中。如果…

Android 8.1 删除Launcher桌面搜索框

Android 8.1 删除Launcher桌面搜索框 最近接到项目反馈&#xff0c;要求删除Launcher桌面的搜索框&#xff0c;具体修改参照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/config/BaseFlags.java public static final b…

开源大模型应该怎么选?

文章目录 前言为什么选择开源模型而不是商业模型?开源模型对比Llama 2Mixtral 8x7BZephyr 7BSOLAR 10.7BCode Llama 专用 Vs. 通用生产环境部署LLMs 的注意事项 前言 在过去的一年里&#xff0c;人工智能领域不断涌现出各种大语言模型(LLMs)&#xff0c;每个模型都在不断突破生…

代码随想录算法训练营day1 | 704. 二分查找、27. 移除元素

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添元素的时候&#xff0c;需要移动其他元素的地址。 那么二维数组在内存的空间地址是连续的么&#xff1f;不同编程语言的内存管理是不…