1. CEF技术介绍
JS加载项以CEF为技术基础,加载项的JS代码是运行在CEF内部的。CEF内部提供接口比如执行JS代码
CefRefPtr<CefBrowser> browser = ...;
CefRefPtr<CefFrame> frame = browser->GetMainFrame();
frame->ExecuteJavaScript("alert('ExecuteJavaScript works!');",frame->GetURL(), 0);
比如JS对象绑定
void MyRenderProcessHandler::OnContextCreated(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefV8Context> context)
{
// Retrieve the context's window object.
CefRefPtr<CefV8Value> object = context->GetGlobal();
// Create a new V8 string value. See the "Basic JS Types" section below.
CefRefPtr<CefV8Value> str = CefV8Value::CreateString("My Value!");
// Add the string to the window object as "window.myval". See the "JS Objects" section below.
object->SetValue("myval", str, V8_PROPERTY_ATTRIBUTE_NONE);
}
JS加载项在这些技术的基础上面开发完整的JSAPI的接口,更多CEF的技术细节
可以查看下面的网站:
chromiumembedded / cef / wiki / Home — Bitbucket
2. Ribbon customUI设计
Ribbon.xml UI设计部分按照标准的CustomUI的实现,其中逻辑控制,比如按钮显示,点击事件响应等等都是使用的JS实现。
效果样例:

WPS 加载项的结构采用 XML定义,一个典型的customUI定义如下:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnAddinLoad">
<ribbon startFromScratch="false">
<tabs>
<tab id="wpsAddinTab" label="wps加载项示例">
<group id="btnDemoGroup" label="group1">
<button id="btnShowMsg" label="弹出消息框" onAction="OnAction" getEnabled="OnGetEnabled" getImage="GetImage" visible="true" size="large"/>
<button id="btnIsEnbable" getLabel="OnGetLabel" onAction="OnAction" enabled="true" getImage="GetImage" visible="true" size="large"/>
<button id="btnShowDialog" label="弹对话框网页" onAction="OnAction" getEnabled="OnGetEnabled" getImage="GetImage" getVisible="OnGetVisible" size="large"/>
<button id="btnShowTaskPane" label="弹任务窗格网页" onAction="OnAction" getEnabled="OnGetEnabled" getImage="GetImage" getVisible="OnGetVisible" size="large"/>
<button id="btnShowTaskPane2" label="弹任务窗格网页" onAction="OnAction" getEnabled="OnGetEnabled" getImage="GetImage" getVisible="OnGetVisible" size="large"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
3. WPS加载项架构说明
整个WPS加载项使用WPS统一标准API,API内部就是对文档的各种操作和使用。WPS接口层提供统一对外的接口,传统的插件通过COM技术可以直接调用到该接口层,JS层对该接口添加了一层封装,用于实现JSAPI。从VBA或者VSTO的技术切换过来完全不用担心接口不兼容的问题,使用效果和老的接口一致。接口层是调用WPS核心组件提供的能力。在WPS组件层WPS内部解决了平台兼容性差异的问题,JS操作WPS的接口在WPS各个平台上面表现一致。使用起来方便,可移植性和跨平台性都很不错,总体设计结构如下
WPS接口:底层WPS提供多个标准接口,并封装了JavaScript接口。

4. 免控件调起WPS客户端
- 安装WPS后会在OS上运行一个WPS伺服进程,WPS服务进程名称:wpsoffice。
- WPS伺服进程提供HTTP和HTTPS监听,分别监听58890和58891端口。
- 业务系统通过调用浏览器触发自定义协议。伺服协议判断当前设备WPS的激活状态,并且根据参数调起本地WPS不同组件程序。
WPS自定义协议
| 是否启动wps弹框 | ksoWPSCloudSvr |
| 启动WPS文字 | ksowebstartupwps |
| 启动WPS表格 | ksowebstartupet |
| 启动WPS演示 | ksowebstartupwpp |
浏览器调起WPS实现原理图

5. 业务系统与WPS Office的交互关系
业务系统所有页面在服务器端运行,业务系统通过浏览器调起WPS,WPS向服务器请求对应的功能菜单,WPS内部的业务流程都通过服务器的页面完成。

6. 业务系统与WPS Office的交互原理
- WPS加载项是一个开发工具,业务系统可以通过该工具开发适用于自己流程的“OA助手”。
- “OA助手”是业务系统与WPS客户端进行协同的桥梁。
- “OA助手”实现的业务系统网页和WPS客户端交互原理是利用自定义URL协议,如下图:

- 业务系统与“OA助手”通过自定义URL协议交互;
- 业务系统页面与WPS客户端交换JSON数据;
- JSON对象的内容由业务系统与“OA助手”协商;
- WPS客户端根据JSON数据加载“OA助手”相应功能。
本文介绍了基于CEF技术的WPSJS加载项,详细阐述了Ribbon customUI设计、WPS加载项架构,以及如何免控件调起WPS客户端。业务系统与WPS的交互通过自定义协议和JSON数据交换实现,提供了跨平台和高兼容性的解决方案。
1824

被折叠的 条评论
为什么被折叠?



