关于使用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对象

  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.loadAsync
    bodyContainer: 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 classes
        inWrapper: boolean = true, //enables rendering of wrapper around document content
        ignoreWidth: boolean = false, //disables rendering width of page
        ignoreHeight: boolean = false, //disables rendering height of page
        ignoreFonts: boolean = false, //disables fonts rendering
        breakPages: boolean = true, //enables page breaking on page breaks
        ignoreLastRenderedPageBreak: boolean = true, //disables page breaking on lastRenderedPageBreak elements
        experimental: boolean = false, //enables experimental features (tab stops calculation)
        trimXmlDeclaration: boolean = true, //if true, xml declaration will be removed from xml documents before parsing
        useBase64URL: boolean = false, //if true, images, fonts, etc. will be converted to base 64 URL, otherwise URL.createObjectURL is used
        renderChanges: false, //enables experimental rendering of document changes (inserions/deletions)
        renderHeaders: true, //enables headers rendering
        renderFooters: true, //enables footers rendering
        renderFootnotes: true, //enables footnotes rendering
        renderEndnotes: true, //enables endnotes rendering
        debug: 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.mfbz.cn/a/552973.html

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

相关文章

CSS3 max/min-content及fit-content、fill-available值的详解

c3中对width的值多了几个值&#xff1a;fill-available, max-content, min-content, 以及fit-content。 1.width:fill-available 我们在页面中扔一个没有其他样式的<div>元素&#xff0c;则&#xff0c;此时&#xff0c;该<div>元素的width表现就是fill-availabl…

SAP打印输出设置

SAP打印输入有很多方式&#xff0c;适合不同的应用场景。 一.打印输出总体概览图 二.前台打印 这个是比较常见的&#xff0c;前端打印的出现减轻了管理员的工作量&#xff0c;用户可以选择自己电脑上的打印机输出&#xff0c;不需要所有打印机都在SAP平台中进行配置&#xff0…

web 学习第六次课程

文章目录 定位 定位 <body><div style"height:100px;width:100px;border:#F00 1px solid;"></div><div style"height:100px;width:100px;border: #00F 1px solid;"></div> </body><body><div style"pos…

Go 语言中的 GIF 图像处理完全指南:`image/gif`的技术与实践

Go 语言中的 GIF 图像处理完全指南&#xff1a;image/gif的技术与实践 概述安装与基础设置导入 image/gif 包初步配置示例&#xff1a;设置一个简单的 GIF 编码环境 读取与解码 GIF 图像读取 GIF 文件解析 GIF 数据 创建与编码 GIF 图像创建 GIF 图像编码 GIF 图像 处理 GIF 动…

【深度学习】wandb模型训练可视化工具使用方法

【深度学习】wandb模型训练可视化工具使用方法 wandb简介功能介绍登陆注册以及API keysproject和runsproject和runs的关系 wandb的配置实验跟踪版本管理Case可视化分析可视化自动调参&#xff08;wandb.sweep&#xff09;配置wandb.sweep1.配置 sweep_config2.初始化 sweep con…

学习STM32第十五天

SPI外设 一、简介 STM32F4XX内部集成硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU负担&#xff0c;可配置8位/16位数据帧&#xff0c;高位&#xff08;最常用&#xff09;/低位先行&#xff0c;三组SPI接口&#xff0c;支持DMA…

网站怎么实现HTTPS访问?

网站实现HTTPS的过程主要分为以下几个步骤&#xff1a; 1. 申请SSL证书&#xff1a; - 根据网站需求选择合适的SSL证书类型&#xff0c;DV证书只需验证域名所有权&#xff0c;适用于个人网站或小型项目&#xff1b;OV和EV证书需验证企业身份信息&#xff0c;适用于对信任度要求…

使用GAN做图像超分——SRGAN,ESRGAN

在GAN出现之前&#xff0c;使用的更多是MSE&#xff0c;PSNR,SSIM来衡量图像相似度&#xff0c;同时也使用他们作为损失函数。 但是这些引以为傲的指标&#xff0c;有时候也不是那么靠谱&#xff1a; MSE对于大的误差更敏感&#xff0c;所以结果就是会倾向于收敛到期望附近&am…

spring05:代理模式 和 AOP

spring05&#xff1a;代理模式 和 AOP 文章目录 spring05&#xff1a;代理模式 和 AOP前言一、静态代理模式&#xff08;代理类直接写好&#xff09;1. &#xff08;房东租房子 的案例&#xff09; 二、动态代理模式&#xff08;代理类是动态生成的&#xff09;1. &#xff08;…

动态代理,XML,Dom4j

文章目录 动态代理概述特点代码实现实现的关键步骤优点 XML概述作用编写第一个XML文件组成声明元素(标签、标记)属性注释转义字符[实体字符字符区(了解) 约束DTD约束Schema约束名称空间 Dom4jXML解析解析方式和解析器解析方式解析器Snipaste_2024-04-17_21-22-44.png<br /&g…

竞赛 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/po…

【机器学习300问】74、如何理解深度学习中L2正则化技术?

深度学习过程中&#xff0c;若模型出现了过拟合问题体现为高方差。有两种解决方法&#xff1a; 增加训练样本的数量采用正则化技术 增加训练样本的数量是一种非常可靠的方法&#xff0c;但有时候你没办法获得足够多的训练数据或者获取数据的成本很高&#xff0c;这时候正则化技…

pajamas 1 daydream.sequence-template

0. 老实交代&#xff0c;最近对于python&#xff0c;非常之感冒 热天气常驻之后&#xff0c;各种毛病就来了&#xff1a;蚊子很彪悍&#xff0c;牙齿不舒服&#xff0c;肠胃那更是一坨 … 虽然不久前&#xff0c;荷包大残&#xff0c;但是关注到 mac mini 之后&#xff0c;就…

项目7-音乐播放器5+注册账号

1.前端代码 MAPPER Insert("insert into user(username,password) values (#{username},#{password}) ")Integer insertUserInfo(String username,String password); Service public Result insertUserInfo(String username, String oldpassword,String newpasswo…

MAC电脑M1安装OpenCV

最近在学习研究OpenCV&#xff0c;奈何只有mac电脑。安装OpenCV感觉还是挺麻烦的&#xff0c;所以记录一下&#xff0c;难免以后会忘记。 安装OpenCV我参考的帖子 https://www.bilibili.com/read/cv23613225/ 一、首先安装Anaconda 目前已安装不做赘述 二、启动命令窗口 方…

SpringBoot搭建环境

创建项目向导 用idea向导建SpringBoot项目&#xff1a;菜单 > File > New > Project… 选择向导&#xff1a; 默认向导 https://start.spring.io 建议用 https://start.aliyun.com 配置项目信息 Group : 组织名 Artifact : 项目名 Version : 版本号 name : 与Artifa…

【在线OJ系统】自定义注解实现分布式ID无感自增

实现思路 首先自定义参数注解&#xff0c;然后根据AOP思想&#xff0c;找到该注解作用的切点&#xff0c;也就是mapper层对于mapper层的接口在执行前都会执行该aop操作&#xff1a;获取到对于的方法对象&#xff0c;根据方法对象获取参数列表&#xff0c;根据参数列表判断某个…

Hbase的简单学习一

一 Hbase的搭建与安装 1.1 安装 1.准备好文件&#xff0c;上传到Linux上 2.解压文件 tar zxvf hbase-2.2.7-bin.tar.gz -C ../ ../是解压到的路径 1.2 配置文件 1.配置环境变量 去etc/profile目录下 export HBASE_HOME/usr/local/soft/hbase-2.2.7 export PATH$PATH:$H…

Midjourney 实现角色一致性的新方法

AI 绘画的奇妙之处&#xff0c;实乃令人叹为观止&#xff01;就像大千世界中&#xff0c;寻不见两片完全相同的树叶一般&#xff0c;AI 绘画亦复如是。同一提示之词&#xff0c;竟能催生出千变万化的图像&#xff0c;使得AI所绘之作&#xff0c;宛如自然之物般独特&#xff0c;…

在报表控件 FastReport .NET 中使用 PageCreate 事件

FastReport Business Graphics .NET&#xff0c;是一款基于fastreport报表开发控件的商业图形库&#xff0c;借助 FastReport 商业图形库&#xff0c;您可以可视化不同的分层数据&#xff0c;构建业务图表以进行进一步分析和决策。利用数据呈现领域专家针对 .NET 7、.NET Core、…
最新文章