/** * 从OA调用传来的指令,打开本地新建文件 * @param {*} fileUrl 文件url路径 */ function NewFile(params) { //获取ET Application 对象 var etApp = wps.EtApplication() wps.PluginStorage.setItem('IsInCurrOADocOpen', true) //设置OA打开文档的临时状态 var doc = etApp.Workbooks.Add() //新增OA端文档 wps.PluginStorage.setItem('IsInCurrOADocOpen', false) //检查系统临时文件目录是否能访问 if (wps.Env && wps.Env.GetTempPath) { if (params.newFileName) { //按OA传入的文件名称保存 doc.SaveAs( ($FileName = wps.Env.GetTempPath() + '/' + params.newFileName), undefined, undefined, undefined, undefined, undefined, undefined, undefined, false ) } else { //OA传入空文件名称,则保存成系统时间文件 doc.SaveAs( ($FileName = wps.Env.GetTempPath() + '/OA_' + currentTime()), undefined, undefined, undefined, undefined, undefined, undefined, undefined, false ) } } else { alert('文档保存临时目录出错!不能保存新建文档!请联系系统开发商。') } var l_NofityURL = GetParamsValue(params, 'notifyUrl') if (l_NofityURL) { NotifyToServer(l_NofityURL.replace('{?}', '1')) } //Office文件打开后,设置该文件属性:从服务端来的OA文件 pSetOADocumentFlag(doc, params) //设置当前文档为 本地磁盘落地模式 DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc) //强制执行一次Activate事件 OnWindowActivate() return doc //返回新创建的Document对象 } /** * 打开服务器上的文件 * @param {*} fileUrl 文件url路径 */ function OpenFile(params) { var l_strFileUrl = params.fileName //来自OA网页端的OA文件下载路径 var doc var l_IsOnlineDoc = false //默认打开的是不落地文档 if (!l_strFileUrl) return //下载文档之前,判断是否已下载该文件 if (pCheckIsExistOpenOADoc(l_strFileUrl) == true) { //如果找到相同OA地址文档,则给予提示 wps.EtApplication().Visible = true //根据OA助手对是否允许再次打开相同文件的判断处理 var l_AllowOADocReOpen = false l_AllowOADocReOpen = wps.PluginStorage.getItem('AllowOADocReOpen') if (l_AllowOADocReOpen == false) { alert('已打开相同的OA文件,请关闭之前的文件,再次打开。') wps.EtApplication().Visible = true return null } else { //处理重复打开相同OA 文件的方法 var nDocCount = wps.EtApplication().Workbooks.Count pReOpenOADoc(l_strFileUrl) //重复打开的文档采用不落地的方式打开 // 不落地方式打开文档判断落地比较多,V1版本先暂时关闭 l_IsOnlineDoc = true var nDocCount_New = wps.EtApplication().Workbooks.Count if (nDocCount_New > nDocCount) { doc = wps.EtApplication().ActiveWorkbook } } } else { //如果当前没有打开文档,则另存为本地文件,再打开 let fileName = GetFileNameByParams(params) DownloadFile( l_strFileUrl, fileName, params.action == 'printdocument' //打印文档操作保存随机路径 ) .then(function (path) { if (path == '') { ShowMessage( '从服务端下载路径:' + l_strFileUrl + '\n' + '获取文件下载失败!', 'error' ) return null } doc = pDoOpenOADocProcess(params, path) pOpenFile(doc, params, l_IsOnlineDoc) }) .catch((msg) => { ShowMessage(`下载文件[${fileName}]失败!${msg}`, 'error', 5) OAWebNotice(fileName) }) } } function pOpenFile(doc, params, isOnlineDoc) { var l_IsOnlineDoc = isOnlineDoc //设置当前文档为 本地磁盘落地模式 if (l_IsOnlineDoc == true) { DoSetOADocLandMode(doc, EnumDocLandMode.DLM_OnlineDoc) } else { DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc) } var l_ProtectType = -1 if (!!params.openType && params.openType.hasOwnProperty('protectType')) l_ProtectType = params.openType.protectType var l_bShowRevision = getBoolean(params.fileparam.UseMark, true) //是否显示修订记录 if (l_ProtectType < 2 && params.action !== 'printdocument') { //可编辑和非打印模式下才设置心跳 //设定心跳值 Heart.OpendOADocument(doc) } //设置文档修订状态 DoOADocOpenRevision(doc, l_ProtectType == 0, l_bShowRevision) var ps = GetDocParamsValues(doc) ps[constStrEnum.OriginalRsid] = ps[constStrEnum.CurrentRsid] SetDocParamsValues(doc, ps) // 触发切换窗口事件 OnWindowActivate() return doc } function DoOADocOpenRevision(doc, bOpenRevision, bShowRevision) { if (!doc) return if (bOpenRevision) { wps.Application.DisplayAlerts = false doc.SaveAs( doc.FullName, undefined, undefined, undefined, undefined, undefined, 2 ) doc.KeepChangeHistory = true if (bShowRevision) { doc.HighlightChangesOptions(2, '每个人') doc.ListChangesOnNewSheet = false // doc.HighlightChangesOnScreen = true } wps.Application.DisplayAlerts = true } } /** * 文档打开服务器上的文件 * @param {*} fileUrl 文件url路径 */ function OpenOnLineFile(OAParams) { //OA参数如果为空的话退出 if (!OAParams) return //获取在线文档URL var l_OAFileUrl = OAParams.fileName var l_doc if (l_OAFileUrl) { //下载文档不落地(16版WPS的925后支持) wps.PluginStorage.setItem('IsInCurrOADocOpen', true) wps .EtApplication() .Workbooks.OpenFromUrl( l_OAFileUrl, 'OnOpenOnLineDocSuccess', 'OnOpenOnLineDocDownFail' ) wps.PluginStorage.setItem('IsInCurrOADocOpen', false) l_doc = wps.EtApplication().ActiveWorkbook } //Office文件打开后,设置该文件属性:从服务端来的OA文件 pOpenFile(l_doc, OAParams, true) return l_doc } /** * 打开在线文档成功后触发事件 * @param {*} resp */ function OnOpenOnLineDocSuccess(resp) {} /** * 作用:打开文档处理的各种过程,包含:打开带密码的文档,保护方式打开文档,修订方式打开文档等种种情况 * params Object OA Web端传来的请求JSON字符串,具体参数说明看下面数据 * TempLocalFile : 字符串 先把文档从OA系统下载并保存在Temp临时目录,这个参数指已经下载下来的本地文档地址 * ----------------------以下是OA参数的一些具体规范名称 * docId String 文档ID * uploadPath String 保存文档接口 * fileName String 获取服务器文档接口(不传即为新建空文档) * userName String 用于更改显示修改人的用户名 * buttonGroups string 自定义按钮组 (可不传,不传显示所有按钮) * openType String 文档打开方式 ,不传正常打开 * protectType bool 文档保护类型,false或是未定义为不启用保护,其他为启用 * password String密码 */ var gettokenid = false function pDoOpenOADocProcess(params, TempLocalFile) { var l_ProtectPassword = '6TFC$RGB' //默认文档密码为空 var l_strDocPassword = '' //打开文档密码参数 for (var _key in params) { var key = (_key || '').toUpperCase() switch (key) { case 'userName'.toUpperCase(): //修改当前文档用户名 wps.EtApplication().UserName = params[_key] break // case 'openType'.toUpperCase(): // l_ProtectType = params[_key].protectType //获取OA传来的文档保护类型 // // l_ProtectPassword = params[_key].password //获取OA传来的保护模式下的文档密码 // break case 'docPassword'.toUpperCase(): //传入打开文件的密码 l_strDocPassword = params[_key].docPassword break } } var l_Doc = wps .EtApplication() .Workbooks.Open(TempLocalFile, false, false, undefined, l_strDocPassword) var l_Count = 0 for (l_Count = 0; l_Count < l_Doc.Worksheets.Count; l_Count++) { l_Doc.Worksheets.Item(l_Count + 1).Unprotect(l_ProtectPassword) } //处理另存为 var Persist = getBoolean(params.fileparam.AllowSaveAs, true) var ps = Object.assign( { isOA: EnumOAFlag.DocFromOA, SourcePath: l_Doc.FullName, TempLocalFile, Persist, }, params ) var l_ProtectType = -1 if (!!params.openType && params.openType.hasOwnProperty('protectType')) l_ProtectType = params.openType.protectType //打开文档后,根据保护类型设置文档保护 if (l_ProtectType == 2 || l_ProtectType == 1) { // 设置文档保护 SetOADocProtect(l_Doc, l_ProtectPassword) } l_Doc.Save() SetDocParamsValues(l_Doc, ps) return l_Doc } /** * protectType: '', 文档保护模式 * @param {*} ProtectPassword * @param {*} doc */ function SetOADocProtect(doc, ProtectPassword) { if (!doc) return //校验文档是否存在 for (l_Count = 0; l_Count < doc.Worksheets.Count; l_Count++) { doc.Worksheets.Item(l_Count + 1).Protect(ProtectPassword) } return } /** * 打开在线不落地文档出现失败时,给予错误提示 */ function OnOpenOnLineDocDownFail() { alert('打开在线不落地文档失败!请尝试重新打开。') return } /** * 功能说明:判断是否已存在来自OA的已打开的文档 * @param {字符串} FileURL */ function pCheckIsExistOpenOADoc(FileURL) { var l_DocCount = wps.EtApplication().Workbooks.Count if (l_DocCount <= 0) return false //轮询检查当前已打开的WPS文档中,是否存在OA相同的文件 if (l_DocCount >= 1) { for (var l_index = 1; l_index <= l_DocCount; l_index++) { var l_objDoc = wps.EtApplication().Workbooks.Item(l_index) var l_strParam = wps.PluginStorage.getItem(l_objDoc.FullName) if (l_strParam == null) continue var l_objParam = JSON.parse(l_strParam) if (l_objParam.fileName == FileURL) { return true } } return false } } /** * 参数: * doc : 当前OA文档的Document对象 * DocLandMode : 落地模式设置 */ function DoSetOADocLandMode(doc, DocLandMode) { if (!doc) return var l_Param = wps.PluginStorage.getItem(doc.FullName) var l_objParam = JSON.parse(l_Param) //增加属性,或设置 l_objParam.OADocLandMode = DocLandMode //设置OA文档的落地标志 var l_p = JSON.stringify(l_objParam) //将OA文档落地模式标志存入系统变量对象保存 wps.PluginStorage.setItem(doc.FullName, l_p) } //Office文件打开后,设置该文件属性:从服务端来的OA文件 function pSetOADocumentFlag(doc, params) { if (!doc) { return } var l_Param = params l_Param.isOA = EnumOAFlag.DocFromOA //设置OA打开文档的标志 l_Param.SourcePath = doc.FullName //保存OA的原始文件路径,用于保存时分析,是否进行了另存为操作 if (doc) { var l_p = JSON.stringify(l_Param) //将OA文档标志存入系统变量对象保存 wps.PluginStorage.setItem(doc.FullName, l_p) } } /** * 作用:设置Ribbon工具条的按钮显示状态 * @param {*} paramsGroups */ function pDoResetRibbonGroups(paramsGroups) {}