wps加载项应用:web端填写之后,js快速生成word文件-编辑之后本地上传

3,603 阅读11分钟

wps加载项开发(一)

wps加载项的特点

  1. 完整的功能。可通过多种不同的方法对文档、电子表格和演示文稿进行创作、格式设置和操控;通过鼠标、键盘执行的操作几乎都能通过WPS 加载项 完成;可以轻松地执行重复任务,实现自动化;
  2. 三种交互方式。 [自定义功能区](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),结合事件监听,实现自由交互。
  3. 标准化集成。不影响 JavaScript 语言特性,网页运行效果和在浏览器中完全一致;WPS 加载项开发文档完整,接口设计符合 JavaScript 语法规范,避免不必要的学习成本,缩短开发周期。

如何新建一个wps加载项

  1. 安装命令: npm install -g wpsjs, 如果之前已经安装了,可以检查下wpsjs版本,更新wpsjs的命令为:npm update -g wpsjs
  2. wpsjs create HelloWps
  3. 开始调试并愉快的写代码 执行命令: 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…

    • getImagegetImage回调):指定要用来确定此控件图标的回调函数的名称。

任务窗格

任务窗格是一个用来浏览网页的用户界面面板,通常停靠在 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>"
          // );