From e64a8e9bc58b3143b73db884f18cf1bf3f51e79f Mon Sep 17 00:00:00 2001 From: woni <320753691@qq.com> Date: Sat, 12 Apr 2025 10:55:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=8F=92=E4=BB=B6=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- py-et/.vscode/settings.json | 8 + py-et/README | 1 + py-et/invoke-et.py | 12 - py-et/src/ET.py | 46 ++ py-et/src/__pycache__/ET.cpython-313.pyc | Bin 0 -> 2872 bytes py-et/src/__pycache__/client.cpython-313.pyc | Bin 0 -> 17591 bytes py-et/{ET.py => src/client.py} | 178 +++-- py-et/{ => src}/et.js | 0 .../test_client.cpython-313-pytest-8.3.5.pyc | Bin 0 -> 8777 bytes .../test_et.cpython-313-pytest-8.3.5.pyc | Bin 0 -> 5317 bytes .../test_xx.cpython-313-pytest-8.3.5.pyc | Bin 0 -> 4452 bytes py-et/tests/test_client.py | 70 ++ py-et/tests/test_et.py | 39 ++ xbot-et/wps-addon-build/xbot-et.7z | Bin 3354 -> 3658 bytes .../wps-addon-build/xbot-et_1.0.0/README.md | 1 + .../xbot-et_1.0.0/images/about.svg | 1 + .../xbot-et_1.0.0/images/newFromTemp.svg | 22 + .../wps-addon-build/xbot-et_1.0.0/index.html | 6 + .../xbot-et_1.0.0/js/ribbon.js | 43 ++ .../wps-addon-build/xbot-et_1.0.0/js/util.js | 19 + .../wps-addon-build/xbot-et_1.0.0/js/xbot.js | 64 ++ xbot-et/wps-addon-build/xbot-et_1.0.0/main.js | 4 + .../wps-addon-build/xbot-et_1.0.0/ribbon.xml | 15 + .../xbot-et_1.0.0/ui/author.html | 31 + xbot-et/wps-addon-publish/publish.html | 628 ++++++++++++++++++ xbot-et/wps-addon-publish/xbot-et.7z | Bin 0 -> 3658 bytes 26 files changed, 1111 insertions(+), 77 deletions(-) create mode 100644 py-et/.vscode/settings.json create mode 100644 py-et/README delete mode 100644 py-et/invoke-et.py create mode 100644 py-et/src/ET.py create mode 100644 py-et/src/__pycache__/ET.cpython-313.pyc create mode 100644 py-et/src/__pycache__/client.cpython-313.pyc rename py-et/{ET.py => src/client.py} (75%) rename py-et/{ => src}/et.js (100%) create mode 100644 py-et/tests/__pycache__/test_client.cpython-313-pytest-8.3.5.pyc create mode 100644 py-et/tests/__pycache__/test_et.cpython-313-pytest-8.3.5.pyc create mode 100644 py-et/tests/__pycache__/test_xx.cpython-313-pytest-8.3.5.pyc create mode 100644 py-et/tests/test_client.py create mode 100644 py-et/tests/test_et.py create mode 100644 xbot-et/wps-addon-build/xbot-et_1.0.0/README.md create mode 100644 xbot-et/wps-addon-build/xbot-et_1.0.0/images/about.svg create mode 100644 xbot-et/wps-addon-build/xbot-et_1.0.0/images/newFromTemp.svg create mode 100644 xbot-et/wps-addon-build/xbot-et_1.0.0/index.html create mode 100644 xbot-et/wps-addon-build/xbot-et_1.0.0/js/ribbon.js create mode 100644 xbot-et/wps-addon-build/xbot-et_1.0.0/js/util.js create mode 100644 xbot-et/wps-addon-build/xbot-et_1.0.0/js/xbot.js create mode 100644 xbot-et/wps-addon-build/xbot-et_1.0.0/main.js create mode 100644 xbot-et/wps-addon-build/xbot-et_1.0.0/ribbon.xml create mode 100644 xbot-et/wps-addon-build/xbot-et_1.0.0/ui/author.html create mode 100644 xbot-et/wps-addon-publish/publish.html create mode 100644 xbot-et/wps-addon-publish/xbot-et.7z diff --git a/py-et/.vscode/settings.json b/py-et/.vscode/settings.json new file mode 100644 index 0000000..728e7f9 --- /dev/null +++ b/py-et/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.testing.autoTestDiscoverOnSaveEnabled": true, +} diff --git a/py-et/README b/py-et/README new file mode 100644 index 0000000..8e9c8a9 --- /dev/null +++ b/py-et/README @@ -0,0 +1 @@ +# WPS 表格自动化(插件版) diff --git a/py-et/invoke-et.py b/py-et/invoke-et.py deleted file mode 100644 index 4952359..0000000 --- a/py-et/invoke-et.py +++ /dev/null @@ -1,12 +0,0 @@ -from ET import ET - -if __name__ == "__main__": - - et1 = ET() - sheets_name = et1.get_sheets() - print(f"et1: {sheets_name}") - - et2 = ET() - et2.workbook_name = "工作簿2" - sheets_name = et2.get_sheets() - print(f"et2:{sheets_name}") diff --git a/py-et/src/ET.py b/py-et/src/ET.py new file mode 100644 index 0000000..3079539 --- /dev/null +++ b/py-et/src/ET.py @@ -0,0 +1,46 @@ +import os + + +from .client import Client + + +class ET(Client): + def __init__(self): + super().__init__() + self.workbook_name = "" # 用于判断当前打开的表格 + # self.check_addon_install() # 调试模式暂时不判断 + self.inject_flag = self._inject_js_code() + + def open(self, file_path): + """open et""" + pass + + def get_sheets(self) -> list: + """get all sheets""" + func = "getSheets" + sheets_name = self._wrap_invoke_func(func) + + return sheets_name + + def _wrap_invoke_func(self, func, args={}): + """将工作簿的名称自动带进去""" + if self.workbook_name: + args["workbook_name"] = self.workbook_name + res = self.invoke_func(func, args) + if res.get("code") != 0: + raise Exception(f"调用函数 {func} 失败, 错误信息: {res.get('msg')}") + return res.get("data") + + def _inject_js_code(self) -> bool: + """注入js脚本""" + current_path = os.path.abspath(__file__) + js_code_path = os.path.join(os.path.dirname(current_path), "et.js") + if not os.path.exists(js_code_path): + raise Exception(f"js code not found: {js_code_path}") + # 读取js代码 + with open(js_code_path, encoding="utf8") as f: + code = f.read() + func = "inject" + args = {"code": code} + res = self.invoke_func(func, args) + return res.get("code") == 0 diff --git a/py-et/src/__pycache__/ET.cpython-313.pyc b/py-et/src/__pycache__/ET.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9029fc0fa3915254793bb23a3971c4cc46113e9 GIT binary patch literal 2872 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 b!u{Wf`ZQ7hAyNOS`43IH%1;Ok#pnGW#2E@5 literal 0 HcmV?d00001 diff --git a/py-et/ET.py b/py-et/src/client.py similarity index 75% rename from py-et/ET.py rename to py-et/src/client.py index 38304f1..eb6b0ae 100644 --- a/py-et/ET.py +++ b/py-et/src/client.py @@ -1,22 +1,124 @@ -import base64 +import os +import sys import uuid import json -import http.client -import webbrowser -import os -import platform -import xml.dom.minidom as minidom -import sys -import shutil -import zipfile import time +import shutil +import base64 +import zipfile +import platform +import webbrowser +import logging + +logger = logging.getLogger(__file__) + +import http.client +import xml.dom.minidom as minidom + +from xml.etree import ElementTree class Client: def __init__(self): - self.addon_name = "XbotWps" + self.addon_name = "xbot-et" self.addon_type = "et" self.addon_version = "1.0.0" + self.url = "http://127.0.0.1:3889/" + self.start_http_server() + + def start_http_server(self) -> bool: + for _ in range(10): + if self._get_version(): + print("Wps server started") + return True + self._start_http_server() + time.sleep(1) + raise ("Wps server not started") + + def get_addon_list(self) -> list: + """获取插件列表""" + path = "/publishlist" + conn = http.client.HTTPConnection("127.0.0.1", 58890) + conn.request("GET", path, body="{}", headers={}) + response = conn.getresponse() + data = response.read() + conn.close() + json_data = json.loads(data.decode("utf-8")) + return json_data + + def verify_addon_status(self) -> bool: + """验证插件状态""" + url = self.url + "ribbon.xml" + data = {"method": "get", "url": url, "data": ""} + payload = base64.b64encode(json.dumps(data).encode("utf-8")).decode() + print(f"payload: {payload}") + conn = http.client.HTTPConnection("127.0.0.1", 58890) + conn.request("POST", "/redirect/runParams", payload, {}) + response = conn.getresponse() + data = response.read() + conn.close() + try: + root = ElementTree.fromstring(data) + # 检查根标签名是否包含 customUI(包含命名空间) + return root.tag.endswith("customUI") + except ElementTree.ParseError: + return False + + def enable_addon(self) -> bool: + """开启插件""" + data = { + "cmd": "enable", + "name": self.addon_name, + "url": self.url, + "addonType": "et", + "online": "true", + "time": int(time.time()), + } + path = "/deployaddons/runParams" + payload = base64.b64encode(json.dumps(data).encode("utf-8")).decode() + conn = http.client.HTTPConnection("127.0.0.1", 58890) + conn.request("POST", path, payload, {}) + response = conn.getresponse() + data = response.read() + conn.close() + return data.decode() == "OK" + + def disable_addon(self) -> bool: + """禁用插件""" + data = { + "cmd": "disable", + "name": self.addon_name, + "url": self.url, + "addonType": "et", + "online": "true", + "time": int(time.time()), + } + path = "/deployaddons/runParams" + payload = base64.b64encode(json.dumps(data).encode("utf-8")).decode() + conn = http.client.HTTPConnection("127.0.0.1", 58890) + conn.request("POST", path, payload, {}) + + response = conn.getresponse() + data = response.read() + conn.close() + return data.decode() == "OK" + + def is_client_running(self) -> bool: + """检查客户端是否运行""" + # --data-raw '{"app":"et"}' + path = "/isRunning" + data = { + "app": self.addon_type, + } + payload = json.dumps(data) + + conn = http.client.HTTPConnection("127.0.0.1", 58890) + conn.request("POST", path, payload, {}) + + response = conn.getresponse() + data = response.read() + conn.close() + return data.decode() == "Client is running." def invoke_func(self, func, args={}): @@ -35,7 +137,7 @@ class Client: xhr.send(JSON.stringify({{id: '{req_uui}', response: res}}));void(0" data = { - "name": "xbot-et", + "name": self.addon_name, "function": "var res = InvokeFromXbot", "info": info, "showToFront": True, @@ -95,26 +197,6 @@ class Client: print("Installation completed successfully.") - def check_addon_install(self): - """通过文件夹是否存在判断插件是否安装""" - install_dir = self._get_install_directory() - addon_name_with_version = f"{self.addon_name}_{self.addon_version}" - file_path = os.path.join(install_dir, addon_name_with_version) - - if os.path.exists(file_path): - return True - else: - return False - - def check_http_status(self): - for _ in range(10): - if self._get_version(): - print("Wps server started") - return - self._start_http_server() - time.sleep(1) - raise ("Wps server not started") - def _start_http_server(self): """start debug""" webbrowser.open("ksowpscloudsvr://start=RelayHttpServer") @@ -289,37 +371,3 @@ class Client: except Exception as e: print(f"Error extracting archive: {e}") return False - - -class ET(Client): - def __init__(self): - super().__init__() - self.workbook_name = "" # 用于判断当前打开的表格 - self.check_http_status() - # self.check_addon_install() # 调试模式暂时不判断 - self._inject_js_code() - - def open(self, file_path): - """open et""" - pass - - def get_sheets(self) -> list: - """get all sheets""" - func = "getSheets" - sheets_name = self._wrap_invoke_func(func) - return sheets_name - - def _wrap_invoke_func(self, func, args={}): - """将工作簿的名称自动带进去""" - if self.workbook_name: - args["workbook_name"] = self.workbook_name - return self.invoke_func(func, args) - - def _inject_js_code(self): - path = r"C:\Users\32075\OneDrive\文档\Code\RPA_Script\wps-js-extension\XbotWps\py-et\et.js" - with open(path, encoding="utf8") as f: - code = f.read() - func = "inject" - args = {"code": code} - res = self.invoke_func(func, args) - return res diff --git a/py-et/et.js b/py-et/src/et.js similarity index 100% rename from py-et/et.js rename to py-et/src/et.js diff --git a/py-et/tests/__pycache__/test_client.cpython-313-pytest-8.3.5.pyc b/py-et/tests/__pycache__/test_client.cpython-313-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0f505c076d15f2bb8c78df75b4901d36ed00b71 GIT binary patch literal 8777 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 0 + assert all(isinstance(addon, dict) for addon in addon_list) + # 遍历所有插件, 并输出 + for i, addon in enumerate(addon_list): + print(f"Addon {i}: {addon}") + print("First addon in list:", addon_list[0] if addon_list else "None") + print("Addon list test passed!") + + +def test_client_verify_addon_status(test_create_client): + """测试插件状态""" + client = test_create_client + print("Verifying addon status...") + status = client.verify_addon_status() + print(f"Addon status: {status}") + assert status is True, "Addon status is not verified successfully" + print("Addon status test passed!") + + +def test_client_enable_addon(test_create_client): + """测试启用插件""" + client = test_create_client + print("Enabling addon...") + status = client.enable_addon() + print(f"Addon enabled: {status}") + assert status is True, "Failed to enable addon" + print("Enable addon test passed!") + + +def test_client_disable_addon(test_create_client): + """测试禁用插件""" + client = test_create_client + print("Disabling addon...") + status = client.disable_addon() + print(f"Addon disabled: {status}") + assert status is True, "Failed to disable addon" + print("Disable addon test passed!") + +def test_client_is_client_running(test_create_client): + """测试客户端是否运行""" + client = test_create_client + print("Checking if client is running...") + is_running = client.is_client_running() + print(f"Client is running: {is_running}") + assert isinstance(is_running, bool), "Client running status is not a boolean" + print("Client running status test passed!") + +if __name__ == "__main__": + # Add direct test execution for better debugging + pass diff --git a/py-et/tests/test_et.py b/py-et/tests/test_et.py new file mode 100644 index 0000000..c959e55 --- /dev/null +++ b/py-et/tests/test_et.py @@ -0,0 +1,39 @@ +import pytest + +from src.ET import ET + + +@pytest.fixture(scope="module") +def test_create_client(): + """创建测试用的client""" + client = ET() + yield client + + +def test_et_check_inject(): + """测试注入""" + et = ET() + print("Injecting...") + assert et.inject_flag is True, "Injection failed" + print("Inject test passed!") + + +def test_et_get_sheets(): + """测试获取工作表""" + et = ET() + print("Getting sheets...") + sheets_name = et.get_sheets() + print(f"Retrieved {len(sheets_name)} sheets") + print(f"Sheets_name: {sheets_name}") + assert isinstance(sheets_name, list) + assert len(sheets_name) > 0 + assert all(isinstance(sheet, str) for sheet in sheets_name) + # 遍历所有工作表, 并输出 + for i, sheet in enumerate(sheets_name): + print(f"Sheet {i}: {sheet}") + print("First sheet in list:", sheets_name[0] if sheets_name else "None") + print("Get sheets test passed!") + + +if __name__ == "__main__": + pass diff --git a/xbot-et/wps-addon-build/xbot-et.7z b/xbot-et/wps-addon-build/xbot-et.7z index 6443525dd9175cabd535f8d664cdc7e074bba21b..dafc6e45cd8eba5aba8abfeb0ccb28925f91c202 100644 GIT binary patch delta 1999 zcmV;=2Qc`W8p<3cH+sCUCma9-@x!)h2Mz!L00000BLDyZ00000!|Md;;3B{budyYR z27hV|Gq@6L6LqOL8nrOxcXb!G^(`kK^z~zP4rZP(?HPc%;UfZ6h!dczWMF4o_x}P+ zXb~dcyO_IqYpZMgYA2*ar-@bo+Ui2l1^k;*+o3wUJBtYs1QLs#woV z7LK)(#3Ro;3L)g+YuTbhX?#yd@b46s=SwpXBwAXm?p=Q0D3zCa zmG5;&bPPwAT)xAN!o8@i*xrD)Jy>xR0GzO_d3Bcpw5wA=4orbyuM&||$Nn9uZy7shk9rB_@u6)r? z5K}x}u|lfM1X3?EI`L-pkxRGXvQasjXeF1_qsG0#Z_6j(FCn_JVFSZ0e)H!jLG+WcK2TB~Y~Dgq*YB zTgrlnjg^T*&7SWh*}nENr9c~7MO5b#&~p8LyLnNYT^Q6% zmsYPRCX=iU;~>fwhR^fNr{{IBC@@4VZEe#V<^&v=%PzTNnN|Phbbs=)e+snqcENx8 z$(7-Ule88ztGT~moUv|axcra0kT?E%u=~!QHfd1Wu7P5S_T?wL zdcBH+m#0Uk+OsrTfq%A@pv37oo&X*7by|bU5j>frjGG?Cg=K=8gK}|hs2v1eYbCE9 z9FuTlc?;+f^R-5C3Z6)0@2y4}_r^mSf^XkspHgapz!VPfV9~_s&gSPsM zWlF`BBtuD(F99-Di5yQ#y(!Kq6uc(o_%kAEzfxqpY{yaeR)3-;=~=6|m5$%=e?3Ym@|?#_R+4Rpb8emU91A%UpD{+sJLSlz8&fl`_29=;kZYuXbEeXFfNS;X+Eo z3+pwGPWx|}Co(uI*EYs^ppNEf&8%;5)NfNe55g^`ms?OD_6kUlKPm&@$@mDu4KpQ!yuGqgTJ6*DEM;cJ&7{-v0TB zqnIXdd;!kf0zTUn=-17kT5K=?004nA2d)p*wB>TwB-8%0a2BywqfXXnbm4K3KNTpy z8?)u#pAmYdf3O1=zejhiTu-M^f-c`)Ci^nFM|gi7y>7^${Yulmn@0nsLoZ)A2Km2e zpns|he|z(+$h~6#j9Gi0j$2TlcZpaE2E-Z_Bbn-SKn_jtKYNyXC>b5ZP_hmRs?!!b6uK`CP z%ndarQh=<0;d!A6`ZqHZHUCEs@!zx|v3~(X?%oP#v|a)C>`l2;MIg@qcN40HMV7uo zH3Ns#Ld0#*O6sYvv9KDWcnVh>(M2 zw6l%bJA=UmysX4f!Pm|6rALpbz;Zl|{hYta9$vivI+~@=4+j)xLPw7GYXBDpj3BoG h34u@m2MYlJ0V4we0R>$E5C8xSgU$*8i?$6H005Q$;~fA1 delta 1692 zcmV;N24nfk9GV&>H+sCUCma9-;}>C=*9-sv00000BLDyZ00000BLux-;2!}Cg0Ur( z27hDXE)tJ0N9zW5VP~!mORJ#KZaL*9_7^=1Ok&wjgBK-1LO?UT*j}3&pPcLm30i9p zEv`BAOb(V6bTBjH9>acupxW!%T8r!{@u32%jOJ&eOf6`N$xoIEuD<(kII(W8NjrHLp`#LKpPJ%74(O zZov!&l0vi|oXMKFrV^<q^}$n7l?M_7esG;#F8Scqs1JiEOmqbK}w^Z5UPb3M54! z_!2I}Q-VTLzc+mYJ+Zw;*t5!yL0(%>I z-)=r#8=453%36zCL?h^}`YEx5Ie&SfZJvx&mlqAw6gL05SbTlMaQDQIS_DD`WeKg(bYzvp#&bins%5a#{>fmT01W6tr`1`Qb;miK!3XtqXFG1) zANTFKg0W$7DF03uno2RFx2_#6b`96PMSrMICs|IIVs3b8pgs+g*5zOGB<9iEujlN~^3`}^2Rxj!V^M}XEJ{%I<A3t;P4R092K^s$VrGKOvCUn@-9|mgK z<{NlKX~1JVBQT@=3h@#3nZ_U99vm)yH- zYgPTw(2o#vq?zn}L9P=)m1&qNU%>{HPtPbM9yA5=4#D)ibR9MrcEjXQ^Y^bX$ zgx1mEM;QXvXVF0dXpQ>e87###9_trIq+@K0v<*mCgY6)uR(}mdi9KFS&D(`m4~Kr7 zl%~9Wu8EmtS7WSJ}tx1VFhRe^23mEg2S(`}j%p2Tw)a-w+?YEoBCoEzF; zq|=Di$r1ZRm)}ZUpj@bvQvcS9NGM}X!vG-A2S#-3lk^=bd4Md0Cdl5yZe}q&+4{Lg zapV&zx+Yv9S${|SQxCxwI${#3+TX7Vv^#Z@D&zOinN2bCyi-$gvG7_^AQk_X2lVoo z3V34Q*3*rG5KX_0jKKs$;Ll0WRb8R$!S^+m^6T|VDL2KJJ_i|*VS43F3z{xbit<6v z+wtTLOLuXb)-*VJ?R6!4-5b;w7n&57xRn3^004nA2Y;>))u`pGmTV~>NFA8;MhjUA zfqsDl#u%Hs^)#EiC$pvCOxAs{`Lv(PYOR{fJ00AQd0RaVF01yBG41-1r0dluNYXAU?sT+;} diff --git a/xbot-et/wps-addon-build/xbot-et_1.0.0/README.md b/xbot-et/wps-addon-build/xbot-et_1.0.0/README.md new file mode 100644 index 0000000..bf03dc2 --- /dev/null +++ b/xbot-et/wps-addon-build/xbot-et_1.0.0/README.md @@ -0,0 +1 @@ +# WPS 表格自动化 diff --git a/xbot-et/wps-addon-build/xbot-et_1.0.0/images/about.svg b/xbot-et/wps-addon-build/xbot-et_1.0.0/images/about.svg new file mode 100644 index 0000000..82718c1 --- /dev/null +++ b/xbot-et/wps-addon-build/xbot-et_1.0.0/images/about.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/xbot-et/wps-addon-build/xbot-et_1.0.0/images/newFromTemp.svg b/xbot-et/wps-addon-build/xbot-et_1.0.0/images/newFromTemp.svg new file mode 100644 index 0000000..f6c70b3 --- /dev/null +++ b/xbot-et/wps-addon-build/xbot-et_1.0.0/images/newFromTemp.svg @@ -0,0 +1,22 @@ + + + + 从模版新建 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xbot-et/wps-addon-build/xbot-et_1.0.0/index.html b/xbot-et/wps-addon-build/xbot-et_1.0.0/index.html new file mode 100644 index 0000000..2efb298 --- /dev/null +++ b/xbot-et/wps-addon-build/xbot-et_1.0.0/index.html @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/xbot-et/wps-addon-build/xbot-et_1.0.0/js/ribbon.js b/xbot-et/wps-addon-build/xbot-et_1.0.0/js/ribbon.js new file mode 100644 index 0000000..cc40e95 --- /dev/null +++ b/xbot-et/wps-addon-build/xbot-et_1.0.0/js/ribbon.js @@ -0,0 +1,43 @@ + +//这个函数在整个wps加载项中是第一个执行的 +function OnAddinLoad(ribbonUI) { + if (typeof (window.Application.ribbonUI) != "object") { + window.Application.ribbonUI = ribbonUI + } + + if (typeof (window.Application.Enum) != "object") { // 如果没有内置枚举值 + window.Application.Enum = WPS_Enum + } + return true +} + + +function OnAction(control) { + const eleId = control.Id + switch (eleId) { + case "btnShowAbout": + { + alert("关于我们\n\n作者:Jianxin\n\n版本:1.0.0\n\n说明:自动化插件\n\n感谢使用!") + } + break; + case "contactAuthor": + { + wps.ShowDialog(GetUrlPath() + "/ui/author.html", "联系作者", 400 * window.devicePixelRatio, 400 * window.devicePixelRatio, false) + } + default: + break + } + return true +} + + +function GetImage(control) { + const eleId = control.Id + switch (eleId) { + case "btnShowAbout": + return "images/about.svg" + default: + ; + } + return "images/newFromTemp.svg" +} diff --git a/xbot-et/wps-addon-build/xbot-et_1.0.0/js/util.js b/xbot-et/wps-addon-build/xbot-et_1.0.0/js/util.js new file mode 100644 index 0000000..8c991a1 --- /dev/null +++ b/xbot-et/wps-addon-build/xbot-et_1.0.0/js/util.js @@ -0,0 +1,19 @@ +//在后续的wps版本中,wps的所有枚举值都会通过wps.Enum对象来自动支持,现阶段先人工定义 +var WPS_Enum = { + msoCTPDockPositionLeft: 0, + msoCTPDockPositionRight: 2 +} + +function GetUrlPath() { + let e = document.location.toString() + return -1 != (e = decodeURI(e)).indexOf("/") && (e = e.substring(0, e.lastIndexOf("/"))), e +} +/** + * 通过wps提供的接口执行一段脚本 + * @param {*} param 需要执行的脚本 + */ +function shellExecuteByOAAssist(param) { + if (wps != null) { + wps.OAAssist.ShellExecute(param) + } +} \ No newline at end of file diff --git a/xbot-et/wps-addon-build/xbot-et_1.0.0/js/xbot.js b/xbot-et/wps-addon-build/xbot-et_1.0.0/js/xbot.js new file mode 100644 index 0000000..1928235 --- /dev/null +++ b/xbot-et/wps-addon-build/xbot-et_1.0.0/js/xbot.js @@ -0,0 +1,64 @@ +let wpsInstance = null; + + +function InvokeFromXbot(param) { + // 1. 解析参数, 如果不是字符串, 则转换为字符串, 并用json解析, 解析失败直接retrun + if (typeof param !== 'string') { + param = JSON.stringify(param); + } + try { + param = JSON.parse(param); + } catch (e) { + return { msg: '参数解析失败', code: -1 }; + } + + // 2. 判断是否有method字段, 如果没有直接return + if (!param.method) { + return { msg: '参数错误', code: -2 }; + } + + // 3. 获取 method 字段对应的方法和 args 参数 + let method = param.method; + + let args = null; + + try { + args = JSON.parse(param.args); + } catch (e) { + args = {}; + } + + + console.log("method:", method); + console.log("args:", args); + // confsole.log("args", typeof args); + + // 4. 判断 method 是否为 inject, 如果是则执行注入方法, 其他走默认方法执行调用函数 + if (method === 'inject') { + let code = args.code; + console.log("start eval code"); + console.log(code); + console.log(new Function(code)()); + wpsInstance = new Function(code)(); // 执行并获取返回值 + console.log("success eval code"); + return { message: "inject ok", code: 0 } + } + + // 5. 判断是否有 wpsInstance, 如果没有直接return + if (!wpsInstance) { + return { msg: '未注入', code: -3 }; + } + + // 6. 判断 wpsInstance 是否有 method 方法, 如果没有直接return + if (!wpsInstance[method]) { + return { msg: '方法不存在', code: -4 }; + } + + // 7. 执行 wpsInstance 的 method 方法, 并返回结果 + try { + const result = wpsInstance[method](args ?? null); + return { msg: '执行成功', code: 0, data: result }; + } catch (e) { + return { msg: '执行失败', code: -5 }; + } +} diff --git a/xbot-et/wps-addon-build/xbot-et_1.0.0/main.js b/xbot-et/wps-addon-build/xbot-et_1.0.0/main.js new file mode 100644 index 0000000..fc183d6 --- /dev/null +++ b/xbot-et/wps-addon-build/xbot-et_1.0.0/main.js @@ -0,0 +1,4 @@ +//这个文件由index.html包含 +document.write(""); +document.write(""); +document.write(""); diff --git a/xbot-et/wps-addon-build/xbot-et_1.0.0/ribbon.xml b/xbot-et/wps-addon-build/xbot-et_1.0.0/ribbon.xml new file mode 100644 index 0000000..cdaa597 --- /dev/null +++ b/xbot-et/wps-addon-build/xbot-et_1.0.0/ribbon.xml @@ -0,0 +1,15 @@ + + + + + +