wps加载项开发(一)
wps加载项的特点
- 完整的功能。可通过多种不同的方法对文档、电子表格和演示文稿进行创作、格式设置和操控;通过鼠标、键盘执行的操作几乎都能通过WPS 加载项 完成;可以轻松地执行重复任务,实现自动化;
- 三种交互方式。 [自定义功能区](qn.cache.wpscdn.cn/encs/doc/of… 基础接口/加载项 API 参考/自定义功能区/自定义功能区.html),采用公开的CustomUI标准,快速组织所有功能; [任务窗格](qn.cache.wpscdn.cn/encs/doc/of… 基础接口/加载项 API 参考/任务窗格/任务窗格概述.html),展示网页,内容更丰富; [Web 对话框](qn.cache.wpscdn.cn/encs/doc/of… 基础接口/加载项 API 参考/Office 全局对象/方法/ShowDialog 方法.htm),结合事件监听,实现自由交互。
- 标准化集成。不影响 JavaScript 语言特性,网页运行效果和在浏览器中完全一致;WPS 加载项开发文档完整,接口设计符合 JavaScript 语法规范,避免不必要的学习成本,缩短开发周期。
如何新建一个wps加载项
- 安装命令:
npm install -g wpsjs, 如果之前已经安装了,可以检查下wpsjs版本,更新wpsjs的命令为:npm update -g wpsjs wpsjs create HelloWps- 开始调试并愉快的写代码
执行命令:
wpsjs debug执行此命令后即可开始调试,wpsjs工具包会自动启动wps并加载HelloWps这个加载项,同时wpsjs工具包启了一个http服务,此服务主要提供两方面的能力: a.提供前端页的的热更新服务,wpsjs工具包检测到网页数据变化时,自动刷新页面。 b.提供wps加载项的在线服务,wpsjs生成的代码示例是一个在线模式,wps客户端程序实际上是通过http服务来请求在线的wps加载项相关代码和资源的。
wpsjs工具包为示例代码中有一个package.json文件,这是node工具标准的配置文件,其中有一个依赖包为wps-jsapi, 这个依赖包是wps支持的全部接口的TypeScript描述,方便在vscode中敲代码时,提供代码联想功能,由于wps接口会跟随业务 需求不断更新,因此当发现代码联想对于有些接口不支持时,通过 npm update --save-dev wps-jsapi命令定期更新这个包。
部署
1.项目进入终端, 执行wpsjs build 命令,选择在线模式。并将打出来的包文件wps-addon-build 放置在服务器上,保证http://服务器地址/wps-addon-build/index.html,能够进行访问。
2.在vue项目中,调用这段代码,下载之前部署在服务器上的插件。
<script type="text/javascript" src="./wpsjsrpcsdk.js"></script>
<script>
/*
* 将自己的加载项地址配置到这里来
* 需要保证加载项的name和业务业务系统中传递加载项name相对应
* url必须以/ 结尾,且url+ribbon.xml和url+index.html在清除浏览器缓存的情况下能直接访问,不会被重定向
* addonType:对应组件类型,wps文字,wpp演示,et表格
*/
//复制开始
// var curList = [
// {
// name: "WpsOAAssist",
// addonType: "wps",
// online: "false",
// url: "E:/公司项目/wps-oaassist/wps-addon-build/wps.7z",
// version: "1.0.0",
// },
// ]; //离线模式参考
var curList = [
{
name: "WpsOAAssist",
addonType: "wps",
online: "true",
url: "http://服务其地址/wps-addon-build/",//写成活的地址,适配服务器
},
]; //在线模式配置参考
var localList = [];
var publishIndex = 0;
var publishUnIndex = 0;
/*获取用户本地全部加载项的接口是必须要的,这个接口做了判断,
** 如果58890端口未启动,会先去启动这个端口
*/
//加载项安装函数
function installWpsAddin(callBack) {
try {
WpsAddonMgr.getAllConfig(function(e) {
if (!e.response || e.response.indexOf("null") >= 0) {
//本地没有加载项,直接安装
if (curList.length > 0) {
installWpsAddinOne(callBack);
}
} else {
//本地有加载项,先卸载原有加载项,然后再安装
localList = JSON.parse(e.response);
unInstallWpsAddinOne(callBack);
}
});
} catch (error) {
console.log(error, "installWpsAddin");
}
}
//安装单个加载项
function installWpsAddinOne(callBack) {
try {
WpsAddonMgr.enable(curList[publishIndex], function(e) {
if (e.status) {
console.log(e.msg);
} else {
console.log("安装成功", publishIndex);
}
publishIndex++;
if (publishIndex < curList.length) {
installWpsAddinOne();
} else {
callBack && callBack();
}
});
} catch (error) {
console.log("installWpsAddinOne", error);
}
}
//卸载单个加载项
function unInstallWpsAddinOne(callBack) {
try {
WpsAddonMgr.disable(localList[publishUnIndex], function(e) {
if (e.status) {
console.log(e.msg);
} else {
console.log("卸载成功");
}
publishUnIndex++;
if (publishUnIndex < localList.length) {
unInstallWpsAddinOne(callBack);
} else {
if (curList.length > 0) {
installWpsAddinOne(callBack);
}
}
});
} catch (error) {
console.log("unInstallWpsAddinOne", error);
}
}
//复制结束,
//将复制的这部分内容放到业务系统用户调起WPS前必须访问的一个页面中。
//页面加载完成后,自动安装
window.onload = function() {
try {
installWpsAddin(); //在该页面的window.onload中调用installWpsAddin()
} catch (error) {
console.log(error);
}
};
</script>
3.打开文件示例
//get请求 filepath 下载文件路径
//post请求 saveUrl 保存文件路径
//cookie 设置登录信息
let invokeParam = {
filepath:
basePath +
"/api/oa/wps/newFileByTemplate.do?documentType=" +
documentType,
filename: filename ? filename : "文书.doc", //文书名称
ReadOnly: false, //是否只读
func: "openFile",
cookie: res.data[0].data.cookie,
saveUrl:
basePath +
`/api/oa/wps/saveDocument.do?projectId=${projectId}&documentId=&documentType=${documentType}&fileType=1&workingId=${workingId}`,
};
window.WpsInvoke.InvokeAsHttp(
"wps",
"WpsOAAssist", //wps加载项的名字,在实际项目中写上对应的名字
"dispatcher", //要调用的在wps加载项中的函数名
JSON.stringify(invokeParam), //调用的在wps加载项中的函数要传递的数据,是一个json对象,根据业务系统需求任意定义
callbackFunc
);
自定义功能区
自定义功能区采用通用的 CustomUI 标准进行配置, 该标准定义了一整套标准的控件,比如按钮、下拉菜单、组合框;能够对控件的标签、图标、点击事件等属性进行配置。
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnAddInLoad">
<ribbon startFromScratch="false">
<tabs>
<tab id="WebAddinDemo" label="Web 加载项示例">
<group id="btnGroup" label="示例分组">
<button onAction="OnClicked" label="示例按钮" getImage="GetImage"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
<splitButton id="splitButton" size="large" >
<button id="button" imageMso="HappyFace" label="Split Button" />
<menu id="menu">
<button id="button1" label="Button 1" />
<button id="button2" label="Button 2" />
</menu>
</splitButton>
<box id="box" boxStyle="horizontal">
<button id="button1" label="Button 1" imageMso="HappyFace" />
<button id="button2" label="Button 2" imageMso="HappyFace" />
</box>
标记说明
-
onLoad 代表一个事件,仅在 WPS 应用装载该 WPS 加载项时触发一次,通常用来执行一些初始化操作。
-
tabs 可以包含多个 tab,每一个 tab 对应一个自定义功能区。
-
Box此元素指定可用于垂直或水平对齐控件的分组容器控件。可以嵌套Box元素以创建复杂的UI布局。
-
splitButton拆分按钮控件由按钮或切换按钮以及下拉菜单组成。拆分按钮上显示的图标和标签来自button 子元素。
-
group 将多个控件划分成不同的分组,便于将相互关联的功能组织在一起。
-
button 是一个按钮。onAction在用户点击后触发,OnClicked是开发者自定义的 JavaScript 函数。label 是按钮文字标签,getImage 用来自定义按钮图表 GetImage是开发者自定义的 JavaScript 函数,getImage 首先会在自定义功能区第一次显示的时候执行一次。当开发者调用刷新整个功能区或通过id刷新该控件时再次执行。
-
getImage,图像和imageMso 属性是互斥的
-
图像(自定义图片标识符):指定图像的关系标识符,该图像应用作该控件的图标。此属性用于指定嵌入图片,该图片驻留在包含文件中的本地
-
imageMso(内置图像标识符):指定内置图像的标识符,该标识符应用作此控件的图标。该属性的内容是应用程序定义的,如果不理解,则应忽略。docs.microsoft.com/en-us/opens…
-
getImage(getImage回调):指定要用来确定此控件图标的回调函数的名称。
-
任务窗格
任务窗格是一个用来浏览网页的用户界面面板,通常停靠在 WPS 应用程序主窗口的一侧,开发者可以控制任务窗格停靠的位置及宽高。
对话框
根据给定的url、标题、宽高等信息创建一个对话框,对话框中的内容是一个web网页。
let width = 400 * window.devicePixelRatio`
`let height = 300 * window.devicePixelRatio`
`wps.ShowDialog("https://www.wps.cn", "wps网站", width, height, true)`
Window 接口的devicePixelRatio返回当前显示设备的物理像素分辨率与CSS像素分辨率之比。 此值也可以解释为像素大小的比率:一个CSS像素的大小与一个物理像素的大小。 简单来说,它告诉浏览器应使用多少屏幕实际像素来绘制单个CSS像素。
模态对话框和非模态对话框区别
在程序运行的过程中,若出现了模态对话框,那么主窗口将无法发送消息,直到模态对话框退出才可以发送。
在程序运行的过程中,若出现了非模态对话框,主窗口还可以发送消息。
API总结
| 功能描述 | 表达式 |
|---|---|
| 返回或设置打印机的名称 | wps.WpsApplication().ActivePrinter = "HP LaserJet IIISi on \printers\laser" |
| 不设置信息,自动打印 | wps.WpsApplication().ActiveDocument.PrintOut(); |
| 打印预览 | wps.WpsApplication().ActiveDocument.PrintPreview() |
| 删除文档(临时) | wps.FileSystem.Remove(l_strPath); |
| 写入二进制文件 | wps.FileSystem.writeAsBinaryString(path, reader.result) |
| 打开本地文件 | wps.WpsApplication().ActiveDocument.Open("C:\MyFiles\MyDoc.doc", null, true) |
| 定位到文档最后 | Selection.EndKey(wdStory, wdMove); |
| 插入base64图片 | wps.WpsApplication().ActiveDocument.Shapes.AddBase64Picture('data: image / png;base64,iVBORw0KGgoAAAANS' ) |
功能实现
wps与web 页面的通信
//web页面://messageText wps发来的信息,必须为字符串。
window.WpsInvoke.RegWebNotify("wps", "WpsOAAssist", function(messageText) {
location.reload();
});
//wps端
let currentTime = new Date()
let timeStr =
currentTime.getHours() +
':' +
currentTime.getMinutes() +
':' +
currentTime.getSeconds()
wps.OAAssist.WebNotify(
'这行内容由wps加载项主动送达给业务系统,可以任意自定义, 比如时间值:' +
timeStr,
true
)
打开文件
/**
* @description 打开文档
*/
function openFile(OAParams) {
Util.DownloadFile(
OAParams.filepath,
path => {
let fileName = path
let ReadOnly = OAParams.ReadOnly
wps.WpsApplication().Documents.Open(
fileName,
false,
ReadOnly,
false
)
insertParams(OAParams)//设置文档参数
},
OAParams.filename
)
}
插入图片
/**
* @description 插入图片
*/
function insertImage() {
//linux 系统下可以自动生成二维码。目前由于使用的是window系统只能通过接口方式获取base64 的图片进行插入
var l_doc //文档对象
l_doc = wps.WpsApplication().ActiveDocument
if (!l_doc) {
return
}
let documentId = Util.GetDocParamsValue(l_doc, 'documentId')
if (!documentId) {
alert('当前文档不是通过系统打开的文书文档,不能加码')
return
}
var selection = l_doc.ActiveWindow.Selection
var pagecount = l_doc.BuiltInDocumentProperties.Item(
(wps.Enum && wps.Enum.wdPropertyPages) || 14
) //获取文档页数
// 表达式.GoTo(What, Which, Count, Name)?
// 名称 必选/可选 数据类型 说明
// What 可选 Variant 范围要移动到的项的类别。可以是 WdGoToItem 常量之一。
// Which 可选 Variant 范围要移动到的项。可以是 WdGoToDirection 常量之一。
// Count 可选 Variant 文档中的项数。默认值为 1。只有正值有效。若要指定一个位于该范围之前的项,可将 wdGoToPrevious 用作 Which 参数,并指定一个 Count 值。
// // Name 可选 Variant 如果 What 参数为 wdGoToBookmark、wdGoToComment、wdGoToField 或 wdGoToObject,则此参数指定一个名称。只有正值有效。若要指定一个位于该范围之前的项,可将 wdGoToPrevious 用作 Which 参数,并指定一个 Count 值。
getEcode(documentId)
.then(res => {
try {
let result = JSON.parse(res)
alert(result.message)
} catch (error) {
console.log('获取二维码error信息', error)
let l_shapeQR = wps
.WpsApplication()
.ActiveDocument.Shapes.AddBase64Picture(res)
l_shapeQR.ConvertToInlineShape()
selection.SetRange(0, 1)
selection.Cut()
selection.GoTo(
(wps && wps.wdGoToPage) || 1,
(wps && wps.wdGoToAbsolute) || 1,
pagecount.Value
) //将光标指向文档最后一页
selection.Paste()
let pictrue = l_doc.InlineShapes.Item(1).ConvertToShape()
// l_shapeQR.ConvertToShape() //类型转换:嵌入型图片->粘贴版型图片
pictrue.Visible = true
pictrue.Select()
pictrue.RelativeHorizontalPosition =
(wps.Enum && wps.Enum.wdRelativeHorizontalPositionPage) || 1
pictrue.RelativeVerticalPosition =
(wps.Enum && wps.Enum.wdRelativeVerticalPositionPage) || 1
pictrue.Left = 400 //设置指定形状或形状范围的垂直位置(以磅为单位)。
pictrue.Top = 700 //指定形状或形状范围的水平位置(以磅为单位)
}
})
.catch(error => {
console.log('服务器获取公文二维码', error)
alert('访问服务器获取公文二维码失败,无法进行加码操作!请稍后再试')
})
}
设置文档参数
function insertParams(OAParams) {
var l_doc //文档对象
l_doc = wps.WpsApplication().ActiveDocument
if (!l_doc) {
return
}
wps.PluginStorage.setItem(l_doc.DocID, JSON.stringify(OAParams.otherParam))
}
获取文档参数
/**
* 根据传入Document对象,获取OA传入的参数的某个Key值的Value
* @param {*} Doc
* @param {*} Key
* 返回值:返回指定 Key的 Value
*/
function GetDocParamsValue(Doc, Key) {
if (!Doc) {
return ''
}
var l_Params = wps.PluginStorage.getItem(Doc.DocID)
if (!l_Params) {
return ''
}
var l_objParams = JSON.parse(l_Params)
if (typeof l_objParams == 'undefined') {
return ''
}
var l_rtnValue = l_objParams[Key]
if (typeof l_rtnValue == 'undefined' || l_rtnValue == null) {
return ''
}
return l_rtnValue
}
获取和设置加载项名称
function OnGetLabel(control) {
const eleId = control.Id
switch (eleId) {
case 'btnIsEnbable': {
let bFlag = wps.PluginStorage.getItem('EnableFlag')
return bFlag ? '按钮Disable' : '按钮Enable'
}
case 'btnApiEvent': {
let bFlag = wps.PluginStorage.getItem('ApiEventFlag')
return bFlag ? '清除新建文件事件' : '注册新建文件事件'
}
}
return ''
}
设置是否显示加载项
function OnGetVisible(control) {
const eleId = control.Id
console.log(eleId)
return true
}
设置加载项是否可点击
function OnGetEnabled(control) {
const eleId = control.Id
switch (eleId) {
case 'btnShowMsg':
return true
case 'btnShowDialog': {
let bFlag = wps.PluginStorage.getItem('EnableFlag')
return bFlag
}
case 'btnShowTaskPane': {
let bFlag = wps.PluginStorage.getItem('EnableFlag')
return bFlag
}
default:
break
}
return true
}
操作公文域
/**
* @desc 切换公文域显示形式(0不显示,1.显示全部公文域标记,2.只显示公文域两边红线不显示文字红色底纹)
*/
function changeFieldStyle() {
if (
typeof wps.WpsApplication().ActiveDocument.ShowDocumentFieldTarget ==
'undefined'
) {
wps
.WpsApplication()
.ActiveDocument.GetDocumentEx().ShowDocumentFieldTarget = !wps
.WpsApplication()
.ActiveDocument.GetDocumentEx().ShowDocumentFieldTarget //隐藏公文域底纹
} else {
wps.WpsApplication().ActiveDocument.ShowDocumentFieldTarget = !wps.WpsApplication()
.ActiveDocument.ShowDocumentFieldTarget //隐藏公文域底纹
}
}
/**
* @desc 删除公文域(注意:只是删除公文域,不影响文档的文字内容)
* @param name 公文域名称
*
*/
function deleteMainDocField(name) {
try {
var app, field
app = wps.WpsApplication()
field = app.ActiveDocument.DocumentFields.Item(name)
field.Delete()
} catch (error) {
console.log(error.message)
}
}
/**
* @desc 删除公文域内容(注意:影响文档的文字内容)
* @param name 公文域名称
*
*/
function deleteMainDocFieldContent(name) {
try {
var app, field
app = wps.WpsApplication()
field = app.ActiveDocument.DocumentFields.Item(name)
field.Range.Text = ''
} catch (error) {
console.log(error.message)
}
}
/**
* 轮询插入公文域内容
* @param {Object} params
*/
function fillFieldContent(params) {
try {
Object.keys(params).forEach(element => {
let app = wps.WpsApplication()
let doc = app.ActiveDocument
let field = doc.DocumentFields.Item(element)
if (field) {
field.Value = params[element]
}
})
} catch (error) {
console.log(error)
}
}
export {
changeFieldStyle,
deleteMainDocField,
deleteMainDocFieldContent,
fillFieldContent,
}
操作表格
/**
* @description 获取单元格内文本信息
* @param {Number} tableIndex 当前是第几个表格 从1开始计数
* @param {Number} row 行 从1开始计数
* @param {Number} column 列 从1开始计数
* @returns {String} 当前表格某个单元格内的文本
*/
function getCellText(tableIndex, row, column) {
var l_Doc = wps.WpsApplication().ActiveDocument
if (!l_Doc) {
return ''
}
//动态获取表格中某个单元格中信息
//获取当前需要修改的行信息
let table = l_Doc.Tables.Item(tableIndex)
if (!table) {
return ''
}
let rowDate = table.Rows.Item(row)
//获取单元格
let cell = rowDate.Cells.Item(column)
//获取内容
let text = cell.Range.Text
return text || ''
//copy
// cell.Range.Copy()
}
/**
* @description 设置单元格内文本信息
* @param {Number} tableIndex 当前是第几个表格 从1开始计数
* @param {Number} row 行 从1开始计数
* @param {Number} column 列 从1开始计数
* @param {String} text
*
*/
function setCellText(tableIndex, row, column, text) {
var l_Doc = wps.WpsApplication().ActiveDocument
if (!l_Doc) {
return ''
}
//动态获取表格中某个单元格中信息
//获取当前需要修改的行信息
let table = l_Doc.Tables.Item(tableIndex)
if (!table) {
return ''
}
let rowDate = table.Rows.Item(row)
//获取单元格
let cell = rowDate.Cells.Item(column)
// if (text.charAt(text.length - 1) === '') {
// text.slice(0, text.length - 1)
// }
cell.Range.Text = text
}
/**
* @desc 光标出插入表格
*/
function insertTable(rowNum, colNum) {
try {
var app = wps.WpsApplication()
app.ActiveDocument.Tables.Add(app.Selection.Range, rowNum, colNum)
} catch (error) {
alert(error.message)
}
}
/**
* @desc 设置表格边框样式
*/
function setTableStyle() {
try {
var app,
table = null,
borders,
border
app = wps.WpsApplication()
table = app.ActiveDocument.Tables.Item(1)
if (null == table) {
alert('请先插入表格')
return
}
borders = table.Borders
border = borders.Item(
-1
) /* -1为WdBorderType枚举 wdBorderTop 上框线,以下都是改类型枚举值*/
border.LineStyle = 1 /* 1为WdLineStyle枚举 wdLineStyleSingle 单实线 */
border.LineWidth = 4 /* 4为WdLineWidt枚举 wdLineWidth050pt 0.50磅 */
border.Color = 255 /* 255为RGB颜色值 */
border = borders.Item(-3)
border.LineStyle = 1
border.LineWidth = 4
border.Color = 255
border = borders.Item(-5)
border.LineStyle = 1
border.LineWidth = 4
border.Color = 255
border = borders.Item(-6)
border.LineStyle = 1
border.LineWidth = 4
border.Color = 255
border = borders.Item(-2)
border.LineStyle = 1
border.LineWidth = 4
border.Color = 255
border = borders.Item(-4)
border.LineStyle = 1
border.LineWidth = 4
border.Color = 255
} catch (error) {
alert(error.message)
}
}
/**
* @desc 合并单元格
*/
function mergeCell() {
try {
var app,
table = null
app = wps.WpsApplication()
table = app.ActiveDocument.Tables.Item(1)
if (null == table) {
alert('请先插入表格')
return
}
table.Cell(1, 2).Merge(table.Cell(1, 3))
table.Cell(2, 2).Merge(table.Cell(2, 3))
table.Cell(4, 1).Merge(table.Cell(4, 2))
table.Cell(4, 1).Merge(table.Cell(4, 2))
} catch (error) {
alert(error.message)
}
}
// 复制当前行 并粘贴到下一行
function copyRowInsertBelow(row) {
try {
var app,
table = null
app = wps.WpsApplication()
table = app.ActiveDocument.Tables.Item(1)
if (null == table) {
alert('请先插入表格')
return
}
table.Rows.Item(row).Range.Select()
var selection = app.ActiveWindow.Selection
selection.InsertRowsBelow(1)
} catch (error) {
alert(error.message)
}
}
export {
getCellText,
setCellText,
insertTable,
mergeCell,
setTableStyle,
copyRowInsertBelow,
}
动态生成树形目录
/**
* @description 动态生成目录结构
* @returns
*/
function OnUploadFileListClick() {
var l_Doc = wps.WpsApplication().ActiveDocument
if (!l_Doc) {
return
}
var selection = wps.WpsApplication().ActiveWindow.Selection
//只能识别目录
selection.Range.GetRangeEx()
.GetHeadings()
.SmartToRecognize()
var count = wps
.WpsApplication()
.ActiveDocument.Content.GetRangeEx()
.GetHeadings().Count
//轮询生成树形结构
let TitleTree = []
for (let index = 1; index < count + 1; index++) {
let treeItem = {
text: wps
.WpsApplication()
.ActiveDocument.Content.GetRangeEx()
.GetHeadings()
.Item(index).Text,
children: [],
}
let TitleTreeObj = TitleTree
for (
let j = 0;
j <
wps
.WpsApplication()
.ActiveDocument.Content.GetRangeEx()
.GetHeadings()
.Item(index).Level -
1;
j++
) {
TitleTreeObj = TitleTreeObj[TitleTreeObj.length - 1].children
}
TitleTreeObj.push(treeItem)
// }
}
console.log(TitleTree)
}
获取当前时间
function currentTime() {
var now = new Date()
var year = now.getFullYear() //年
var month = now.getMonth() + 1 //月
var day = now.getDate() //日
var hh = now.getHours() //时
var mm = now.getMinutes() //分
var clock = year + '年'
if (month < 10) clock += '0'
clock += month + '月'
if (day < 10) clock += '0'
clock += day + '日'
if (hh < 10) clock += '0'
clock += hh + ':'
if (mm < 10) clock += '0'
clock += mm
return clock
}
填充模板功能
/**
* @description 填充模板功能
*/
function OnfillTemplateClick() {
//1.获取当前打开的文档
var l_Doc = wps.WpsApplication().ActiveDocument
if (!l_Doc) {
return
}
let params = []
Util.ajaxPost(ADD_TEMPLETE_DATA, {
postData: JSON.stringify({
data: [
{
vtype: 'attr',
name: 'bgq',
data: '2200-03',
},
],
}),
})
.then(res => {
params = res.data[0].data
})
.catch(() => {
alert('获取模板数据失败')
})
.finally(() => {
for (let index = 0; index < params.length; index++) {
const element = params[index]
//2. 获取书签对象
console.log(element)
let Bookmarks = l_Doc.Bookmarks
if (Bookmarks.Exists(element.name) == true) {
Bookmarks.Item(element.name).Range.Text = element.text
}
}
})
}
工作底稿需求
//******** */
//*************============工作底稿 start===========********************
//******** */
/**
* @description 同步工作底稿表头
*/
function syncWorkPaper() {
let tableResult = StructuredWorkPaper()
let params = [ { row: 1, column: 2, table: 1, label: '项目名称', }, { row: 2, column: 2, table: 1, label: '审计事项', }, { row: 3, column: 2, table: 1, label: '审计人员', }, { row: 3, column: 4, table: 1, label: '编制日期', }, ]
for (let index = 0; index < params.length; index++) {
const element = params[index]
let tableIndex = element.table + 1
let count = wps.WpsApplication().ActiveDocument.Tables.Count
while (tableIndex <= count) {
setCellText(
tableIndex,
element.row,
element.column,
tableResult[element.label]
)
tableIndex++
}
}
}
/**
* @description 工作底稿结构化
* @returns 结构化数据
*/
function StructuredWorkPaper() {
let params = [ { row: 1, column: 2, table: 1, label: '项目名称', }, { row: 2, column: 2, table: 1, label: '审计事项', }, { row: 3, column: 2, table: 1, label: '审计人员', }, { row: 3, column: 4, table: 1, label: '编制日期', }, { row: 5, column: 1, table: 1, label: '审计认定的事实摘要及审计结论', }, ]
let result = {}
for (let index = 0; index < params.length; index++) {
const element = params[index]
let text = getCellText(element.table, element.row, element.column)
// console.log(
// text,
// '+++++++++++++++',
// text.charAt(text.length - 1),
// text.charAt(text.length - 1) === ''
// )
if (text.charAt(text.length - 1) === '') {
text.slice(0, text.length - 1)
}
// console.log(text, '当前的')
if (element.label === '审计认定的事实摘要及审计结论') {
let tableIndex = element.table + 1
let count = wps.WpsApplication().ActiveDocument.Tables.Count
while (tableIndex <= count) {
let str = getCellText(
tableIndex,
element.row - 1,
element.column
)
text += str.substring(15, str.length)
tableIndex++
}
}
result[element.label] = text
}
console.log(result)
return result
}
会议纪要需求
//******** */
//*************============会议纪要 start===========********************
//******** */
/**
* @description 删除会议纪要内容 = 拆分会议纪要的需求
*/
function splitMeeting() {
//1. 复制多分文档
let map = ['title', 'result', 'content', 'warning']
for (let index = 0; index < map.length; index++) {
const element = map[index]
// let count = 2
deleteMainDocFieldContent(element + '1')
//删除文档中多余内容
deleteMainDocField(element + '1')
}
//删除段落
// wps.WpsApplication().ActiveDocument.Range(201, 201).StartOf(wdCharacter, wdExtend);
//客户确认并保存
}
/**
* @description 会议纪要 获取所有公文域的内容,并转化成后台需要的数据
*/
function getBookMarksConent() {
try {
var app, doc, DocumentFields
let meeting = {
id: 'm001', // 传 id 就是修改,不传 id 就是新增。
meetingId: 'm001', // 会议 id
summaryName: '会议纪要名称', // 会议纪要名称
yearNo: '年号', // 年号
phaseNo: '期号', // 期号
groupMeetingOrg: '组会单位', // 组会单位
overview: '会议综述', // 会议综述
host: '会议主持人', // 会议主持人
stress: '会议强调', // 会议强调
attendants: '会议出席人', // 会议出席人
commonAttendants: '会议列席人', // 会议列席人
}
let json = {
meetingSummaryId: 'm001', // 会议纪要 id
projectData: [],
}
let obj = {}
app = wps.WpsApplication()
doc = app.ActiveDocument
DocumentFields = doc.DocumentFields
for (var i = 1; i <= DocumentFields.Count; ++i) {
let name = DocumentFields.Item(i).Name
let content = DocumentFields.Item(i).Range.Text
if (meeting[name]) {
meeting[name] = content
} else {
obj[name] = content
}
}
let keys = Object.keys(obj)
for (let j = 0; j < keys.length; j++) {
if (obj['pName' + j]) {
let objAppend = {
pName: obj['pName' + j],
decisionContent: obj['decisionContent' + j],
}
json.projectData.push(objAppend)
keys.splice(keys.indexOf('pName' + j, 1))
keys.splice(keys.indexOf('decisionContent' + j, 1))
}
}
console.log(meeting, json)
saveMeetingContent(json)
saveMeetingContentHeader(meeting)
} catch (error) {
alert(error.message)
}
}
数科预览
添加水印的操作
//添加图片水印的操作
var json =
'{"image":"' +
res +
'","vflag":"top","hflag":"left","pos-x":"10","pos-y":"10","rotate":"0","gray":"false","scale":"100","range":"all"}';
ocx.addWaterImageAnnot(json);
//运行时添加水印的操作,保存时不会携带水印,打印时可以携带水印
// ocx.addTrackInfo(
// '<setinfo type="barinfo"><parameter name="pages" value="1"/><parameter name="rotate" value="0"/><parameter name="visible" value="true"/><parameter name="printable" value="true"/><parameter name="xpostype" value="absolute"/><parameter name="ypostype" value="absolute"/><parameter name="x" value="145"/><parameter name="y" value="265"/><parameter name="w" value="49"/><parameter name="h" value="27"/><parameter name="content">' +
// res +
// "</parameter></setinfo>"
// );
//添加水印的操作
// ocx.addWaterMakerAnnot(
// '<setinfo type="annotinfo"><parameter name="type" value="watermark"/><parameter name="range" value="1-12"/><parameter name="rotate" value="0"/><parameter name="xpostype" value="left"/><parameter name="ypostype" value="top"/><parameter name="x" value="145"/><parameter name="y" value="265"/><parameter name="w" value="49"/><parameter name="h" value="27"/><parameter name="alpha" value="128"/><parameter name="imgcont">"' +
// res +
// '"</parameter></setinfo>"
// );