树袋熊|打破Excel与Python的隔阂,xlwings最佳实践( 三 )

vbe 是 编写 vba 代码的界面 。 通过快捷键 alt + F11 即可打开
因此 , Excel 公式执行时 , 会转而执行 Python 文件中的同名函数 。
理解这点非常重要 , 从中可以得知:

  • 如果 Python 中的函数名字或参数数量有增减 , 则需要重新点击"导入函数"按钮
  • 如果只是函数中的实现代码有变动 , 无须点击"导入函数"按钮
例如 , 修改 myproject.py 中的代码:
树袋熊|打破Excel与Python的隔阂,xlwings最佳实践
  • 我们希望返回结果的前10行
修改后 , 保存一下此 Python 文件 , 在 Excel 上无须点击"导入函数"按钮 , 只要公式有刷新(比如修改公式引用到的单元格的值) , 就能看到最新结果:
树袋熊|打破Excel与Python的隔阂,xlwings最佳实践
  • 只有10行结果
你可能会觉得每次修改都点一下导入按钮 , 万无一失 。
如果你是制作工具给别人使用的情况下 , 就需要知道代码变动后 , 哪些文件(Excel或Python文件)需要更新
进一步完善首先 , 我们希望返回结果不要把 DataFrame 的行索引输出:
树袋熊|打破Excel与Python的隔阂,xlwings最佳实践这可以通过装饰器的参数设置:
树袋熊|打破Excel与Python的隔阂,xlwings最佳实践
  • 行5:设置 ret 装饰器的参数 index 为 False 即可
  • 此外通过参数 header 也能控制是否输出表头
此次修改中 , 函数名字 , 参数数量没有变化 , 因此不需要点击"导入函数"按钮
你会发现即使数据文件就在项目文件夹中 , 使用相对路径是读取不到文件 。
但是 , 每次输入全路径太麻烦了 , 如果能输入相对路径就很好了 。
这问题由于 xlwings 在执行 vba 的方法时 , 会启动一个 Python 进程(只有首次运行的时候) , 然后加载 myproject.py 中的代码 。 但他没有设置启动目录 。
因此默认情况下启动目录是 Python.exe 所在目录 。
我们只需要在 myproject.py 中修改启动目录即可:
树袋熊|打破Excel与Python的隔阂,xlwings最佳实践现在可以支持相对路径:
树袋熊|打破Excel与Python的隔阂,xlwings最佳实践文件名字如果可以下拉选择就好了!
我们来看看如何实现
树袋熊|打破Excel与Python的隔阂,xlwings最佳实践充分利用 Excel 功能首先 , 我们需要一个能找出 myproject.py 文件所在目录的所有 Excel 文件 , 我们使用 Python 实现这功能(这不是 vba 擅长的):
树袋熊|打破Excel与Python的隔阂,xlwings最佳实践
  • 保存文件后 , 记得"导入函数"
在 Excel 文件 myproject.xlsm 中 , 创建一个新的工作表(示例中名字为 Sheet2) , 执行这个公式:
树袋熊|打破Excel与Python的隔阂,xlwings最佳实践到界面工作表 , 为 B1 单元格设置数据有效性:


推荐阅读