vue 实现 word/excel/ppt/pdf 等文件格式预览操作

效果图:

**问题描述:**一般情况下使用iframe标签就可以实现文件预览,但是这个标签只针对于ppt和pdf是有效的。对于doc文件就需要借助第三方插件(@vue-office/docx)来实现预览了。下面介绍使用方法。

**安装插件:**npm install --save @vue-office/docx @vue-office/excel @vue-office/pdf vue-demi

我只需要vue-office/docx这个 所以只安装了这个 其他的大家根据自己的需要对安装命令进行删减即可。

我是封装起了一个预览文件的组件(fileView.vue),因为项目上需要调用预览的地方比较多。

fileView.vue代码

html 复制代码
<template>
  <el-dialog
    class="global-window"
    top="0"
    title="预览"
    status-icon
    :visible="visible"
    width="80%"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    @close="close"
  >
    <div class="body">
      <iframe v-show="showType === 'iframe'" src="" frameborder="0" id='iframe'></iframe>
      <vue-office-docx
        v-show="showType === 'doc'"
        :src="docUrl"
        style="height: 100vh;"
      />
    </div>
  </el-dialog>
</template>
<script>
//引入VueOfficeDocx组件
import VueOfficeDocx from '@vue-office/docx'
//引入相关样式
import '@vue-office/docx/lib/index.css'
export default {
  components:{
    VueOfficeDocx
  },
  data () {
    return {
      showType: '',
      docUrl: '',
      visible: false
    }
  },
  methods: {
    open (url) {
      this.visible =  true
      this.$nextTick(() => {
        this.showType = 'iframe'
        if (url.indexOf('.pdf') > -1) {
          let iframe = document.getElementById('iframe')
          iframe.src = url + '#toolbar=0'
        } else if (url.indexOf('.pptx') > -1) {
          document.getElementById('iframe').src = `${window.location.origin}${window.location.pathname}pptx/index.html?src=${url}`
        } else if (url.indexOf('.docx') > -1) {
          this.showType = 'doc'
          this.docUrl = url
        } else {
          document.getElementById('iframe').src = `https://view.officeapps.live.com/op/view.aspx?src=${url}`
        }
      })
    },
    close () {
      this.visible =  false
    }
  }
}
</script>
<style lang="less" scoped>
.global-window {
  /deep/ .el-dialog {
    height: 100%;
    margin: 0 auto;
  }
  /deep/ .el-dialog__body {
    height: calc(100% - 80px)
  }
}
.body {
  height: 100%;
  iframe {
    width: 100%;
    height: 100%;
  }
}
</style>

组件调用:

javascript 复制代码
// 引入
import fileView from '@/components/fileView'
components: {
    fileView
  },
// 调用 (url就是文件的地址)
this.$refs.fileView.open(`${url}`)

**特别说明:**对于.pptx需要单独判断,因为iframe对于.ppt和.pptx的地址解析方式不太一样。(fileView.vue组件代码里都有呈现)另外需要注意的是.doc格式在@vue-office里是不支持的,它只能解析.docx的内容,并且也有一定的弊端,就是如果文件内有插画,会出现渲染不出来的情况,不过毕竟是免费的,就也不要求那么多了。如果愿意花钱找个第三方完整一点的,就也可以。不过也有其他方法,后台上传文件的时候限制只能.pptx格式或者.docx格式,毕竟我们团队就这么干的。简单粗暴,完美解决~ 还怒省一大笔钱~~

相关推荐
cmd13 分钟前
别再用错!5种JS类型判断方法,从原理到实战一文吃透
前端·javascript
Irene199122 分钟前
JavaScript 事件循环(Event Loop) 的运作流程(附:queueMicrotask() 将一个回调函数立即排队到微任务队列中)
javascript·事件循环·宏任务·微任务·调用栈·queuemicrotask
倒计时的尽头是什么23 分钟前
避免渲染大量数据造成页面卡顿——虚拟滚动
vue.js
wobi_baoyan23 分钟前
【已解决】使用Maven打包发生或者启动Spring Boot项目发生 错误: 不支持发行版本 17
服务器·前端·javascript
学以智用26 分钟前
# TypeScript 高级特性(核心+实用)
前端·javascript·typescript
学以智用26 分钟前
TypeScript 核心基础:类型/变量 + 函数 + 接口
前端·javascript·typescript
SuperEugene29 分钟前
Vue3 组件解耦实战:Props/Emit/ 事件总线用法 + 避坑指南|Vue 组件与模板规范篇
前端·javascript·vue.js
计算机学姐44 分钟前
基于SpringBoot的校园二手交易系统
java·vue.js·spring boot·后端·spring·tomcat·intellij-idea
冰暮流星1 小时前
javascript之回调函数
开发语言·前端·javascript
wuhen_n1 小时前
Vue3 组件中的图片懒加载与渐进式加载
前端·javascript·vue.js