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

Vue3 实现文件预览 Word Excel pdf 图片 视频等格式 大全!!!!

先上效果图

 

 插件安装

先说 word 文件是docx-preview插件

          excel文件是用 xlsx 插件    

介绍后端返回的数据

因为在拦截器处 做了对数据的处理 最后你调接口拿到的数据是 一个对象 里面包含:

url : blob对象转换的用于访问Blob数据的临时链接。这个链接可以被用于在网页中展示二进制数据,比如显示图像或者播放音视频文件

blobs:  返回的Blob对象,代表了从网络请求中获取到的二进制数据

这上下俩部分很重要!!!!!!!!

如果返回的普通格式的话就大家直接转化

  1. const blob = new Blob([res], { type: 'application/pdf' })  //你需要的类型 转化为blob对象

  2. const url = window.URL.createObjectURL(blob)         //将对象转化为链接


也就是你后面掉接口返回的数据  

给大家打印一下 我当时在网上搜索这类资料的时候 就是在这一部分弄糊涂了 对数据格式不了解

 

 然后就到正式书写了

下载引入插件 (我这是v3 引入 vue2版本 csdn官网上搜vue预览文件 一大堆 大家自己搜一下)

//word文档注释
import { renderAsync } from 'docx-preview';
//excel注释
import * as XLSX from "xlsx";

Word预览   

不清楚result 返回内容的往上滑 这里传递的是blob对象!!

 <!-- 若是word文档格式数据号展示  我这里是加自己定义的类型判断了 fileType  大家可删除掉  --><div ref="refWord" id="fileShow" v-else-if="fileType == 'docx'" style="width: 100%;height: 100%;"></div>//js代码处const previewContainer = document.getElementById('fileShow');renderAsync(result.blob, previewContainer) //渲染

Excel预览

不清楚result 返回内容的往上滑 这里传递的是blob对象!!    中间内容是在拿到数据渲染的时候插件数据处理 最后将处理的数据当参数传递到处理样式的方法中

<!-- 若是excel格式数据展示 -->
<div  id="fileShowTwo" style="width: 100%;height: 100%;" v-else-if="fileType == 'xlsx'"><div class="tab"><el-radio-group size="small" v-model="excel.sheetNameActive" @change="getSheetNameTable"><el-radio-button v-for="(item, index) in excel.sheetNames" :key="index" :label="item"></el-radio-button></el-radio-group></div><divstyle="margin-top: 5px;border: 1px solid #a0a0a0;overflow:auto;"><div v-html="excel.SheetActiveTable" style="padding: 10px 15px"></div></div>
</div>
<div v-else-if="fileType == 'mp4'" style="width: 100%;height: 100%;"><video :src="fileAddress" controls  style="width: 100%;height: 100%;"></video>
</div>//js代码处//表格预览所需数据 定义
const data = reactive({excel: {// 数据workbook: {},// 表名称集合sheetNames: [],// 激活项sheetNameActive: "",// 当前激活表格SheetActiveTable: ""}
})
const { excel } = toRefs(data);
// 视频预览所需数据
const emptyTips = ref('暂无内容');//格式为excel时 方法中书写的内容 const reader = new FileReader(); //创建了一个FileReader对象,这个对象用于异步读取文件内容//通过readAsArrayBuffer将blob转换为ArrayBuffer对象reader.readAsArrayBuffer(result.blob) // 这里的res.data是blob文件流reader.onload = (event) => {// 读取ArrayBuffer数据变成Uint8Arrayvar data = new Uint8Array(event.target.result);// 这里的data里面的类型和后面的type类型要对应var workbook = XLSX.read(data, { type: "array" });const sheetNames = workbook.SheetNames // 工作表名称集合excel.value.workbook = workbookexcel.value.sheetNames = sheetNamesexcel.value.sheetNameActive = sheetNames[0]//方法getSheetNameTable(sheetNames[0])};//定义的方法
const getSheetNameTable = (sheetName) => { try {// 获取当前工作表的数据const worksheet = excel.value.workbook.Sheets[sheetName]// 转换为数据  1.json数据有些问题,2.如果是html那么样式需修改let htmlData = XLSX.utils.sheet_to_html(worksheet, { header: '', footer: '' })htmlData = htmlData === '' ? htmlData : htmlData.replace(/<table/, '<table class="default-table" border="1px solid #ccc" cellpadding="0" cellspacing="0"')// 第一行进行改颜色htmlData = htmlData === '' ? htmlData : htmlData.replace(/<tr/, '<tr style="background:#b4c9e8"')excel.value.SheetActiveTable = htmlData} catch (e) {// 如果工作表没有数据则到这里来处理excel.value.SheetActiveTable = '<h4 style="text-align: center">' + emptyTips.value + '</h4>'}
}

pdf 预览  

这个需要用到iframe标签  他的blob对象的type需要是"type": "application/pdf"  大家可以看一下自己的blob对象 如果是后端返回的直接是blob格式 但是type不对 那等下我下面代码有转化  如果返回的普通数据 大家自己根据上面的格式自己转化blob对象的时候自己设置一下type 

 <!-- 若是pdf数据展示 --><iframe :src="fileAddress"   type="application/pdf"  v-else-if="fileType == 'pdf'" id="pdfShow" width="100%" height="100%"></iframe>//js代码处//格式为pdf时const reader = new FileReader();reader.readAsArrayBuffer(result.blob);reader.onload = function () {fileAddress.value = URL.createObjectURL(new Blob([reader.result], { "type": "application/pdf" }))}

最后是jpg png ,mp4格式预览

  //这里就用到blob对象转化的链接了 注意区分!!
if (type == 'jpg' || type == 'png' || type == 'mp4') {fileAddress.value = result.url
}//图片类型展示<img style="width: 150px;height: 150px;" :src="fileAddress" alt="" v-if="fileType == 'jpg' || fileType == 'png'">//视频类型展示<div v-else-if="fileType == 'mp4'" style="width: 100%;height: 100%;"><video :src="fileAddress" controls  style="width: 100%;height: 100%;"></video></div>

下载文件 !!

<el-button @click="DownloadFn()"> 下载</el-button>// 文件下载
const DownloadFn = () => { let a = document.createElement('a')// 下载链接a.href = blobUploadValue.value  //这个就是那个blob链接!!// 下载文件名,如果后端没有返回,可以自己写a.download = '文件.pdf'//这里是你上传的文件名 加上他的类型 jpg,png,docx.....a.download = fileNameValue.value + '.' + fileType.valuedocument.body.appendChild(a)// 点击a标签,进行下载 a.click()// 移除元素document.body.removeChild(a)
}

最后是完整代码 

<el-dialog v-model="dialogTabsVisible" title="附件展示" class="file-show-box" @close="closeDialog()"><div class="file-body"><!-- 左侧附件列表 --><div class="file-left" ><div class="list" :class="{'list-active' : listAct == index}" v-for="(item, index) in fileList" :key="index" @click="handleClick(item,index)">{{ item.name }}</div></div><div class="file-right"><div class="downFile" v-if="fileType != 'pdf'"><el-button @click="DownloadFn()"> 下载</el-button></div><!-- 若是图片数据展示 --><img style="width: 150px;height: 150px;" :src="fileAddress" alt="" v-if="fileType == 'jpg' || fileType == 'png'"><!-- 若是txt格式数据展示 --><iframe :src="fileAddress" frameborder="0" v-else-if="fileType == 'txt'" style="width: 90%; height: 100%;"></iframe><!-- 若是pdf数据展示 --><iframe :src="fileAddress"   type="application/pdf"  v-else-if="fileType == 'pdf'" id="pdfShow" width="100%" height="100%"></iframe><!-- 若是word文档格式数据号展示 --><div ref="refWord" id="fileShow" v-else-if="fileType == 'docx'" style="width: 100%;height: 100%;"></div><!-- 若是excel格式数据展示 --><div  id="fileShowTwo" style="width: 100%;height: 100%;" v-else-if="fileType == 'xlsx'"><div class="tab"><el-radio-group size="small" v-model="excel.sheetNameActive" @change="getSheetNameTable"><el-radio-button v-for="(item, index) in excel.sheetNames" :key="index" :label="item"></el-radio-button></el-radio-group></div><divstyle="margin-top: 5px;border: 1px solid #a0a0a0;overflow:auto;"><div v-html="excel.SheetActiveTable" style="padding: 10px 15px"></div></div></div><div v-else-if="fileType == 'mp4'" style="width: 100%;height: 100%;"><video :src="fileAddress" controls  style="width: 100%;height: 100%;"></video></div><div v-else>该文件暂不支持预览,请下载查看</div></div></div></el-dialog>//js部分//表格预览所需数据
const data = reactive({excel: {// 数据workbook: {},// 表名称集合sheetNames: [],// 激活项sheetNameActive: "",// 当前激活表格SheetActiveTable: ""}
})
const { excel } = toRefs(data);
// 视频预览所需数据
const emptyTips = ref('暂无内容');
// 下载文件
// 文件地址
const fileAddress = ref('')
// 下载流数据
const blobUploadValue = ref('')//我这里的参数type是其他地方传递过来的 注意甄别
const downloadFn = (id, type) => {let params = { fileId: id }download(params).then(result => {console.log(result.url, 'resolve');console.log(result.blob, 'blob');blobUploadValue.value = result.urlif (type == 'jpg' || type == 'png' || type == 'mp4') {//格式为图片 视频时fileAddress.value = result.url} else if (type == 'docx') {//格式为word时const previewContainer = document.getElementById('fileShow');renderAsync(result.blob, previewContainer) //渲染} else if (type == 'xlsx') {//格式为excel时const reader = new FileReader();//通过readAsArrayBuffer将blob转换为ArrayBuffer对象reader.readAsArrayBuffer(result.blob) // 这里的res.data是blob文件流reader.onload = (event) => {// 读取ArrayBuffer数据变成Uint8Arrayvar data = new Uint8Array(event.target.result);// 这里的data里面的类型和后面的type类型要对应var workbook = XLSX.read(data, { type: "array" });const sheetNames = workbook.SheetNames // 工作表名称集合excel.value.workbook = workbookexcel.value.sheetNames = sheetNamesexcel.value.sheetNameActive = sheetNames[0]getSheetNameTable(sheetNames[0])};} else if (type == 'pdf') {//格式为pdf时const reader = new FileReader();reader.readAsArrayBuffer(result.blob);reader.onload = function () {fileAddress.value = URL.createObjectURL(new Blob([reader.result], { "type": "application/pdf" }))}}})
}// 文件下载
const DownloadFn = () => { let a = document.createElement('a')// 下载链接a.href = blobUploadValue.value// 下载文件名,如果后端没有返回,可以自己写a.download = '文件.pdf'a.download = fileNameValue.value + '.' + fileType.valuedocument.body.appendChild(a)// 点击a标签,进行下载 a.click()// 移除元素document.body.removeChild(a)
}const getSheetNameTable = (sheetName) => { try {// 获取当前工作表的数据const worksheet = excel.value.workbook.Sheets[sheetName]// 转换为数据  1.json数据有些问题,2.如果是html那么样式需修改let htmlData = XLSX.utils.sheet_to_html(worksheet, { header: '', footer: '' })htmlData = htmlData === '' ? htmlData : htmlData.replace(/<table/, '<table class="default-table" border="1px solid #ccc" cellpadding="0" cellspacing="0"')// 第一行进行改颜色htmlData = htmlData === '' ? htmlData : htmlData.replace(/<tr/, '<tr style="background:#b4c9e8"')excel.value.SheetActiveTable = htmlData} catch (e) {// 如果工作表没有数据则到这里来处理excel.value.SheetActiveTable = '<h4 style="text-align: center">' + emptyTips.value + '</h4>'}
}

 这里是后端返回回来一个附件名称列表 我渲染到左侧的附件列表中 然后通过选中不同的附件 右侧展示不同的文件预览 他的文件类型我也是从这里得到的 然后我通过点击不同的附件列表 执行上面的预览方法 获取到不同的blob数据 然后进行展示 

我只能给大家说一下我的逻辑 毕竟每个人代码不一样 不一定能直接复制  还是希望能帮到大家

最后贴上效果图

 

相关文章:

Vue3 实现文件预览 Word Excel pdf 图片 视频等格式 大全!!!!

先上效果图 插件安装 先说 word 文件是docx-preview插件 excel文件是用 xlsx 插件 介绍后端返回的数据 因为在拦截器处 做了对数据的处理 最后你调接口拿到的数据是 一个对象 里面包含: url : blob对象转换的用于访问Blob数据的临时链接。这个链接可以被用于在网页中展示…...

GaussDB for openGauss部署形态

前言 华为云数据库GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;具有高性能、高可用、高安全、低成本的特点&#xff0c;本文带你详细了解GaussDB数据库的部署形态。 1、GaussDB部署形态三种类型 GaussDB部署形态&#xff1a;单机 独立部署是将数据库组件部署…...

6.MidBook项目经验之前端nuxt优化SEO和手机登录,微信登录

1.nuxt服务端渲染技术SSR Server Side Render(ajax异步请求,SEO是靠爬虫抓取数据的,没有抓到数据排名靠后) 1.在用户端搭建(利于SEO) 1.解压后 npm install npm run dev 2.default.vue有 头内容和尾,创建头尾文件,然后加入到组件 3.每个前端系统对应一个单独的后台接口(太方便了…...

NR SRS power control

这篇看下NR SRS power control的相关内容&#xff0c;主要内容集中在38.213 7.3章节&#xff0c;SRS power control与PUSCH很类似&#xff0c;当然细节上也有所不同&#xff0c;这里简单看下。 UL功率控制,主要是PUSCH/PUCCH/SRS/PRACH的传输功率。 对于所有PUSCH/PUCCH/SRS传输…...

C++(boost):通过boost::process::child同步调用其他程序

boost提供了boost::process::child,可以通过其调用其他程序,并获得输出: #include <boost/process/child.hpp> #include <boost/process/io.hpp> #include <vector> #include <iostream> #include <string> #include <tuple>using nam…...

【经验分享】解决vscode编码问题

目录 先看一下我遇到的问题和你们的一不一样 下面是我查到的解决办法&#xff1a; 简单点说就是 我们看看解决后的效果 先看一下我遇到的问题和你们的一不一样 我一开始以为就是编码问题。 下面是我查到的解决办法&#xff1a; 这个错误提示看起来仍然是中文乱码。可能是由于…...

核酸管外观缺陷检测(一)

1.1 应用示例思路 (1) 对核酸管图像进行灰度化、阈值分割和连通域分析&#xff1b; (2) 筛选出待检测的区域&#xff0c;并对该区域进行变换校正&#xff1b; (3) 进一步获取待检测的ROI区域&#xff0c;并根据几何特征和阈值条件&#xff0c;来对核酸管外观进行检测&#x…...

NodeJS @kubernetes/client-node连接到kubernetes集群的方法

1. 首先&#xff0c;你需要在你的项目中安装kubernetes/client-node。你可以使用npm&#xff08;Node Package Manager&#xff09;来进行安装。在你的终端中输入以下命令&#xff1a; npm install kubernetes/client-node 2. 安装完毕后&#xff0c;你可以在你的代码中引入这…...

【基于Kmeans、Kmeans++和二分K均值算法的图像分割】数据挖掘实验三

文章目录 Ⅰ、项目任务要求II、原理描述KMeansKMeans二分K均值评价指标-轮廓系数 III、数据集描述IV、具体实现过程V、结果分析VI、完整代码VII、深度学习与图片分割&#xff08;补充&#xff09;CNN1. 卷积层&#xff08;Convolutional Layer&#xff09;&#xff1a;2. 激活函…...

深入理解Java CompletableFuture并发编程模型

摘要&#xff1a;本文将介绍Java中的CompletableFuture类&#xff0c;探讨其在并发编程中的应用。我们将详细讨论CompletableFuture的特性、常见用法和最佳实践&#xff0c;帮助开发人员更好地利用这个强大的工具进行异步编程。 1. 什么是CompletableFuture&#xff1f; Compl…...

TensorFlow手动加载数据集(以mnist为例)

在进行Mnist手写识别的项目中&#xff0c;出现了Mnist数据集下载出错的问题&#xff0c;报出以下错误&#xff1a; Exception: URL fetch failure on https://s3.amazonaws.com/img-datasets/mnist.npz: None – [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主…...

C++项目实战——基于多设计模式下的同步异步日志系统(总集篇)

文章目录 专栏导读项目介绍开发环境核心技术环境搭建日志系统介绍1.为什么需要日志系统2.日志系统技术实现2.1同步写日志2.2异步写日志 前置知识补充不定参函数C风格不定参函数不定参宏函数设计模式六大原则单例模式饿汉模式懒汉模式 工厂模式简单工厂模式工厂方法模式抽象工厂…...

杨辉三角按列求和

假设求杨辉三角这一列 我们考虑这个格子&#xff1a; 然后对其不断展开 综上&#xff1a; ∑ i 0 n ( i k ) ( n 1 k 1 ) \sum_{i0}^n\binom i k\binom {n1}{k1} i0∑n​(ki​)(k1n1​) ∑ i l r ( i k ) ( r 1 k 1 ) − ( l k 1 ) \sum_{il}^r\binom i k\binom{r1}{k…...

C复习-语句

参考&#xff1a; 里科《C和指针》 语句 C没有bool&#xff0c;是用整型代替的。因此if(expression)中&#xff0c;expression只要是可以产生整型结果即可&#xff0c;且0表示假&#xff0c;非0表示真。 如果有只靠缩进没有{}的else语句&#xff0c;会自动匹配离它最近的、不…...

[Python进阶] 操纵键盘:PyAutoGUI

6.5 操纵键盘&#xff1a;PyAutoGUI 6.5.1 keyDown、keyUp 按下或弹起某个按键。在按下时不会释放。 参数: key(str): 要按下的键。有效的名称列在KEYBOARD_KEYS。 logScreenshot&#xff1a;是否要截图并保存在当前文件夹下。 import pyautoguipyautogui.keyDown(f) # 模拟…...

jdbc快速开始

文章目录 快速开始参考文献 jdbc 就是使用java语言操作关系型数据库的一套api jdbc本质&#xff1a; 官方(sun公司)定义的一套操作所有关系型数据库的规则&#xff0c;就是接口各个数据库厂商去实现这套接口&#xff0c;提供数据库驱动jar包我们可以使用这套接口编程&#xff…...

C语言中static关键字用法

C语言中static关键字用法 2021年7月28日席锦 static关键字在c语言中比较常用&#xff0c;使用恰当能够大大提高程序的模块化特性&#xff0c;有利于扩展和维护。但是对于c语言初学者&#xff0c;static由于使用灵活&#xff0c;并不容易掌握。 变量 1.局部变量 普通局部变量是再…...

STM32-LCD液晶显示

LCD液晶显示 针对野火指南者配套资料&#xff1a;3.2寸 LCD电阻屏&#xff0c;屏幕里自带ILI9341液晶控制器芯片&#xff0c;该控制器芯片中存在GRAM&#xff08;即显存&#xff09;。该液晶控制器使用8080接口与单片机通讯&#xff0c;液晶面板引出来的FPC信号线为8080接口&am…...

GraphQL 查询:一个全面指南

GraphQL GraphQL 是一种 API 查询语言和运行时&#xff0c;用于使用现有数据完成这些查询。它为您的 API 中的数据提供了完整且易于理解的描述&#xff0c;让客户能够准确地询问他们需要什么&#xff0c;更容易随着时间的推移发展 API&#xff0c;并启用强大的开发人员工具。 …...

快速自动化处理JavaScript渲染页面的方法

目录 一、使用无头浏览器 二、使用JavaScript渲染引擎 三、使用前端框架工具 随着互联网技术的不断发展&#xff0c;JavaScript已经成为Web开发中不可或缺的一部分。然而&#xff0c;在自动化处理JavaScript渲染页面方面&#xff0c;却常常让开发者感到头疼。本文将介绍一些快…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...

基于 HTTP 的单向流式通信协议SSE详解

SSE&#xff08;Server-Sent Events&#xff09;详解 &#x1f9e0; 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09; 是 HTML5 标准中定义的一种通信机制&#xff0c;它允许服务器主动将事件推送给客户端&#xff08;浏览器&#xff09;。与传统的 H…...

C#中用于控制自定义特性(Attribute)

我们来详细解释一下 [AttributeUsage(AttributeTargets.Class, AllowMultiple false, Inherited false)] 这个 C# 属性。 在 C# 中&#xff0c;Attribute&#xff08;特性&#xff09;是一种用于向程序元素&#xff08;如类、方法、属性等&#xff09;添加元数据的机制。Attr…...