只需简单地编写小段py脚本,就可以借助Excel催化剂的平台作用,将写出的py脚本,嫁接到Excel的环境上使用,在Excel的广阔用户群体上带来更多的产出价值。也大大增加了将自己的python技能输出到普通用户可享用的层面。 按照本文的规范,可以自行在本地Excel催化剂环境上扩展python功能,若觉得自己所写的python脚本有足够的共性,有推广价值,可以加入Excel催化剂的python开发者社群,一起做大此领域。
以下的文字版内容,可能在后续的代码变动下会略有更改,大体上不变,要获取最新的信息,可私信笔者,加入Excel催化剂组建的python开发者社群,一起深入交流。
同步也录制了视频教程,地址为:https://www.bilibili.com/video/av87125312/,可在【阅读原文】上跳转到B站观看。
一、前端用户提供两个区域表选择,左为参数区域,右边为数据区域。
二、用户选择后的结果,催化剂将生成一个字典数据结构给python调用。
下图为用户的选择方式,用窗体来辅助选择,其中描述的字段,如果取自数据表,描述部分的约定是写帮忙文档时告诉用户这些日期、数量的参数的特征,*代表数据区域取数,是多的列表关系,这些都不需要python来处理,我插件层面处理好。
可能用户的参数匹配和我们py程序的不一致,
- 缺少一些必填项(需要报错返回提示用户)
- 多一些无用项如:参数名称,这个是标题行,可以忽略它
- 一些选填项用户没有输入,py程序要自己用默认值去补充或处理选填为空的其他逻辑。
三、收到插件传过来的参数,按py的程序需求,对传入的参数再加工处理,最终使用Return返回数据给插件。
在python脚本中,约定的几点规范需要遵守。
- 插件调用的python方法为run方法名
- run方法名只有一个参数是kwargs,参数名不能修改。
- 参数返回的数据类型是字典结构,已在common公共模块中写了方法
def return_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文件中,加入以下标识,测试好后再注释删除它。
代码语言:javascript复制def _debug_():
pass
- common公共模块的调用,对应的import 位置是python文件夹的位置,而不是和py脚本文件同目录
- py脚本文件夹和文件名的规范
因插件最终调用py文件时,将文件夹和文件名当作模块来调用,最终找到要调用的方法,所以文件夹、文件名,需遵循变量的命名规范,不能以数字开头,不能有【】之类的特殊符号等。
- 可以在自己生成的结果数据中插入一些个人宣传信息
如在html文件中,插入一些文字和二维码等,我在common模块上写了个方法,大家可以自己在py脚本上硬编码的方式写上也可以。
代码语言:javascript复制def replace_html_withAD(html_path,title,ad_file_path):
if os.path.exists(ad_file_path):
with open(ad_file_path,'r',encoding='utf-8') as ad:
ad_contents = ad.read()
with open(html_path, 'r', encoding='utf-8') as src_file:
html_contents = src_file.read()
html_contents = html_contents.replace('https://assets.pyecharts.org/assets/', '')
html_contents = html_contents.replace('<title>Awesome-pyecharts</title>', '<title>{0}</title>'.format(title))
html_contents = html_contents.replace('</body>', ad_contents '</body>')
with open(html_path, 'w', encoding='utf-8') as dst_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启动会较为漫长。