vue实现本地预览word(docx)、excel(xlsx)、pdf文件

news2025/7/8 2:17:38

vue实现本地预览word(docx)、excel(xlsx)、pdf文件

实现效果:

通过点击预览,浏览器打开新标签页展示文件内容
在这里插入图片描述
word效果:
在这里插入图片描述
pdf效果:
在这里插入图片描述
excel效果:
在这里插入图片描述

前期准备:

word插件:

npm install --save docx-preview

excel插件:

npm install --save @handsontable/vue
npm install --save handsontable
npm install --save handsontable/i18n
npm install --save exceljs
xlsx的部分参考的是竹业大佬的开源代码,表格样式需要引入代码中的xlsx文件中的所有内容,有兴趣的小伙伴可以源码内容
Demo地址[1]:https://zhuye1993.github.io/file-view/dist/index.html
github地址:https://github.com/zhuye1993/file-view/tree/master/src/vendors
在这里插入图片描述
本文使用的位置,以及引用方法
在这里插入图片描述

pdf插件:

pdf.js下载地址
http://mozilla.github.io/pdf.js/getting_started/#download
下载好的文件放如下位置即可
在这里插入图片描述

代码:

1.全局方法:officeView
// 文件预览
/*
*row: 包含fileUrl文件地址的对象
*that: vueRouter实例
 */
export const officeView = function(row, that) {
  // 获取文件类型
  const type = row.fileUrl.substring(row.fileUrl.lastIndexOf('.') + 1, row.fileUrl.length).toLowerCase()
  if (type.indexOf('pdf') !== -1) {
    // pdf预览
    const pdfSrc = 'pdf/web/viewer.html?file=' + encodeURIComponent(downloadUrl + row.fileUrl)
    // 打开新标签页
    window.open(pdfSrc, '_blank')
  } else if (type.indexOf('docx') !== -1) {
    // docx预览
    // 获取目标路由地址
    const routeUrl = that.resolve({
      name: 'OfficeView',
      query: {
        fileUrl: downloadUrl + row.fileUrl,
        fileType: 0
      }
    })
    // 打开新标签页
    window.open(routeUrl.href, '_blank')
  } else if (type.indexOf('xlsx') !== -1) {
    // xlsx预览
    // 获取目标路由地址
    const routeUrl = that.resolve({
      name: 'OfficeView',
      query: {
        fileUrl: downloadUrl + row.fileUrl,
        fileType: 1
      }
    })
    // 打开新标签页
    window.open(routeUrl.href, '_blank')
  } else {
    Message({
      type: 'error',
      message: '仅支持docx、pdf、xlsx文件预览,其它类型文件请下载查看'
    })
  }
}
2.路由跳转至OfficeView文件,此文件展示word,excel预览内容
<template>
  <div>
    <!-- excel文件内容位置 -->
    <div ref="output" />
    <!-- wor文件内容位置 -->
    <div v-if="fileType == 0" id="container" />
  </div>
</template>

<script>
import { renderAsync } from 'docx-preview'
import renderSheet from './xlsxView'
export default {
  data() {
    return {
      fileUrl: null,
      fileType: 0,
      tableData: null,
      last: null
    }
  },
  created() {
    // 从路由地址中获取fileUrl,fileType
    this.fileUrl = this.$route.query.fileUrl ? this.$route.query.fileUrl : null
    this.fileType = this.$route.query.fileType ? parseInt(this.$route.query.fileType) : 0
    if (this.fileUrl == null) {
      this.$message({
        type: 'error',
        message: '文件地址无效,请刷新后重试'
      })
    }
    // 加载文件内容
    this.uploading(this.fileUrl)
  },
  methods: {
    // 加载文件内容
    uploading(file) {
      // 获取文件流
      const xhr = new XMLHttpRequest()
      xhr.open('get', file, true)
      xhr.responseType = 'blob'
      xhr.onload = () => {
        if (xhr.status === 200) {
          if (this.fileType === 0) {
            // word预览
            renderAsync(
              xhr.response,
              document.getElementById('container'),
              null,
              {
                className: 'docx', // 默认和文档样式类的类名/前缀
                inWrapper: true, // 启用围绕文档内容渲染包装器
                ignoreWidth: false, // 禁止页面渲染宽度
                ignoreHeight: false, // 禁止页面渲染高度
                ignoreFonts: false, // 禁止字体渲染
                breakPages: true, // 在分页符上启用分页
                ignoreLastRenderedPageBreak: true, // 禁用lastRenderedPageBreak元素的分页
                experimental: false, // 启用实验性功能(制表符停止计算)
                trimXmlDeclaration: true, // 如果为真,xml声明将在解析之前从xml文档中删除
                debug: false // 启用额外的日志记录
              }
            )
          } else {
            // 嵌入式预览excel
            this.displayResult(xhr.response)
          }
        }
      }
      xhr.send()
    },
    // 嵌入式预览excel
    displayResult(buffer) {
      // 生成新的dom
      const node = document.createElement('div')
      // 添加孩子,防止vue实例替换dom元素
      if (this.last) {
        this.$refs.output.removeChild(this.last.$el)
        this.last.$destroy()
      }
      const child = this.$refs.output.appendChild(node)
      // 调用渲染方法进行渲染
      return new Promise((resolve, reject) =>
        renderSheet(buffer, child).then(resolve).catch(reject)
      )
    }
  }
}
</script>

<style lang='scss' scoped>
#table {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  color: #2c3e50;
  margin-top: 60px;
  border: 1px solid #ebebeb;
  padding: 20px;
  width: 80%;
  margin: 40px auto;
  background-color: #fff;
  box-shadow:
  1.5px 1.2px 1.2px rgba(0, 0, 0, 0.014),
  3.3px 2.5px 2.7px rgba(0, 0, 0, 0.021),
  5.5px 4.3px 4.6px rgba(0, 0, 0, 0.027),
  8.3px 6.4px 6.9px rgba(0, 0, 0, 0.031),
  12px 9.3px 10px rgba(0, 0, 0, 0.035),
  17px 13.1px 14.2px rgba(0, 0, 0, 0.039),
  24.1px 18.6px 20.1px rgba(0, 0, 0, 0.043),
  35px 27px 29.2px rgba(0, 0, 0, 0.048),
  54px 41.6px 45px rgba(0, 0, 0, 0.055),
  96px 74px 80px rgba(0, 0, 0, 0.07);

  border-radius: 10px;
  overflow: scroll;
  height: 100%;

  .tab {
    margin: 0 0 20px 0;
    display: flex;
    flex-direction: row
  }
}
</style>

<style>
html{
  background-color: #edf2f7;
}
</style>
调用方式:
<el-button size="mini" type="text" @click="$enum.pdfView(scope.row, $router)">预览</el-button>

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

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

相关文章

【TFS-CLUB社区 第5期赠书活动】〖Python OpenCV从入门到精通〗等你来拿,参与评论,即可有机获得

文章目录❤️‍&#x1f525; 赠书活动 - 《Python OpenCV从入门到精通》❤️‍&#x1f525; 编辑推荐❤️‍&#x1f525; 内容提要❤️‍&#x1f525; 赠书活动 → 获奖名单❤️‍&#x1f525; 赠书活动 - 《Python OpenCV从入门到精通》 内容简介&#xff1a; 《Python O…

【uniapp】页面下拉刷新

目录 一、全局 二、局部 1、一个页面一个下拉刷新 2、一个页面多个下拉刷新&#xff08;切换时滚动条回到顶部&#xff09; 3、一个页面多个下拉刷新&#xff08;切换时恢复滚动条位置&#xff09; 一、全局 修改pages.json的"enablePullDownRefresh": true, …

【Node.js实战】一文带你开发博客项目之登录(前置知识)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

微信小程序自定义组件(超详细)

&#x1f48c;写在开头&#xff1a; 哈喽呀&#xff0c;亲爱的宝子们。 今天要介绍的是关于小程序自定义组件的相关内容。 主要分以下几个部分&#xff1a;组件的创建&#xff0c;组件的结构&#xff0c;组件的引用&#xff0c;组件样式&#xff0c;组件的生命周期等。 文章目录…

【蓝桥杯真题】当蓝桥杯开设Web组之后,对几题能拿省一?

目录 &#x1f3c6;难度分析 &#x1f3c6;一、水果拼盘 &#x1f3c6;二、展开你的扇子 &#x1f3c6;三、和手机相处的时光 &#x1f3c6;四、灯的颜色变化 &#x1f3c6;五、冬奥大抽奖 &#x1f3c6;六、蓝桥知识网 &#x1f3c6;七、布局切换 &#x1f3c6;八、购…

vue3,使用watch监听props中的数据

情况一&#xff1a;监听 props 中基本数据类型 父组件中对传入数据的处理 const handleClick () > {testStr.value P }子组件中监听传入的数据 watch(() > props.testStr,(newVal, oldVal) > {console.log(监听基本类型数据testStr)console.log(new, newVal)cons…

Vue 和 React 有什么不同?

大家好&#xff0c;我是前端西瓜哥。今天的文章简单探讨一下 Vue 和 React 的不同。 本人 Vue2 和 React 都用过&#xff0c;但不熟悉 Vue3&#xff0c;没用它做过项目。 其实我对这两大框架也没有认真钻研过它们的细节&#xff0c;也就是工作上用它们写一些简单业务&#xf…

解决npm ERR! Cannot read properties of null (reading ‘pickAlgorithm‘)报错问题

在vue项目中&#xff0c;使用npm i 命令安装node modules时&#xff0c;出现报错。 第一句&#xff1a; npm ERR! Cannot read properties of null (reading pickAlgorithm) 搜索的话也是有很多答案的&#xff0c;比如&#xff1a; 在终端中运行命令&#xff1a;npm cache cle…

Vue使用axios进行get请求拼接参数的几种方式

前言 本文主要介绍如何在Vue使用axios进行get请求拼接参数的两种方式 我们就以github上的一个开源接口举例&#xff1a; https://api.github.com/search/users?qxxx 这是github给开发人员提供的一个接口&#xff0c;是get请求。我们可以直接通过浏览器访问 很明显&#xff0…

ECharts 饼图颜色设置教程 - 4 种方式设置饼图颜色

本文首发&#xff1a;《ECharts 饼状图颜色设置教程 - 4 种方式设置饼图颜色》 ECharts 饼状图颜色设置教程 方法一&#xff1a;在 series 内配置饼状图颜色方法二&#xff1a;在 option 内配置饼状图颜色方法三&#xff1a;在 data 内配置饼状图颜色方法四&#xff1a;配置 E…

UE4 利用WEBUI插件完成UE与JS的交互 (UE4嵌入WEB)

目录 一、UE4显示Echart图表 二、UE调用JS&#xff08;修改Echart图表数据&#xff09; 三、JS调用UE&#xff08;UE4中打印js传递过来的数据&#xff09; 一、UE4显示Echart图表 步骤&#xff1a; 1.下载WEBUI插件 我的UE编辑器版本是4.24.3对应版本的插件下载地址是 链…

全站最简单 “数据滚动可视化大屏” 【JS基础拿来即用】

源码获取方式&#xff1a; 数据滚动大屏源码&#xff0c;原生js实现超级简单-Javascript文档类资源-CSDN下载原生js实现的数据滚动大屏案例&#xff0c;实现应该是全网最简单的&#xff0c;拿来直接使用即可&#xff0c;没有会员的小伙伴去我文章主更多下载资源、学习资料请访问…

聊一聊浏览器打印 - window.print

前言 一般信息填写类的需求页面&#xff0c;都会增设「预览」和「打印」功能。我们会通过编写 DOM 及样式来绘制出预览视图&#xff0c;而打印则是基于预览来生成 PDF 文件。 浏览器原生 API window.print() 可以用于打印当前窗口&#xff08;window.document&#xff09;视图…

CSS中animation动画-详解

1、animation有什么组成&#xff1f; Animations由两部分组成&#xff1a;css动画的配置&#xff0c;以及一系列的keyframes&#xff08;用来描述动画的开始、过程、结束状态&#xff09;。不需要了解任何Js技术即可完成动画的制作 2、关键帧应该怎么表示&#xff1f; 0%表示…

CSS的hover属性

1.hover的定义 :hover在鼠标移到链接上时添加的特殊样式 :hover适用于任何元素 2.hover的使用方法 用法1:控制自身的样式 鼠标悬浮在元素上改变元素样式,改变本身的背景颜色,例如: 用法2&#xff1a;通过hover控制其他块的样式 &#xff08;1&#xff09;控制子元素的样式…

【React Router 6 快速上手二】useParams / useSearchParams / useLocation / 编程式路由导航useNavigate等API

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;React专栏 之前学习了react-router-dom5版本的相关内容 参考文章&#x1f449;&#x1f3fb;React路由组件传参的三种方式和 【React路由】编程式路由导航 回顾上篇文章&#x1f449…

nvm管理node版本

nvm 使用 1. nvm介绍 nvm 全英文也叫 node.js version management&#xff0c;是一个 nodejs 的版本管理工具 nvm 和 npm 都是 node.js 版本管理工具&#xff0c;为了解决 node.js 各种版本存在不兼容现象可以通过它可以安装和切换不同版本的 node.js 2. 安装与配置 2-1 nv…

CSS绝对定位(absolute)、相对定位(relative)方法(详解)

CSS中几种常用的定位方法&#xff0c;直接上干货&#xff01; 什么是定位&#xff1f; 元素可以使用的顶部&#xff0c;底部&#xff0c;左侧和右侧属性定位。然而&#xff0c;这些属性无法工作&#xff0c;除非是先设定 position属性。他们也有不同的工作方式&#xff0c;这…

Echarts直角坐标系x轴y轴属性设置大全

1、Echarts版本 "echarts": "^5.3.3", 2、最简单的直角坐标系&#xff0c;以柱状图为例。 常见的直角坐标系&#xff0c;x轴设置type: category&#xff0c;为类目轴&#xff0c;适用于离散的类目数据&#xff1b;y轴设置type: value&#xff0c;为数值轴…

前端编程中你是如何进行调试代码的?这篇文章让你学会更多调试方法——前端新手进阶

要我讲就是&#xff1a;对自己代码自信的人&#xff0c;从来不需要调试&#xff0c;只是log一下值是否符合预期(doge)。 哈哈&#xff0c;这当然是一句玩笑话&#xff0c;不管你是刚刚起步的新手&#xff0c;还是从业多年的老手&#xff0c;编程中或多或少都会遇到一些瓶颈&…