前端vue使用onlyoffice控件实现word在线编辑、预览

 简介
ONLYOFFICE 文档 是一个开源办公套件,包括文本文档、电子表格、演示文稿和可填写表单的编辑器。
它提供以下功能:
创建、编辑和查看文本文档、电子表格、演示文稿和可填写表单;
与其他队友实时协作处理文件。
基于这个控件,可以实现前端word、excel、pdf等文件在线编辑、预览,可以说非常强大,目前项目中只使用到word编辑预览,但拓展其他文件也非常简单,完善类型传参,更改onlyoffice配置参数中的文件类型即可。

前端引入onlyoffice的api.js

需要后端服务器上安装配置好 ONLYOFFICE 文档
前端非常简单,引入一行js即可,documentserver即安装配置好 ONLYOFFICE 文档的后端服务器地址,该地址让后端提供,前端引入即可

<script type="text/javascript" src="https://documentserver/web-apps/apps/api/documents/api.js"></script>
onlyoffice如何使用
1.封装一个onlyoffice页面,在vue-router路由中注册该页面
<template>
  <div id="onlyoffice"></div>
</template>
<script>
export default {
  mounted() {
    this.fileDeal();
  },
  methods: {
    fileDeal() {
      let config;
      // 判断时编辑还是预览
      if (this.$route.query.openType === 'edit') {
        config = this.editOfficeConfig();
      } else {
        config = this.viewOfficeConfig();
      }
      new window.DocsAPI.DocEditor('onlyoffice', config);
    },
    editOfficeConfig() {
      let urlView = '';
      urlView =
        window.BASE_URL +
        `/gczd/fill/template/file/content?id=${this.$route.query.id}`;
      let callbackUrl = '';
      callbackUrl =
        window.BASE_URL +
        `/gczd/detail/file/callback?fileId=${this.$route.query.id}`;
      return {
        document: {
          mode: 'edit',
          fileType: 'docx',
          key: this.$route.query.id,
          title: '测试wordw文件.docx',
          url: urlView,
          permissions: {
            edit: true,
          },
        },
        documentType: 'word',
        editorConfig: {
          user: {
            name: this.$store.state.user.nickName,
            id: this.$store.state.user.userId,
          },
          // 隐藏插件菜单
          customization: {
            plugins: false,
            forcesave: true,
          },
          lang: 'zh',
          callbackUrl: callbackUrl,
        },
        height: '100%',
        width: '100%',
      };
    },
    // 纯查看
    viewOfficeConfig() {
      let urlView = '';
      urlView =
        window.BASE_URL +
        `/gczd/fill/template/file/content?id=${this.$route.query.id}`;
      return {
        document: {
          mode: 'view',
          fileType: 'docx',
          key: this.$route.query.id,
          title: '测试wordw文件.docx',
          url: urlView,
          permissions: {
            edit: false,
          },
        },
        documentType: 'word',
        editorConfig: {
          user: {
            name: this.$store.state.user.nickName,
            id: this.$store.state.user.userId,
          },
          customization: {
            plugins: false,
          },
          lang: 'zh',
        },
        height: '100%',
        width: '100%',
      };
    },
  },
};
</script>

<style lang="scss" scoped>
#file-info {
  position: fixed;
  top: 0px;
  z-index: 999;
}
</style>

2.代码解释

new window.DocsAPI.DocEditor是从https://documentserver/web-apps/apps/api/documents/api.js中获取的构造函数,第一个参数是dom的id,onlyoffice会往这个id的dom下生成插入一个iframe,第二个参数是onlyoffice的配置项

配置项文档
很多配置项一目了然是干啥的,直接对照官方文档即可https://api.onlyoffice.com/zh/editors/config/,重点讲解一下url和callbackUrl

配置项中的url是什么
可以看到前端拼接了一个url的配置项,这个url其实就是后端的一个接口,onlyoffice通过这个接口去打开word等文件。
那么问题来了,这个配置项中的url接口是get还是post?是文件绝对路径还是支持文件流?
答案是:都可以。
可以是一个get请求,即通过绝对路径访问资源,也可以是post请求返回文件流,onlyoffice内部有做处理,传url时不需要指定接口的类型,都可以正常加载,厉害了。
如果打开时出现"下载失败",用postman好好测测这个url接口,能否直接请求通,一般就是这个接口有问题。

配置项中的callbackUrl是什么
callbackUrl就是编辑完文档保存时会调用的一个后端接口,具体信息查看官方文档https://api.onlyoffice.com/zh/editors/callback,后端根据不同status判断文档的状态,编辑完之后会返回后端一个临时缓存文件的url,后端根据这个临时缓存文件url进行文件更新

支持除了word的其他文件
修改fileType和documentType配置字段即可,后续如果有相关实现也会更新文章

注意点
1.key字段是用来识别文档的唯一文档标识符,官方文档说key字段为应当在编辑或保存后更新,但实际开发中前端没有更新key值,编辑保存也能正常使用。
2.后端原先是在callbackUrl返回的status===2(文档已准备好保存)时做文件更新操作,发现只有等待10s后再次打开才能显示编辑保存后的文档,因为它在编辑文档关闭后 10 秒 触发,后来后端改成了在callbackUrl返回的status===6(正在编辑文档,但保存了当前文档状态)时做了文件更新操作,前端需要加forcesave:true,编辑文档会强制保存,最后效果正常了。
3.后端callbackUrl接口返回值一定要是"{\"error\":0}",表示接口没有错,不然会提示这份文件无法保存。请检查连接设置或联系您的管理员当你点击“OK“按钮,系统将提示您下载文档

编辑和预览word,跳转到onlyoffice页面,携带不同参数用于生成onlyoffice的配置即可

   // 编辑,跳转到onlyoffice页面
   handleEdit() {
      let routeData = this.$router.resolve({
        path: '/onlyoffice',
      });
      window.open(
        routeData.href +
          '?id=' +
          this.fileId +
          '&openType=edit',
        '_blank'
      );
    },
    // 预览,跳转到onlyoffice页面
    handleView() {
      let routeData = this.$router.resolve({
        path: '/fileinfo',
      });
      window.open(
        routeData.href +
          '?id=' +
          this.fileId,
        '_blank'
      );
    },

### Vue3 中嵌入 Office 应用程序或功能的方法 在 Vue3 项目中嵌入 Office 功能可以通过多种方式实现,具体取决于所需的功能以及目标平台的支持情况。以下是几种常见的解决方案及其适用场景。 #### 使用 OnlyOffice API 实现文档编辑器集成 OnlyOffice 提供了一套完整的在线文档编辑工具集,支持 Word、Excel 和 PowerPoint 文件的查看与编辑。其核心 API `ApiDocument` 可用于处理文档操作[^1]。通过引入 OnlyOffice 的 Web 版本 SDK 并将其封装到 Vue 组件中,可以轻松实现前端展示和编辑文档的功能。 下面是一个简单的示例代码片段: ```javascript <template> <div id="onlyoffice-container"></div> </template> <script setup> import axios from 'axios'; const config = { document: { fileType: "docx", key: Math.random().toString(36).substring(7), title: "example.docx", url: "https://your-server.com/example.docx" }, editorConfig: { callbackUrl: "https://your-callback-url.com/callback", lang: "en", mode: "edit", // 或者设置为 view 表示只读模式 user: { id: "user-id", name: "User Name" } } }; onMounted(() => { const scriptSrc = "https://documentserver.example.com/web-apps/apps/api/documents/api.js"; loadScript(scriptSrc, () => { new window.DocEditor("onlyoffice-container", config); }); }); function loadScript(src, onload) { const script = document.createElement('script'); script.src = src; script.onload = onload; document.head.appendChild(script); } </script> ``` 此代码加载了 OnlyOffice 文档编辑器并初始化了一个容器来显示文档内容。 --- #### 利用 vue-office 插件预览 Docx 和 Xlsx 文件 对于仅需提供文件预览而无需复杂交互的情况,可以直接采用基于 JavaScript 的库如 `vue-office/docx` 和 `vue-office/excel` 来完成任务[^2]。这些插件能够快速解析本地上传或者远程获取的 `.docx` 和 `.xlsx` 文件,并渲染成 HTML 页面以便用户浏览。 安装依赖项: ```bash npm install @jsreport/jsreport-docx-preview vue-office-excel --save ``` 随后可以在组件内部调用它们的相关函数进行实例化工作流如下所示: ```html <template> <button @click="handlePreview">点击预览 DOCX/XLSX 文件</button> </template> <script setup> import { previewDocx } from '@jsreport/jsreport-docx-preview'; async function handlePreview() { try { await previewDocx({ file: '/path/to/sample.docx', // 替换实际路径 containerId: '#preview-area' }); console.log('DOCX 预览成功!'); } catch (error) { console.error('发生错误:', error.message); } } </script> ``` 上述例子展示了如何利用第三方类库简化开发流程的同时保持较高的灵活性。 --- #### 调用 NTKO 控件实现传统桌面级体验 NTKO 是一款针对中国市场的跨浏览器 ActiveX 插件方案,在某些特定行业领域仍然被广泛使用。它允许开发者借助原生客户端能力执行高级办公自动化任务比如批量打印报表等特殊需求[^3]。然而需要注意的是由于现代安全策略限制越来越多主流浏览器已经逐步淘汰对该技术栈的支持因此建议谨慎评估后再决定是否采纳此类方法论作为长期战略方向之一。 典型应用场景可能涉及以下逻辑结构: ```javascript let ntkoBrowser = require('@/utils/ntkobackground.min.js').default.ntkoBrowser; if (!ntkoBrowser.ExtensionInstalled()) { ntkoBrowser.openWindow(`${window.location.origin}/Demo1`); } else { this.$router.push({ name: 'Demo1' }); } // 定义全局事件监听器捕获外部信号通知 window.ntkoCloseEvent = function () { alert('跨浏览器插件应用程序窗口已关闭!'); }; ``` 以上脚本检查当前环境是否存在可用扩展如果没有则引导跳转至专用页面让用户下载安装必要驱动程序;反之继续正常导航进入下一步骤。 --- ### 总结 综上所述,Vue3 下嵌入 Office 相关特性主要存在三种途径可供选择——依靠云端服务提供商(例如 OnlyOffice)、纯前端框架组合(像 vue-office 系列产品)或者是保留遗留系统的兼容性选项(即 NTKO 类型)。每种都有各自优缺点需要结合实际情况仔细权衡利弊之后再做最终裁定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值