首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Excel催化剂与python交互原理剖析,py开发者按此规范可自行扩展功能

只需简单地编写小段py脚本,就可以借助Excel催化剂的平台作用,将写出的py脚本,嫁接到Excel的环境上使用,在Excel的广阔用户群体上带来更多的产出价值。也大大增加了将自己的python技能输出到普通用户可享用的层面。

按照本文的规范,可以自行在本地Excel催化剂环境上扩展python功能,若觉得自己所写的python脚本有足够的共性,有推广价值,可以加入Excel催化剂的python开发者社群,一起做大此领域。

以下的文字版内容,可能在后续的代码变动下会略有更改,大体上不变,要获取最新的信息,可私信笔者,加入Excel催化剂组建的python开发者社群,一起深入交流。

一、前端用户提供两个区域表选择,左为参数区域,右边为数据区域。

二、用户选择后的结果,催化剂将生成一个字典数据结构给python调用。

下图为用户的选择方式,用窗体来辅助选择,其中描述的字段,如果取自数据表,描述部分的约定是写帮忙文档时告诉用户这些日期、数量的参数的特征,*代表数据区域取数,是多的列表关系,这些都不需要python来处理,我插件层面处理好。

可能用户的参数匹配和我们py程序的不一致,

缺少一些必填项(需要报错返回提示用户)

多一些无用项如:参数名称,这个是标题行,可以忽略它

一些选填项用户没有输入,py程序要自己用默认值去补充或处理选填为空的其他逻辑。

三、收到插件传过来的参数,按py的程序需求,对传入的参数再加工处理,最终使用Return返回数据给插件。

在python脚本中,约定的几点规范需要遵守。

插件调用的python方法为run方法名

run方法名只有一个参数是kwargs,参数名不能修改。

参数返回的数据类型是字典结构,已在common公共模块中写了方法

defreturn_result(restype,contents):

return{'type':restype,'contents':contents}

此方法需传入两个参数,第1个参数是返回数据类型,字符为以下四种。

rng,对应的contents内容为:用pd的to_json(orient='split')方法返回最终字符串结果

msg,对应的contents内容为:返回一段给用户提醒的文本即可,最终会以弹窗的信息让用户阅读,长内容最好分多行表示。

html,对应的contents内容为:返回生成的html文件的全路径

img,对应的contents内容为:返回生成的图片文件的全路径

具体使用可参照现有的示例文件,安装好插件在配置文件里可找到。

common.py的文件,大家有什么好的通用方法可以抽象出来,不用重复输入,当然不是必须,可以不引用里面方法写自己的py脚本。

传入的kwargs参数是字典结构,比较好的数据处理方式是直接转成dataFrame数据类型。

四、注意事项

用户输入为空时传入的kwargs参数变化

如下图所示,用户界面输入为空,对接收到的kwargs参数影响。

需要在插件上调试时,可以加上调试方法体

因插件开启的python进展,会一直以ipython的交互方式存在,如果py脚本文件有修改,此时会有缓存作用,不会再次调用更改后的py文件内容。

若需要修改后的py文件立即生效,插件再次调用时可识别出来,可在py文件中,加入以下标识,测试好后再注释删除它。

def_debug_():

pass

common公共模块的调用,对应的import 位置是python文件夹的位置,而不是和py脚本文件同目录

py脚本文件夹和文件名的规范

因插件最终调用py文件时,将文件夹和文件名当作模块来调用,最终找到要调用的方法,所以文件夹、文件名,需遵循变量的命名规范,不能以数字开头,不能有【】之类的特殊符号等。

可以在自己生成的结果数据中插入一些个人宣传信息

如在html文件中,插入一些文字和二维码等,我在common模块上写了个方法,大家可以自己在py脚本上硬编码的方式写上也可以。

defreplace_html_withAD(html_path,title,ad_file_path):

ifos.path.exists(ad_file_path):

withopen(ad_file_path,'r',encoding='utf-8')asad:

ad_contents=ad.read()

withopen(html_path,'r',encoding='utf-8')assrc_file:

html_contents=src_file.read()

html_contents=html_contents.replace('https://assets.pyecharts.org/assets/','')

html_contents=html_contents.replace('Awesome-pyecharts',''.format(title))

html_contents=html_contents.replace('',ad_contents+'')

withopen(html_path,'w',encoding='utf-8')asdst_file:

dst_file.write(html_contents)

如果需要直接或间接调用matplotlib库来绘图的脚本,请建一个文件夹【单次执行】存放

因为插件开启python后,以ipython交互式的方式调用,只在首次调用时加载python会慢一些,后续再调调用时会很快。

但因为matplotlib作图的原理,在交互模式下,会弹出窗口,使程序一直会卡住不动,后续执行时,前端插件界面就会卡死没反应,请务必测试好,若存在调用matplotlib而让插件前端卡死的,记得需要放到【单次执行】文件夹里,插件识别这个关键字,执行完这个脚本就退出python程序,再执行下一个脚本任务时可以正常。

类似pandas_profiling这样的包,可能底层作图也是matplotlib,同样会有问题,seaborn就更不用说了。

传入py脚本中的kwargs参数,小心处理数据类型

在Excel界面上的数据类型经过.NET程序处理,去到python里使用时,可能会有差异,特别是数字、日期这类的信息。

可以使用插件的界面操作,在py文件中观察传入的数据情况,如下图:

py文件中,记得使用debug方法标识,让py文件修改后,插件可以再次加载,测试无误后可以注释或删除它。

在主方法run的任意位置,都可以用返回【msg】弹窗信息的方法,局部测试脚本的运行情况。

如下图直接测试kwargs参数的内容(记得先转成字符串类型才让其输出)。

如下图中,插件会以弹窗的形式响应输出结果,发现在参数区域里的数字类型,传到py里后,变成字符串格式,而数据区域中的不受影响,同时日期格式变为ISO的字符串日期格式。

才上数据类型对不上的原因已找到bug进行修复,但一个好的习惯是在测试脚本过程中,最好也多看下传入的kwargs参数的结构,提高代码出错排查效率。

强制退出python进程

在使用插件进行最后测试过程中,特别是之前测试已经没问题,将debug方法注释后,在插件调用过程中发现有问题,之前的作法只能是重新关闭Excel程序再打开Excel,很麻烦。

现在补充一个小功能,可以强制退出python进程,让py脚本文件的缓存记忆可以清空,再次启动某py脚本时,将重新先启动python进程,再读取py文件,保证新修改的内容可生效,而又不需要重启excel。

最佳的测试方式是写上debug方法体,每次重启python进程来测试,将失去了交互式python的优点,等待python启动会较为漫长。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200208A0E1GB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券