# 金山WPS客户端JSAPI加载项集成文档

# 前言

使用WPS加载项无需安装额外控件,在线编辑是打开WPS的客户端,能保证内容1:1还原,并且还能打开微软的Office文件。

# 安装要求

推荐使用WPS2019专业版,版本号为v11.8.2.10255。Windows仅支持10255及其以上专业版。注意:最好使用10255版本,其他版本未过测试。你可以打开WPS,点击右上角设置图标,在关于WPS后面可以看到当前软件的版本号。

descript

使用WPS加载项最重要一点是:保证本机已安装WPS专业版,并且对版本有严格要求,只有从金山供应商购买的WPS并且由供应商提供的WPS安装程序才能使用加载项。

所有个人从金山官网下载的WPS均不支持加载项。

详细要求配置可参考[关联文档](【流版签】【wps】WPS365在OA中集成使用方法 https://open.seeyoncloud.com/#/faq/faq/v1/share?url=Z2JySmU+Nzkz "关联文档")。

# 插件和配置

加载项支持的OA版本是8.0SP2及其以上版本,以系统管理员身份登录,点击设置进入"后台管理":

descript

进入后台管理后,选择点击"系统参数设置":

descript

进入系统参数设置后,找到"功能选项",在"是否混合使用金格插件和WPS加载项"中选择""。如果这个选项是"",代表在相关的后续的操作中,会优先使用金格控件,但是如果金格控件不可用的话,就会使用WPS加载项,我们在这里选择"",来默认使用WPS加载项。(注意:该菜单受加密狗"国标插件"控制,没有插件则无法显示

descript

设置系统参数后,点击确定,退出并重新登录。

# 使用示例

正常登录系统,在"协同工作",点击"新建事项":

descript

在"正文类型"中选择"Word正文",并确定继续:

descript

descript

# 首次启动WPS服务场景

首次访问,或者重启电脑,均需要启动服务(用于唤醒wps进程):

descript

点击后,可能浏览器会弹出申请打开链接的弹窗(这是浏览器访问金山接口的安全机制控制),此时可勾选复选框后,单击红框中的按钮即可:

descript

此时可能会弹出如下窗口,这时直接点击启动服务即可(根据电脑性能等影响,可能wps接口无法立即给出响应导致),重新再启动,如果多次无法启动,则需要判断当前wps版本是否支持加载项:

descript

descript

然后点击重新加载,刷新页面:

descript

然后重新选择在"正文类型"中选择"Word正文",并确定继续,此时可以成功打开WPS服务。

descript

# 已经启动WPS服务场景

此时点击"Word正文",可以直接弹出WPS服务:

descript

descript

进入WPS文字后,点击右上角退出后,会回到浏览器界面,此时点击窗口中显示的打开正文,仍然可以重新进入:

descript

descript

最后就可以使用WPS加载项编辑内容了:

descript

# 开启调试模式

开发或者分析问题时,可能需要开启调试模式。

# 调试模式:配置参数

【Windows环境】

进入安装目录,找到oem.ini文件,可能在WPS Office > 11.8.2.10255 > office6 > cfgs 目录下面:

descript

然后【support】增加配置JsApiShowWebDebugger=true:

【信创环境】

卸载 :sudo dpkg -r xxx

安装:sudo dpkg -i xxx

1、授权:

sudo chmod -R 777 /opt/apps/cn.wps.wps-office-pro/files/

2、修改oem.ini:

uos环境:龙芯

cd /opt/apps/cn.wps.wps-office-pro/files/kingsoft/wps-office/office6/cfgs

linux:银河麒麟

cd /opt/kingsoft/wps-office/office6/cfgs

开始修改:

vim oem.ini

JsApiShowWebDebugger=true

3、重启:

cd /opt/apps/cn.wps.wps-office-pro/files/bin

国产机修改后重启:终端执行 quickstartoffice restart

备注:金山文档 https://www.kdocs.cn/l/cCVZwo3LW (opens new window)

查找publish.xml文件

windows: 我的电脑地址栏中输入:%appdata%\kingsoft\wps\jsaddons

linux: 我的电脑地址栏中输入:~/.local/share/Kingsoft/wps/jsaddons

# 调试模式:跟踪调试

WPS打开文档后,鼠标点到页签,按alt+F12

descript

按了之后会弹出类似浏览器控制台(该控制台主要可调试WPS内部触发的加载项逻辑,例如OA触发打开文件)

descript

"任务窗格"的点击事件需要跟踪,把鼠标放在任务窗格,点ALT+F12

descript

(该控制台主要可调试"任务窗格"点击后的逻辑,例如点击左侧的"保存"按钮)

descript

# 代码实现

OA触发wps客户端执行业务代码的逻辑在wps.js中,通过调用_WpsInvoke方法来调用wps_sdk.js(金山提供的)来和wps客户端通讯。

descript

wps加载项,有一个版本支持多进程方式,目前只给了中石油客开使用,没有提交标准版本。代码工程:http://gitlab.seeyon.com/ctp/apps-common/-/tree/require-wps-cnpc-develop (opens new window)

wps客户端的代码在apps-common工程,代码分别为表格和和文字的,代码逻辑是一模一样,只是表格的语法不一样,因此只要看了文字的功能,表格也就明白:

descript

# 代码实现:打开文档

打开在线文档,oa浏览器触发wps客户端,在wps的func_oastarter.js文件的dispatcher()方法,这个方法是web页面调用WPS的方法入口:

descript

而在这里面,定义了如何打开在线文档的方法,涉及到了位于wps.js文件里面的函数OnlineEditDoc():

descript

OA浏览器触发wps的最后代码位于wps.js,打开文档方法 OnlineEditDoc():

descript

该函数的主要功能实际上是修改参数以及调用_WpsInvoke()函数,参数的修改对象是一个全局WPS上下文类型,该对象指定了很多属性来表示WPS文件的各种状态:

descript

OnlineEditDoc()修改了3个属性(业务中会根据他们来进行些控制,这个不是最主要的,分析时可全局搜索),分别是:

\"renderWpsFlag\" :wps 渲染标记

\"wpsCloseFlag\":wps打开文档标记

\"changeFlag\":是否调用模板标记

OnlineEditDoc()根据业务情况和参数传值来修改这些属性的的值:

descript

只要需要打开WPS,必然需要经过_WpsInvoke方法,这是调用wps客户端的最后一个业务方法:

descript

改方法会调用wps_sdk.js(金山提供)的方法和wps客户端通讯,这个文件是金山给我们提供的,我们不做任何修改,如果需要修改,则和master反馈。

# 代码实现:消息通知

1、消息监听

消息通知有消息监听的形式,比如WPS文字监听函数,通过传入参数的信息,来设定文档的属性,实现一个信息的传递功能。例如WPS客户端对文档保存、修改、关闭等操作,需要告诉oa,则通过改消息机制来实现:

descript

descript

表格信息监听的方式如出一辙,也是通过传递的参数信息来判断和修改对象的属性值:

descript

在后面,还对这两个监听方法实现了一个封装,并且为了实现加载上的一个同步,还设置了一个200ms的延迟时间(很多业务组加载js文件是异步的,会存在wps_sdk.js没有引入就开始初始代码而导致undefined错误):

descript

2、心跳机制

Wps客户端访问oa时,是wps的内置浏览器触发请求,因此存在另一个seesion,这个新的seesion在OA是没有登录的,会被拦截。因此需要一套安全机制。

wps和oa服务器通讯,目前我们使用的是类似一个心跳的机制,下边是它时序图:

descript

当需要使用加载项时,OA页面会触发生成

3、保存文档

进入WPS,点击保存,触发点击事件:

descript

跟踪代码,此时会调用方法OnAction(),最终相应的执行OnBtnSaveToServer()方法:

descript

继续跟踪OnBtnSaveToServer()方法,进入func_tabcontrol.js文件的OnBtnSaveToServer()方法:

descript

进入核心代码行uploadToServer()方法的调用,然后在这里奇怪的是,我进入该行代码的执行,但是显现的并不是我想看到的那个函数(可能是一些浏览器显示乱跳的问题,我们可以使用debugger来强制使用断点进入):

descript

进入后调用的是这一行,也就是调用btnShowDoc()函数的最末行,而不是uploadToServer()的第一行:

descript

随后执行函数onAutoUploadSuccess(),执行完该函数过后,:

descript

4、保存文档回调

保存文档回调的关键代码是对象WpsConstent的saveFileCallBack()方法:

descript

# 代码实现:执行专业签章

文件wps.js

①判断是否有专业签章函数

fileId:文件Id

ClientType:客户端类型(wps或et),若不传将被设置为wps

返回值为boolean

descript

②函数_WpsInvoke

funcs:调用的函数名,JSON格式

OAAssistType:客户端类型,若不传将被设置为wps

调用wpsFunc去做判断,其中info的值为{"HasSpecialSignature":fileId...}

判断结果将传入回调函数的参数result

descript

文件func_oastarter.js

①判断是否有金格专业签章

判断doc中sheet的每一项的shape的每一项,有三种情况均可确定有金格专业签章,满足任意一项均可return true。

descript

# 代码实现:执行图片签章

①文件wps.js

传入funcs的函数名为"HasPicSignature"

与专业签章逻辑一致

descript

②文件func_oastarter.js

判断doc中sheet的每一项的shape的每一项,提取出关键字用于判断是否为金格图片签章。descript

# 代码实现:文档是否已经打开

含义:OA主动发起请求到wps客户端(wps加载项)中请求文档是否处于打开状态。

1、OA主动发起请求

apps-common\src\main\webapp\common\office\js\wps.js

descript

2、wps客户端接收

apps-common\src\main\webapp\common\wpsOfficeAssist\WpsOAAssist\js\common\func_oastarter.js

descript

3、根据本地是否存在对应的文件id判断是否文档已经打开

descript

# 代码实现:套红

含义:OA主动发起请求到wps客户端(wps加载项)中进行在线套红处理。

1、OA主动发起

apps-common\src\main\webapp\common\office\js\wps.js

descript

2、wps客户端接收

apps-common\src\main\webapp\common\wpsOfficeAssist\WpsOAAssist\js\common\func_oastarter.js

descript

3、wps客户端处理

apps-common\src\main\webapp\common\wpsOfficeAssist\WpsOAAssist\js\common\func_docProcess.js

先判断文档是否存在,后执行判断权限是否允许,执行套红操作。

descript

# 代码实现:获取公文域或书签数量

含义:OA主动发起请求到wps客户端(wps加载项)中进行获取公文域或书签数量,参数为文件id。

1、OA主动发起

apps-common\src\main\webapp\common\office\js\wps.js

descript

2、wps客户端接收处理

apps-common\src\main\webapp\common\wpsOfficeAssist\WpsOAAssist\js\common\func_oastarter.js

descript

3、根据文件id处理文件

descript

# 代码实现:获取书签名列表

含义:OA主动发起请求到wps客户端(wps加载项)中进行获取书签名。

1、OA发起

apps-common\src\main\webapp\common\office\js\wps.js

descript

2、wps客户端接收

apps-common\src\main\webapp\common\wpsOfficeAssist\WpsOAAssist\js\common\func_oastarter.js

descript

3、逻辑处理

apps-common\src\main\webapp\common\wpsOfficeAssist\WpsOAAssist\js\common\func_docProcess.js

descript

# 代码实现:删除书签

含义:OA主动发起请求到wps客户端(wps加载项)中进行删除书签操作。

1、OA发起

apps-common\src\main\webapp\common\office\js\wps.js

descript

2、wps客户端处理

apps-common\src\main\webapp\common\wpsOfficeAssist\WpsOAAssist\js\common\func_docProcess.js

descript

# 代码实现:更新参数

更新权限等操作会调用该函数

①文件wps.js

paramObj:参数对象

直接调用_WpsInvoke函数

无需设置ClientType

descript

需要设置ClientType

descript

②文件func_oastarter.js

调用addParamsToDoc函数并刷新权限

descript

descript

文件func_docProcess.js

具体的合并两个params的操作

descript

# 代码实现:激活文档

①文件wps.js

descript

②文件func_docProcess.js

descript

# 代码实现:强制wps保存

文件wps.js

调用_WpsInvoke

descript

# 代码实现:国际化

①获取国际化信息

文件baseOffice.js

descript

②从oa缓存中获取国际化信息

文件wps.js

descript

# 代码实现:打印

含义:在打开的wps客户端的当前打开文档中调起打印页面设置框。进行文档的打印实现。

1、入口函数

wpsOfficeAssist\wpsOfficeAssist\WpsOAAssist\taskpane.html

descript

2、执行打印逻辑

a. 获取当前激活文档:wpsApp.ActiveDocument

b. 延时加载打印逻辑:wpsApp.CommandBars.ExecuteMso("FilePrint");

wpsOfficeAssist\wpsOfficeAssist\WpsOAAssist\js\common.js

descript

# 代码实现:WPS权限控制

含义:根据OA系统传递的数据进行任务窗格功能性的动态渲染与Ribbon按钮(wps上层默认功能按钮)是否可用,以及默认功能重写。

# 1、任务窗格

  1. 加载逻辑:通过从OA端获取参数,使用wps加载项提供的参数共享方式wps.PluginStorage.setItem()来初始化需要展示的任务窗格参数。wps.PluginStorage.getItem()获取任务窗格参数,在taskpane.html中渲染任务窗格。

  2. OA参数获取与初始化参数。

wpsOfficeAssist\wpsOfficeAssist\WpsOAAssist\js\common.js

初始化菜单的参数:

params:OA参数

descript

根据OA参数更新菜单权限:

params:OA参数

descript

  1. 动态显示任务窗格

wpsOfficeAssist\wpsOfficeAssist\WpsOAAssist\js\common.js

调起加载taskpane.html

descript{width="5.726388888888889in" height="1.5303280839895013in"}

渲染任务窗格:

wpsOfficeAssist\wpsOfficeAssist\WpsOAAssist\taskpane.html

descript{width="5.726388888888889in" height="3.4402088801399824in"}

# 2、Ribbon按钮

  1. 加载逻辑:在ribbon.xml中定义出需要操作的功能权限,在初始化函数OnWPSWorkTabLoad中将需要操作的权限初始化以及挂载WPS的文档事件,比如:监听文档打开,监听文档关闭......。

a. idMso:控件名称,必须使用控件规定的名https://open.wps.cn/docs/office

b. getEnabled:是否生效。

c. onAction:自定义执行逻辑。

  1. 处理Ribbon按钮的是否可用

wpsOfficeAssist\wpsOfficeAssist\WpsOAAssist\js\common\func_tabcontrol.js

descript{width="5.726388888888889in" height="4.164646762904637in"}

  1. 自定义菜单按钮的点击执行事件

wpsOfficeAssist\wpsOfficeAssist\WpsOAAssist\js\common\func_tabcontrol.js

descript

# 代码实现:花脸

含义:简单说对历史编辑做一个展示,并提供选择权限进行一个历史编辑版本的信息展示。

1、执行逻辑

在任务窗格有花脸功能的情况下,点击对应花脸按钮,执行打开弹框逻辑,获取花脸数据,展示在弹框区域中,以进度项方式展示,点击对应任务项,获取对应任务项数据,切换并渲染新页面。打开只读文件。最后关闭弹框,关闭花脸模式。

2、弹框逻辑

a. 入口函数

wpsOfficeAssist\wpsOfficeAssist\WpsOAAssist\taskpane.html

花脸此处使用了vue.js的展示和执行函数方式。

descript

descript

3、展示花脸弹框信息

wpsOfficeAssist\wpsOfficeAssist\WpsOAAssist\taskpane.html

执行函数:listHualian

发起ajax请求,获取花脸信息。

descript

4、点击花脸对应任务项功能

a. 执行函数:open

b. 参数:item 每一个花脸任务项信息。

descript

渲染新的界面并切换:

descript

# 代码实现:清稿

含义:对文档的历史编辑痕迹进行一个清楚,然后保存全新的文档到服务器中。

1、入口函数

WpsOAAssist\js\common\func_tabcontrol.js

descript

2、清稿后需要保存到服务器中,并刷新花脸

descript

# 代码实现:转OFD、转PDF

①文件baseOffice.js

descript

②文件handWrite_n.js

# 常见Bug和解决

每次重启电脑都会提示启动服务

因为重启电脑,wps进程就会退出。下次使用必定会启动服务来唤起wps,这个我们已经找过金山技术,他们无法做到自动启动,据说是系统安全有限制,无法实现重启电脑来自动启动wps。

无法启动服务或者wps无法唤起

问题排查【WPS 问题排查https://www.kdocs.cn/l/srSD8XlpL】:

注意:请务必确认,当前WPS版本是专业版,window是10255,信创是10290。(大于该版本的未全面测试)

1:文件地址栏输入%AppData%回车,进入如下地址,看看加载项的配置路径文件

descript

如果有其他的xml,则删掉,只保留publish.xml。

2:打开publish.xml,只保留自己访问OA的ip地址的配置,有其他的,则全部删掉。

信创环境publish.xml文件地址:

linux: cd ~/.local/share/Kingsoft/wps/jsaddons

descript

保存不成功

保存有延迟,上传文件到服务器需要时间,不要在保存的时候,立即关闭wps。

访问m3端失败

请访问:http://localhost/seeyon/H5/wechat/html/allApps.html 首页

  • fildder总是弹出黄框阻塞

可能是启动了信创vpn或其他vpn

信创vpn

打开服务,将这三个服务关闭后禁用。

descript

创建人:het
修改人:het