vue2 预览word文件

1. 使用vue-office

父组件调用init方法即,适用于远程url和本地文件

javascript 复制代码
npm install @vue-office/docx vue-demi
javascript 复制代码
<template>
  <el-dialog
    v-el-drag-dialog
    :visible.sync="previewOpen"
    :close-on-click-modal="false"
    append-to-body
    custom-class="previewDialog"
    @close="closeDialog"
  >
    <vue-office-docx :src="docx" @rendered="rendered" />
  </el-dialog>
</template>
<script>
  import VueOfficeDocx from '@vue-office/docx'
  import axios from 'axios'
  export default {
    components: {
      VueOfficeDocx
    },
    data() {
      return {
        previewOpen: false,
        docx: '' // 远程url地址,本次使用blob文件流转url
      }
    },
    beforeDestroy() {
      if (this.docx) {
        URL.revokeObjectURL(this.docx) // 清除Blob URL
      }
    },
    methods: {
      // 预览
      init(id) {
        axios({
          method: 'get',
          responseType: 'blob',
          url: '' // 自己的服务器,提供的一个word下载文件接口
        }).then((res) => {
          this.previewOpen = true
          this.$nextTick(() => {
            this.docx = window.URL.createObjectURL(res.data)
          })
        })
      },
      rendered() {
        console.log('渲染完成')
      },
      closeDialog() {
        this.previewOpen = false
      }
    }
  }
</script>
<style scoped>
  .previewDialog .el-dialog__headerbtn .el-dialog__close {
    z-index: 2001;
  }
  .word {
    display: block;
  }
</style>

2.使用docx-preview

父组件调用init方法即可,适用于本地文件

javascript 复制代码
npm install docx-preview
javascript 复制代码
<template>
  <el-dialog
    v-el-drag-dialog
    :visible.sync="previewOpen"
    :close-on-click-modal="false"
    append-to-body
    custom-class="previewDialog"
    @close="closeDialog"
  >
    <div class="word">
      <div ref="myfile" />
    </div>
  </el-dialog>
</template>
<script>
  const docx = require('docx-preview')
  import axios from 'axios'
  export default {
    data() {
      return {
        previewOpen: false
      }
    },
    methods: {
      init(id) {
        axios({
          method: 'get',
          responseType: 'blob',
          url: '' // 自己的服务器,提供的一个word下载文件接口
        }).then((res) => {
          this.previewOpen = true
          this.$nextTick(() => {
            docx.renderAsync(res.data, this.$refs.myfile)
          })
        })
      },
      closeDialog() {
        this.previewOpen = false
      }
    }
  }
</script>
<style scoped>
  .previewDialog .el-dialog__headerbtn .el-dialog__close {
    z-index: 2001;
  }
  .word {
    display: block;
  }
</style>
相关推荐
心在飞扬20 小时前
ReRank重排序提升RAG系统效果
前端·后端
心在飞扬21 小时前
RAPTOR 递归文档树优化策略
前端·后端
前端Hardy21 小时前
别再无脑用 `JSON.parse()` 了!这个安全漏洞你可能每天都在触发
前端·javascript·vue.js
前端Hardy21 小时前
别再让 `console.log` 上线了!它正在悄悄拖垮你的生产系统
前端·javascript·vue.js
青青家的小灰灰21 小时前
从入门到精通:Vue3 ref vs reactive 最佳实践与底层原理
前端·vue.js·面试
OpenTiny社区21 小时前
我的新同事是个AI:支持skill后,它用TinyVue搭项目还挺溜!
前端·vue.js·ai编程
心在飞扬21 小时前
MultiVector 多向量检索
前端·后端
用户390513321928821 小时前
async 函数返回的 Promise 状态何时变为 resolved
前端
李剑一21 小时前
大屏天气展示太普通?视觉升级!用 Canvas 做动态天气遮罩,雷阵雨效果直接封神
前端·vue.js·canvas
Lee川1 天前
现代Web开发中的CSS继承、Flexbox布局与LocalStorage交互:从文档解析到实践应用
前端·css