简介

  本文介绍的 WebOffice 控件是由广州市华尔太科技有限公司开发的一款在网页里处理 Office 文件的产品。 WebOffice 控件支持几乎所有对在线文档功能的需求,如在线新建编辑保存多人协作 Office 文件等。
它具有以下核心功能

  1、远程打开、保存:WebOffice全自动,无需手动上传下载,遵守标准HTTP/HTTPS传输协议,支持服务器同步和异步方式保存文件。
  2、智能填报/读取:可从数据库指定字段提取数据,填充文档指定位置,也可从文档指定位置读取数据到数据库指定字段。
  3、强大的API接口和VBA扩展能力:高效API与VBA扩展,任意办公文档扩展功能均可用VBA整合JS满足业务需求。

  官网入口

优缺点

  相比于 WPS 提供的 WebOffice,广州市华尔太科技有限公司的 WebOffice 控件具有价格低、接入简单(前端无需额外安装包)和 dome 丰富的优点。

  WebOffice 控件也有很致命的缺点,即客户端需要在本地安装 WebOffice 控件。另外 WebOffice 控件的操作窗口是弹出一个单独的窗口,在这个窗口没法打开控制台,不方便调试,而且样式也很老旧。

  WebOffice 控件好像没有文档(我没找到,这也是写这篇文章的原因),虽然提供了大量的实现各种功能的 demo,但是并没有涵盖所有的操作,所以有时候就得去翻 Microsoft Office 的文档。

几个可能用得着的文档地址

  • Office 加载项 JavaScript API 参考
  • Docs .NET .NET API browser Microsoft.Office.Interop.Word Table
  • Office VBA 参考
  • 在线演示(官网给的 demo,一般需要下载下载,然后设置正确的 UserName 和 Authorizer 才能运行)

备忘

WORD
 WebOffice.ActiveDocument.Tables(1); // 返回文件的第一个表格对象WebOffice.ActiveDocument.Tables.Count; // 返回文档中表格的数量WebOffice.ActiveDocument.Tables(1).Rows.Count; // 返回文档中第一个表格的行数WebOffice.ActiveDocument.Tables(1).Columns.Count; // 返回文档中第一个表格的列数WebOffice.ActiveDocument.Tables(1).Rows(1).Delete(); // 删除表格的第一行WebOffice.ActiveDocument.Application.Selection.Type // number 1 表示没有选中内容。 2 表示选中文本内容console.log(WebOffice.IsDirty); // 只读属性,表示文档是否有修改// 保护文档,使文档那个不可编辑WebOffice.ActiveDocument.Protect(3,false,this.pwd,false,true);// 先解除保护,使文档可编辑WebOffice.ActiveDocument.Application.ActiveDocument.UnProtect(this.pwd);

dome

文档操作页面
<template>
<div class="web-edit"><div class="left"><div class="btn-area"><el-button size="small" @click="quiteAction">退出</el-button><el-button size="small" type="primary" @click="HttpPostSave">保存</el-button></div><div class="content-warp"><template v-for="classifyLevel1 in fieldList" ><p class="title max-title" :key="classifyLevel1.type"><span @click="unfoldAction(classifyLevel1)" class="can-click">{{classifyLevel1.type}}<i v-if="classifyLevel1.isUnfold" class="el-icon-caret-bottom"></i><i v-else class="el-icon-caret-right"></i></span></p><template v-if="classifyLevel1.isUnfold"><div class="field-box" v-for="classifyLevel2 in classifyLevel1.fieldList" :key="classifyLevel2.classifyName"><p class="title"><span @click="unfoldAction(classifyLevel2)" class="can-click">{{classifyLevel2.classifyName}}<i v-if="classifyLevel2.isUnfold" class="el-icon-caret-bottom"></i><i v-else class="el-icon-caret-right"></i></span></p><div class="field-list" v-if="classifyLevel2.isUnfold"><span @click="insertAction(item, classifyLevel1.type)" class="item can-click" :class="{'is-checked': item.checked}" v-for="item in classifyLevel2.fieldList" :key="item.id">{{item.name}}</span></div></div></template></template></div></div><div class="right"><object classid="clsid:FF09E4FA-BFAA-486E-ACB4-86EB0AE875D5" codebase="http://www.officectrl.com/weboffice/WebOffice.ocx#Version=2018,1,6,2" id="WebOffice" width="100%" height="100%" ></object></div></div>
</template>
<script>
import { temDetail, getFieldList, saveFieldsList } from "@/api/baseInfo";
import { setToken } from '@/utils/auth'export default {data () {return {strUrl: '',doctype: '',imgList: [],WebOffice: '',fileName: '',orderId: null,editId: null,pwd: Date.now().toString(),fieldList: [],fields: [], // 已选的字段列表}},created() {let query = this.$route.query;let token = query.token;setToken(token, false);if (query.id) {this.editId = query.id;this.getFieldList();this.temDetail();}},mounted() {},methods:{// 插入表格/*** data 表格的数据;* columnsCount 列数;* rowsCount 行数;* isAdapt 是否自动调整表格中单元格的大小以适应单元格的内容(word 中)(可选)*/insertTable(data, columnsCount, rowsCount=1, isAdapt=true) {const range = WebOffice.ActiveDocument.Application.Selection.Range;const table = WebOffice.ActiveDocument.Tables.Add(range, rowsCount, columnsCount, isAdapt);if (table.Rows.Count > rowsCount) {table.Rows(table.Rows.Count).Delete();alert("提示:两个表格之间至少有一行空行");return;}data = Array.isArray(data) ? data : [];if (rowsCount < 1) {alert("表格的行数不能小于 1");} else {data.forEach((rows, rowIndex) => {if (Array.isArray(rows)) {// 二维数组,不止一行的情况下rows.forEach((cell, columnIndex) => {table.Cell(rowIndex + 1, columnIndex + 1).Range.InsertAfter(cell);})} else {// 只有一行table.Cell(1, rowIndex + 1).Range.InsertAfter(rows);}})}range = null;table = null;// WebOffice.ActiveDocument.Tables(1); // 返回文件的第一个表格对象// WebOffice.ActiveDocument.Tables.Count; // 返回文档中表格的数量// WebOffice.ActiveDocument.Tables(1).Rows.Count; // 返回文档中第一个表格的行数// WebOffice.ActiveDocument.Tables(1).Columns.Count; // 返回文档中第一个表格的列数// WebOffice.ActiveDocument.Tables(1).Rows(1).Delete(); // 删除表格的第一行// WebOffice.ActiveDocument.Application.Selection.Type // number 1 表示没有选中内容。 2 表示选中文本内容// console.log(WebOffice.IsDirty); // 只读属性,表示文档是否有修改// 保护文档,使文档那个不可编辑// WebOffice.ActiveDocument.Protect(3,false,this.pwd,false,true);// 先解除保护,使文档可编辑// WebOffice.ActiveDocument.Application.ActiveDocument.UnProtect(this.pwd);},unfoldAction(item) {item.isUnfold = !item.isUnfold;},insertAction(field, type) {let isRevise = WebOffice.ActiveDocument.Application.Selection.Type === 2;// 先解除保护,使文档可编辑// WebOffice.ActiveDocument.Application.ActiveDocument.UnProtect(this.pwd);if (isRevise) {WebOffice.ActiveDocument.Application.Selection.Cut(); // 删除所选内容,并将内容移至剪切板}if (type === "表格") {let columnsCount = field.header.length, rowsCount = 2;let data = [field.header, field.header.map(() => "")];this.insertTable(data, columnsCount, rowsCount);} else {// 在光标处插入文本WebOffice.ActiveDocument.Application.Selection.Range.InsertAfter(field.code);}if (!this.fields.includes(field.id)) {this.fields.push(field.id);}// 保护文档,使文档不可编辑// WebOffice.ActiveDocument.Protect(3,false,this.pwd,false,true);},temDetail() {temDetail(this.editId).then(res => {let strUrl = res.alioss.attachmentUrl;let fileName = res.alioss.fileName;this.fileName = fileName;let doctype = '';let index = fileName.lastIndexOf('.');doctype = fileName.substring( index + 1, fileName.length);const WebOffice = document.getElementById('WebOffice');// 正确设置 UserName 和 Authorizer 才能正确打开WebOffice.UserName="公司名称";WebOffice.Authorizer="www.officectrl.com";this.$nextTick(() => {setTimeout(() => {WebOffice.MenuBar = false;WebOffice.Toolbars = true; // 是否显示工具栏WebOffice.Titlebar = false;WebOffice.Open(strUrl, true, doctype);// WebOffice.ActiveDocument.Protect(3,false,this.pwd,false,true);}, 1000)})}).catch(error => {console.log(error);})},quiteAction() {window.close();},// 保存文件(同步保存)HttpPostSave() {this.saveFieldsList();const strSaveUrl = process.env.VUE_APP_BASE_API + '/api/retemplate/upload';try { WebOffice.HttpInit();WebOffice.HttpAddPostString('id', this.editId);WebOffice.HttpAddPostCurrFile("docfile","");//此句为固定语句,不管是保存word还是excel,ppt等都这样写const strResults = WebOffice.HttpPost(strSaveUrl);// console.log(strResults);// strResults;//如果保存成功,编程时让服务器接收代码如upload.jsp,upload.aspx,upload.php等返回空值或OK字串。// if(strResults.indexOf('ok') > 1)alert('office文档保存成功!');}catch(e) {alert('发生错误!请使用查阅返回值!');}   },// 获取可配置的字段getFieldList() {getFieldList(this.editId).then(res =>{this.fieldList = res.map(item => {this.$set(item, "isUnfold", true);if(item.fieldList && item.fieldList.length) {item.fieldList.forEach(el => {this.$set(el, "isUnfold", true);})}return item;});}).catch(err => {console.log(err);})},saveFieldsList() {let params = {id: this.editId,fields: this.fields}saveFieldsList(params).then(res => {alert('保存成功');}).catch(err => {console.log(err);})},}
}
</script>
<style lang="scss" scoped>
.web-edit {display: flex;width: 100%;height: 100%;box-sizing: border-box;overflow: hidden;background-color: #fff;.can-click {cursor: pointer;}.left {display: flex;flex-direction: column;font-size: 14px;width: 400px;padding-left: 10px;.btn-area {padding: 30px 0 20px;text-align: center;.el-button {width: 100px;& + .el-button {margin-left: 20px;}}}.content-warp {flex: 1;overflow-x: hidden;overflow-y: auto;}.title {.el-icon-caret-right, .el-icon-caret-bottom {color: #409eff;}}.max-title {margin-top: 10px;font-size: 16px;}.field-box {padding: 10px 15px 0;.field-list {padding: 10px 10px 0;.item {display: inline-block;padding: 0 8px;margin: 5px 15px 5px 0;font-size: 14px;line-height: 23px;background-color: #eee;white-space: nowrap;border-radius: 3px;&:hover, .is-checked{color: #fff;background-color: #409eff;}}}}}.right {flex: 1;height: 100%;#WebOffice {width: 100%!important;height: 100%!important;}}}
</style>
打开编辑页面的方法
// 编制动作editAction(id) {let pre = "weboffice://|Officectrl|"; // 这个很关键!!!let host = window.location.host;let browerType = this.getBrowser();let token = getToken();if (browerType == 0) {const { href } = this.$router.resolve({name: "edit",query: { 'id': id, 'token': token}});window.open(href, '_blank');} else {let strUrl = pre + 'http://' + host + '/#/edit?id=' + id + '&token=' + token;window.open(strUrl, '_blank');}},// 检查浏览器类型getBrowser() {   let Sys = {};let ua = navigator.userAgent.toLowerCase();let s;let ver;(s = ua.match(/edge\/([\d.]+)/)) ? Sys.edge = s[1] :(s = ua.match(/rv:([\d.]+)\) like gecko/)) ? Sys.ie = s[1] :(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :(s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :(s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :(s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :(s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;if (Sys.edge) return 1;if (Sys.ie) return 0;if (Sys.firefox) return 1;if (Sys.chrome){ ver = Sys.chrome;ver.toLowerCase();var arr = ver.split('.');if(parseInt(arr[0])>43){return 1;}else{return 0;}}if (Sys.opera) return 1;if (Sys.safari) return 1;return 1;},
效果

WebOffice 文档在线编辑相关推荐

  1. [转载]Office文档在线编辑的实现之二

    上篇文章 http://www.cnblogs.com/jianyi0115/archive/2007/03/16/677712.html 讲述了如何通过iis的webdav支持实现客户端的offic ...

  2. Office文档在线编辑

    Office文档特别是Word文档在线编辑基本上有如下几个方案: 1.使用dsoframer,毕竟是MS微软的东东,功能很强悍,而且国内的很多产品都是基于dsoframer开发的 2.使用WebOff ...

  3. Office文档在线编辑的实现

    因为项目的关系,研究了一下Office的在线编辑功能,写出来共享一下. Office xp之后的版本支持通过webdav协议(http的扩展)直接编辑服务器上的文件. IIS(6.0)支持webdav ...

  4. 文档在线编辑开发心得

    一.背景 在本次公司的开发任务中,偶然接触到了畅写office的文档在线编辑集成开发,在开发中遇到点问题,觉得这个东西挺有趣的,写此文章保存开发心得. 二.前期准备 文档在线编辑功能只有一个api.文 ...

  5. Pdf文档在线编辑控件源码及演示

    支持Pdf文档在线编辑,并可以进行另存管理. PdfTestSite为演示文件夹 PdfViewer为控件源码控件 test.pdf为模版文件 注意:服务器端需要安装Adobe Reader以便进行更 ...

  6. wps在线预览接口_金山文档在线编辑 - 快速接入 - 《WPS开放平台技术文档》 - 书栈网 · BookStack...

    快速接入 一.申请和上线流程如下: 1.申请Appid和SecretKey 需要前往https://open.wps.cn 注册服务商,并且申请开通金山文档在线编辑服务. 2.实现回调接口 根据本文档 ...

  7. 实现word文档在线编辑

    实现word文档在线编辑 前言 一.docker部署onlyoffice 二.前端demo 三.后端回调处理 四.效果 前言 我们通过使用docker部署的onlyoffice来实现文档的预览编辑,做 ...

  8. 通达OA-今日学习:OFFICE文档在线编辑控件与工作流表单手写签章控件的区别是什么?

    NTKOOFFICE文档在线编辑控件,控件提供商为重庆软航科技,使用范围:OA各个模块上传附件(比如文件柜.工作流.公告通知等模块),如果是Office文档,就可以在线编辑或阅读,在线编辑时可以加盖电 ...

  9. 用pageOffice控件实现 office 文档在线编辑Word 打开文档后在页面里触发事件

    OA办公中,业务需要编辑打开word文档后 执行一些js操作 怎么实现编辑打开word文档后 执行一些js操作呢? 2 实现方法 通过pageOffice实现简单的在线打开编辑word时, 通过设置 ...

最新文章

  1. Jmeter 压测 http(s)
  2. linux ps命令 格式 进程状态 各字段含义 简介
  3. 开发日记-20190528 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》.desktop创建
  4. python的用途实例-python进程池作用展示及实例解析
  5. swoole 简单的聊天室
  6. rodbc 连接oracle,在R中加密密码 – 使用RODBC连接到Oracle DB
  7. 【论文解读】用Dropout思想做特征选择保证效果,还兼顾了线上性能?
  8. 设计模式——单例模式详解
  9. 我们说的目标导向不是 “唯结果论”
  10. 《转》python学习(7) -列表
  11. [ROS]1 小乌龟
  12. java 用户行为记录_大型网站用户行为记录的一个实现
  13. 如何建语料库_关于语料库的建立
  14. 机器学习、深度学习常见面试题300道
  15. 基于MATLAB的人脸识别研究
  16. AMD64(x86_64)架构abi文档:中
  17. GEO TCGA公共数据挖掘培训
  18. 树莓派4B EC20 查看4G信号强度
  19. element plus组件居中显示
  20. centos7 telnet访问mysql出错Connection closed by foreign host

热门文章

  1. Kronos木马都在不断进步,而你呢?
  2. EBC金融外汇原油专题|权威解读「七大因素主导全球原油价格走势」
  3. 面向隐私计算的联邦学习激励机制与效率优化研究
  4. 为你解析--音视频会议系统
  5. 计算机桌面按哪个键锁定呀,电脑屏幕锁定的快捷键是什么?
  6. c# 全选快捷键等类似事件
  7. java优化方法_JAVA程序性能优化的10个简单方法
  8. 麒麟系统arm64或aarch64架构下docker打包jdk1.8镜像
  9. 计算机怎么查询隐藏的字体,Win10怎么隐藏不使用的字体?隐藏字体的方法
  10. Unity安卓打包设置项目名称为中文名